Docker仓库是镜像存储、分发、部署的关键,制作好应用程序镜像后上传到仓库,使用Docker daemon从仓库拉取后运行,我们可以使用官方共有仓库docker hub或者搭建私有仓库

  1. Docker Hub包含众多镜像,无需登录就可以搜索和使用
  2. 注册Docker Hub账户后可以上传和分享我们创建的镜像(https://hub.docker.com/)
  3. 支持用户创建私有仓库

Docker Hub

查找Ubuntu image

  • OFFICIAL:官方维护的镜像,提供最基础的OS、编程语言、数据存储等一系列镜像,类似于PAAS。安全更新及时,并且有详细的文档、最佳实践、通用的设计方式。可以通过dockerfile进行学习
  • AUTOMATED:可以关联github等源码仓库,进行自动构建并上传到Docker Hub

命令

# 查找镜像
docker search <NAME>
# 拉取镜像
docker pull <NAME>
# 推送镜像到仓库,通过添加不同的tag可以推送多个镜像到一个仓库
# 推送前需要登录docker hub
docker login
docker push <hub-user>/<repo-name>:<tag>

搭建私有仓库

如果想要构建一个基于Docker的PaaS平台,使用Docker Hub大多时候都满足要求,原因如下:

  • 很多公司关键IDC无法访问外网,并且对于部署和分发而言网速带宽是较大的瓶颈
  • 很多应用放到公共仓库是不安全的
  • 可以将镜像存储和分发集成到内部的开发工作流中

registry是docker官方提供的开源组件,用于存储和分发镜像,无状态并且可扩缩容

registry

# 启动registry
docker run -d \
-e REGISTRY_HTTP_ADDR=0.0.0.0:5500 \
-p 6000:5500 \
--name registry-galen \
-v /mnt/docker-registry:/var/lib/registry \
--restart always \
registry:2

本地使用

docker pull ubuntu:16.04
# 为ubuntu image附加tag,
docker tag ubuntu:16.04 localhost:6000/galen-ubuntu
# push image 到跑在 localhost:6000的registry
docker push localhost:6000/galen-ubuntu
# 删除本地镜像
docker image rm ubuntu:16.04
docker image rm localhost:6000/galen-ubuntu
# 从registry中下拉
docker pull localhost:6000/galen-ubuntu

上传其他主机的image到仓库(115主机->129主机)

docker pull ubuntu:16.04
docker tag ubuntu:16.04 172.17.73.129:6000/galen-115-ubuntu
# 在要上传镜像的客户端(115)/etc/docker/daemon.json目录下,添加insecure-registries
{
"registry-mirror": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
],
"insecure-registries": [
"172.17.73.129:6000"
]
}
docker push 172.17.73.129:6000/galen-115-ubuntu
# 查询registry中的仓库
curl -X GET http://172.17.73.129:6000/v2/_catalog
{"repositories":["galen-115-ubuntu","galen-ubuntu"]}
  • 以上部署registry的方法不安全,没有认证功能,任何可以访问到地址的客户端都可以上传镜像

使用nginx做认证

删除之前registry容器,重新启动

# 停止并删除
docker container rm -f registry-galen
# 启动registry
docker run -d \
-p 6000:5000 \
--name registry-galen \
-v /mnt/docker-registry:/var/lib/registry \
--restart always \
registry:2

vim /etc/nginx/conf.d/registry.conf

upstream registry-galen {
server 127.0.0.1:6000;
}
server {
listen 443 ssl;
server_name www.codemachine.in;
# 开启ssl
ssl on;
# 公钥证书
ssl_certificate /etc/ssl/certs/docker-registry.crt;
# 私钥
ssl_certificate_key /etc/ssl/private/docker-registry.key;
# 关闭对较大image请求的限制, HTTP 413
client_max_body_size 0;
# 避免HTTP 411
chunked_transfer_encoding on;
location /v2/ {
auth_basic "Need to login";
auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd;
include docker-registry.conf;
} location /_ping/ {
auth_basic off;
include docker-registry.conf;
} location /v2/_ping {
auth_basic off;
include docker-registry.conf;
}
}

vim /etc/nginx/docker-registry.conf

proxy_pass                          http://registry-galen;
proxy_set_header Host $http_host; # required for docker client's sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 900;

利用htpasswd工具创建用户认证的用户名和密码,将密码加密后生成到文件中

