一般情况下,docker服务采用的都是docker官方的仓库,但是由于官方仓库服务器在国外,网速往往会比较查,所以很多人回踩用国内的镜像加速,具体可查看我的另外一篇博客docker国内镜像加速查看具体操作,这里我要讲的是如何搭建自己的私有docker仓库。
目前,由于docker服务使得应用的部署变得非常简单高效,使用docker部署应用已经变得越来越热门,通过docker hup下发应用的方式可以非常快的实现应用的部署和迭代升级,但是在真实的生产环境中,很多企业尤其是金融类银行类的企业往往是不允许生产环境直接连接外网的,所以搭建一个自己docker仓库显得非常有必要。
使用官方的docker-registry镜像搭建docker私有仓库
-
下载对应的镜像
1
2
3 1# docker pull registry
2
3
-
启动通过该镜像启动容器
1
2
3 1# docker run -d -p 5000:5000 --restart=always --name registry registry
2
3
1
2
3
4
5
6 1docker run -d -p 5000:5000 --restart=always -v /data/docker_registry:/var/lib/registry registry
2#参数解释:
3-v /Users/cilu/dockergit/private_registry:/var/lib/registry默认情况下,会将仓库存放于容器内的/var/lib/registry目录下,指定本地目录挂载到容器。
4-p 5000:5000 端口映射
5--restart=always1 在容器退出时总是重启容器,主要应用在生产环境
6
-
对本地的镜像打上标签并上传到仓库(这里的本地仓库相对与其他端就是远程仓库)
1
2
3
4
5
6
7
8
9
10
11
12 1# docker tag <image-name>[:<tag>] 127.0.0.1:5000/<path>/<image-name>:<tag>
2# docker push 127.0.0.1:5000/<path>/<image-name>:<tag>
3
4docker push 192.168.10.53/nginx:latest
5若有报错"Get https://192.168.10.53/v1/_ping: dial tcp 192.168.10.53:443: getsockopt: connection refused"
6则需要设置insecurt registry 192.168.10.53:5000
7
8或者
9
10docker tag nginx:latest 192.168.10.53/nginx:latest
11
12
-
在应用部署端配置/etc/docker/daemon.json文件
1
2
3
4
5
6 1{
2 "registry-mirrors": ["http://f1361db2.m.daocloud.io", "http://hub-mirror.c.163.com", "https://registry.docker-cn.com"],
3 "insecure-registries": ["remote-ip:remote-port"]
4}
5
6
-
重启docker
1
2
3 1# systemctl restart docker
2
3
-
从远程仓库拉取对应的image
1
2
3
4
5
6
7 1# docker pull <remote-ip>:<remote-port>/<path>/<image-name>[:<tag>]
2
3例子:
4
5docker pull 192.168.10.53/nginx:latest
6
7
-
查看拉取的docker镜像
1
2
3 1# docker image ls
2
3
-
删除本地的镜像
1
2 1docker rmi 192.168.10.53/nginx:latest
2
二、私有仓库高级配置
- 准备站点证书
-
新建一个文件夹,以下步骤均在该文件夹中进行。
1
2
3 1mkdir /home/test/ssl
2cd /home/test/ssl
3
- 如果你拥有一个域名,国内各大云服务商均提供免费的站点证书。你也可以使用 openssl 自行签发证书。这里假设我们将要搭建的私有仓库地址为 docker.domain.com ,下面我们介绍使用 openssl 自行签发 docker.domain.com 的站点 SSL 证书。
1)第一步创建 CA 私钥。
1
2 1openssl genrsa -out "root-ca.key" 4096
2
2) 第二步利用私钥创建 CA 根证书请求文件。
1
2
3 1openssl req -new -key "root-ca.key" -out "root-ca.csr" -sha256
2根据输出提示填写
3
3) 第三步配置 CA 根证书,新建 root-ca.cnf 。
1
2
3
4
5
6 1vim root-ca.cnf
2[root_ca]
3basicConstraints = critical,CA:TRUE,pathlen:1
4keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
5subjectKeyIdentifier=hash
6
4) 第四步签发根证书。
1
2
3
4
5 1openssl x509 -req -days 3650 -in "root-ca.csr" \
2 -signkey "root-ca.key" -sha256 -out "root-ca.crt" \
3 -extfile "root-ca.cnf" -extensions \
4 root_ca
5
5) 第五步生成站点 SSL 私钥。
1
2 1openssl genrsa -out "docker.domain.com.key" 4096
2
6) 第六步使用私钥生成证书请求文件。
1
2
3 1openssl req -new -key "docker.domain.com.key" -out "site.csr" -sha256
2根据输出提示填写
3
7) 第七步配置证书,新建 site.cnf 文件。
1
2
3
4
5
6
7
8
9 1vim site.cnf
2[server]
3authorityKeyIdentifier=keyid,issuer
4basicConstraints = critical,CA:FALSE
5extendedKeyUsage=serverAuth
6keyUsage = critical, digitalSignature, keyEncipherment
7subjectAltName = DNS:docker.domain.com, IP:127.0.0.1
8subjectKeyIdentifier=hash
9
8)第八步签署站点 SSL 证书。
1
2
3
4 1openssl x509 -req -days 750 -in "site.csr" -sha256 \
2 -CA "root-ca.crt" -CAkey "root-ca.key" -CAcreateserial \
3 -out "docker.domain.com.crt" -extfile "site.cnf" -extensions server
4
- 这样已经拥有了 docker.domain.com 的网站 SSL 私钥 docker.domain.com.key 和 SSL 证书 docker.domain.com.crt 及 CA 根证书 root-ca.crt 。
1)新建 ssl 文件夹并将 这三个 文件移入,删除其他文件。
1
2
3
4
5 1mkdir -p /etc/docker/registry/ssl
2cd /home/test/ssl/
3mv docker.domain.com.key docker.domain.com.crt root-ca.crt /etc/docker/registry/ssl/
4rm -rf *
5
2. 配置私有仓库
-
私有仓库默认的配置文件位于 /etc/docker/registry/config.yml ,我们先在本地编辑 config.yml ,之后挂载到容器中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 1vim /etc/docker/registry/config.yml
2version: 0.1
3log:
4 accesslog:
5 disabled: true
6 level: debug
7 formatter: text
8 fields:
9 service: registry
10 environment: staging
11storage:
12 delete:
13 enabled: true
14 cache:
15 blobdescriptor: inmemory
16 filesystem:
17 rootdirectory: /var/lib/registry
18auth:
19 htpasswd:
20 realm: basic-realm
21 path: /etc/docker/registry/auth/nginx.htpasswd
22http:
23 addr: :443
24 host: https://docker.domain.com
25 headers:
26 X-Content-Type-Options: [nosniff]
27 http2:
28 disabled: false
29 tls:
30 certificate: /etc/docker/registry/ssl/docker.domain.com.crt
31 key: /etc/docker/registry/ssl/docker.domain.com.key
32health:
33 storagedriver:
34 enabled: true
35 interval: 10s
36threshold: 3
37
注意:如果不是用443端口,要改成一下配置
1
2
3
4
5
6 1...
2http:
3 addr: :443
4 host: https://docker.domain.com:xxxx
5...
6
否则会push 一直在retry 。。。。
3. 生成 http 认证文件
1
2
3
4
5
6
7
8 1mkdir /etc/docker/registry/auth
2cd /etc/docker/registry
3docker run --rm \
4 --entrypoint htpasswd \
5 httpd:alpine \
6 -Bbn username password > auth/nginx.htpasswd
7#将上面的username password替换为你自己的用户名和密码。
8
4. 编辑 docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13 1vim docker-compose.yml
2version: '3'
3services:
4 registry:
5 image: registry
6 ports:
7 - "443:443"
8 volumes:
9 - ./:/etc/docker/registry
10 - registry-data:/var/lib/registry
11volumes:
12 registry-data:
13
5. 修改 hosts
1
2
3
4 1编辑 /etc/hosts
2vim /etc/hosts
3127.0.0.1 docker.domain.com
4
- 启动
- 这里需要提前装好compose命令,安装详情请参考
https://www.daimajiaoliu.com/series/docker/4761c16c190040c
1
2
3
4 1安装成功之后启动命令:
2docker-compose up -d
3这样我们就搭建好了一个具有权限认证、TLS 的私有仓库,接下来我们测试其功能是否正常。
4
- 测试私有仓库功能
-
由于自行签发的 CA 根证书不被系统信任,所以我们需要将 CA 根证书 ssl/root-ca.crt 移入 /etc/docker/certs.d/docker.domain.com 文件夹中。
1
2
3
4
5
6
7
8
9
10
11 1mkdir -p /etc/docker/certs.d/docker.domain.com
2cp ssl/root-ca.crt /etc/docker/certs.d/docker.domain.com/ca.crt
3
4如果不是用443端口目录名要加端口,否则会出现以下错误:
5
6The error return is: x509: certificate signed by unknown authority.
7
8mkdir -p /etc/docker/certs.d/docker.domain.com:port
9cp ssl/root-ca.crt /etc/docker/certs.d/docker.domain.com:port/ca.crt
10
11
-
登录到私有仓库
1
2 1docker login docker.domain.com
2
-
尝试推送、拉取镜像
1
2
3
4
5
6 1docker pull nginx
2docker tag nginx docker.domain.com/username/nginx
3docker push docker.domain.com/username/nginx
4docker rmi docker.domain.com/username/nginx
5docker pull docker.domain.com/username/nginx
6
-
如果我们退出登录,尝试推送镜像。
1
2
3
4
5 1docker logout docker.domain.com
2docker push docker.domain.com/username/nginx
3no basic auth credentials
4#发现会提示没有登录,不能将镜像推送到私有仓库中。
5
查看私有仓库
1
2 1curl -X GET -ik --user username:password https://docker.domain.com:7443/v2/_catalog
2
使用harbor搭建私有仓库
安装harbor前需要安装docker-compose,安装方式很简单,直接下载对应的文件放到/usr/local/bin目录下并赋予执行权限即可。
1
2
3
4 1# curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2# chmod +x /usr/local/bin/docker-compose
3
4
或者可以直接去官网或者在CSDN资源下载对应的compose文件,并将其上传到/usr/local/bin目录下,并使用chmod +x /usr/local/bin/docker-compose赋予其可执行权限即可。
正式安装harbor之前需要将selinux设置为permissive或者disabled,具体步骤可参考一下链接:
CentOS7关闭selinux
在githup或者CSDN资源池下载对应的harbor安装包harbor-offline-installer-v1.8.2.tgz,使用tar -zxvf harbor-offline-installer-v1.8.2.tgz解压,进入harbor目录,并且编辑配置文件,将harbor.yml文件终端的hostname属性设置为本地的ip或者域名,
1
2
3 1hostname: www.example.com
2
3
执行安装程序:
1
2
3 1# ./install
2
3
添加防火墙策略开通80或者443端口
1
2
3 1# firewall-cmd --add-port=80/tcp --permanent
2
3
将本地镜像上传到远程harbor服务器
打tag
1
2
3 1# docker tag <image-name>:<tag> <remote-ip|remote-host>/<path>/<image-name>:<tag>
2
3
登录远程仓库
1
2
3
4
5 1# docker login <remote-ip|remote-port>
2# 输入对应的用户名和密码(默认的harbor用户名为"admin",密码为"Harbor12345"
3...
4
5
上传镜像到远程仓库
1
2
3 1# dcoker push <remote-ip| remote-host>/<path>/<image-name>:<tag>
2
3
使用浏览器登录仓库所在服务器查看镜像是否上传成功
从远程仓库下载对应的镜像,若该仓库为http协议不是https,需要将该仓库ip或域名添加到daemon.json文件的insecure-registries属性中
1
2
3
4
5
6 1{
2 "registry-mirrors": ["http://f1361db2.m.daocloud.io", "http://hub-mirror.c.163.com", "https://registry.docker-cn.com"],
3 "insecure-registries": ["remote-ip | remote-host"]
4}
5
6
登录远程仓库
1
2
3 1# docker login <remote-ip | remote-host >
2
3
拉取远程镜像
1
2
3 1# docker pull <path>/<image-name>:<tag>
2
3