[root@localhost nginx]# htpasswd -bc /etc/nginx/conf.d/nginx.htpasswd
galendocker p@ssw0rd
Adding password for user galendocker

创建私有SSL证书

go 1.15 版本开始废弃 CommonName需要使用SAN证书

使用OpenSSL创建私有CA,CA包含公钥和私钥,公钥用于他人验证证书有效性,私钥用于给其他证书签名

使用openssl生成带有SAN扩展的证书请求文件,编辑/etc/pki/tls/openssl.cnf

req_extetions = v3_req

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names [ alt_names ]
DNS.1 = www.codemachine.in
DNS.2 = www.galen.codemachine.com

生成CA

mkdir /etc/pki/CA/ && cd /etc/pki/CA/ && mkdir certs && mkdir newcerts && touch index.txt
# 指定第一个颁发证书的序列号
echo 01 > serial
# 生成CA私钥文件,输入密码
openssl genrsa -des3 -out ca-key.pem 2048
# 生成CA自签证书,指明私钥文件,证书保存路径,有效期限等
openssl req -new -x509 -days 365 -key private/ca-key.pem -out private/ca-cert.pem
>
Enter pass phrase for ca-key.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Jiangsu
Locality Name (eg, city) [Default City]:Nanjing
Organization Name (eg, company) [Default Company Ltd]:bigtera
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:codemachine
Email Address []:937013596@qq.com

CA签署具有SAN(Subject Alt Name)扩展的服务器证书

# 生成服务器私钥文件
openssl genrsa -des3 -out server-key.pem 2048
# 生成服务器证书签署请求文件,默认国家,省,公司名称三项必须和CA一致
openssl req -new -key server-key.pem -out server.csr -extensions v3_req
>
Enter pass phrase for server-key.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Jiangsu
Locality Name (eg, city) [Default City]:Nanjing
Organization Name (eg, company) [Default Company Ltd]:bigtera
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:codemachine
Email Address []:937013596@qq.com Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []: # 签发证书
openssl ca -in server.csr -keyfile ca-key.pem -cert ca-crt.pem -extensions v3_req -out server.crt
>
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for ca-key.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Mar 11 09:15:27 2022 GMT
Not After : Mar 11 09:15:27 2023 GMT
Subject:
countryName = CN
stateOrProvinceName = Jiangsu
organizationName = bigtera
commonName = codemachine
emailAddress = 937013596@qq.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Non Repudiation, Key Encipherment
X509v3 Subject Alternative Name:
DNS:www.codemachine.in, DNS:www.galen.codemachine.com
Certificate is to be certified until Mar 11 09:15:27 2023 GMT (365 days)
Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
# 删除server-key中的pass phrase
openssl rsa -in server-key.pem -out server-key.pem
# 安装server-key和server.crt到我们nginx配置开启ssl的目录下
cp server.crt /etc/ssl/certs/docker-registry.crt
mkdir /etc/ssl/private
cp server-key.pem /etc/ssl/private/docker-registry.key

开启nginx

systemctl start nginx

客户端使用

实验中没有配置DNS server,所以需要在hosts文件中添加www.codemachine.in与主机IP地址的映射:172.17.73.129 www.codemachine.in

  • windows: C:\Windows\System32\drivers\etc\hosts
  • linux:/etc/hosts

docker客户端

为了Docker能够正常地访问Nginx,发送ca证书到客户端,重启docker与registry容器

update-ca-trust force-enable
scp ca-crt.pem root@172.17.73.115:/etc/pki/ca-trust/source/anchors/ca-cert.crt
update-ca-trust extract
# 修改tag
docker tag busybox:latest www.codemachine.in/busybox:latest
# 未登录推送
docker push www.codemachine.in/centos:galen
>
Using default tag: latest
The push refers to repository [www.codemachine.in/busybox]
797ac4999b67: Preparing
no basic auth credentials
# 登录
docker login -u galendocker -p p@ssw0rd www.codemachine.in
# 再次推送
>
Using default tag: latest
The push refers to repository [www.codemachine.in/busybox]
797ac4999b67: Pushed
latest: digest: sha256:14d4f50961544fdb669075c442509f194bdc4c0e344bde06e35dbd55af842a38 size: 527

使用windows浏览器

使用浏览器打开 https://www.codemachine.in/v2/_catalog

docker学习笔记(2)- 仓库的更多相关文章

  1. Docker学习笔记五 仓库

    本文地址:https://www.cnblogs.com/veinyin/p/10452224.html  以下均为命令行下操作 登录登出 docker login // 登录 docker logo ...

  2. docker学习笔记1 -- 安装和配置

    技术资料 docker中文官网:http://www.docker.org.cn/ 中文入门课程:http://www.docker.org.cn/book/docker.html docker学习笔 ...

  3. Docker学习笔记总结

    Docker学习笔记 https://yeasy.gitbooks.io/docker_practice/content/   一 环境搭建 Ubuntu安装 .添加软件源的GPG密钥 curl -f ...

  4. Docker:学习笔记(1)——基础概念

    Docker:学习笔记(1)——基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...

  5. Docker学习笔记 — Docker私有仓库搭建

    Docker学习笔记 — Docker私有仓库搭建   目录(?)[-] 环境准备 搭建私有仓库 测试 管理仓库中的镜像 查询 删除 Registry V2   和Mavan的管理一样,Dockers ...

  6. Docker 学习笔记一

    Docker 学习笔记一 1.Docker是什么?         Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源.让开发者打包他们的应用以及依赖包到一 ...

  7. Docker学习笔记之-在CentOS中安装Docker

    上一节演示了如何 通过Xshell连接CentOS服务,链接:Docker学习笔记之-通过Xshell连接 CentOS服务 本节将演示 如何在CentOS中安装 Docker 第一步:更新系统包到最 ...

  8. docker学习笔记(3)- 镜像

    简介 在docker学习笔记(1)- 架构概述一节中可以看到镜像是docker三大组件之一,可以将Docker镜像类比为虚拟机的模版. 镜像由多个层组成,每层叠加之后从外部看就像一个独立的对象,镜像的 ...

  9. Docker学习笔记 — 配置国内免费registry mirror

    Docker学习笔记 — 配置国内免费registry mirror Docker学习笔记 — 配置国内免费registry mirror

  10. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境

    Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...

随机推荐

  1. Redis 中如何保证数据的不丢失,Redis 中的持久化是如何进行

    Redis 中数据的持久化 前言 AOF 持久化 什么是 AOF 持久化 为什么要后记录日志呢 AOF 的潜在风险 AOF 文件的写入和同步 AOF 文件重写机制 AOF 的数据还原 RDB 持久化 ...

  2. LCT 入门

    这是一份 \(\rm LCT\) 入门总结. 关于 \(\rm LCT\) 的复杂度这里不会提及,只会记录 \(\rm LCT\) 的基本操作和经典例题,但神奇的 \(\rm LCT\) 虽然常数巨大 ...

  3. ubuntu 终端乱码

    转载请注明来源:https://www.cnblogs.com/hookjc/ 解决方法: 一. Ubuntu默认的中文字符编码 Ubuntu默认的中文字符编码为zh_CN.UTF-8, 这个可以在 ...

  4. PHP中常见的数字掐头去尾操作方法

    四舍五入round round( float $val[, int $precision = 0[, int $mode = PHP_ROUND_HALF_UP]] ) : float 对浮点数进行四 ...

  5. Collections与Arrays

    集合框架中的工具类:特点:该工具类中的方法都是静态的. Collections:常见方法: 1, 对list进行二分查找: 前提该集合一定要有序. int binarySearch(list,key) ...

  6. ListIterator特有的方法

    import java.util.ArrayList; import java.util.List; import java.util.ListIterator; /* 迭代 listIterator ...

  7. rabbitmq集群实现

    官方文档 一.环境准备 1.1 IP地址规划 1.2 配置主机域名解析 ##每个节点修改主机名 # hostnamectl set-hostname mq1.example.local # hostn ...

  8. Ubuntu18修改/迁移mysql5.7数据存放路径

    1.停止mysql服务 sudo service mysql stop 2.修改mysql配置文件,一般是 /etc/mysql/my.cnf,或者/etc/mysql/mysql.conf.d/my ...

  9. 利用Tensorboard可视化模型、数据和训练过程

    在60分钟闪电战中,我们像你展示了如何加载数据,通过为我们定义的nn.Module的子类的model提供数据,在训练集上训练模型,在测试集上测试模型.为了了解发生了什么,我们在模型训练时打印了一些统计 ...

  10. Linux基础:初识shell之系统命令基础

    一 shell介绍 shell Shell 中文意思贝壳,寓意类似内核的壳.Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务,简而言之就是只要能够操作应用 ...