在使用Docker service create创建容器时,Docker首先默认从Docker Hub官方去下载镜像,这很不方便,很多时候我们的镜像都是使用Dockerfile自定义私有镜像,不对外公开,而且为了安全期间docker可能在内外环境下运行,所以我们有必要搭建一套docker本地私有镜像仓库,以供整个内外集群环境使用。
下面我们使用docker官方提供的registry镜像搭建私有仓库
一、搭建非https访问的私有镜像仓库
#私有镜像仓库服务器ip和对应域名,集群内所有服务器都提前做好解析
vi /etc/hosts #添加以下解析
192.168.21.8 hub.osyunwei.com
:wq! #保存退出
#下载镜像
docker pull registry:latest
#创建镜像挂载目录
mkdir -p /docker/data/registry
#创建容器
docker run -d -p 5000:5000 --name registry --restart always -v /docker/data/registry:/var/lib/registry registry:latest
参数说明:
-p 5000:5000 #端口映射,前面是宿主机:后面是容器内
--name registry #容器名称
--restart always #宿主机重启后容器自启动
-v /docker/data/registry:/var/lib/registry #目录映射,容器被删除后仓库内的镜像不会丢失,默认情况下仓库在容器内的/var/lib/registry目录下
registry:lates #使用的镜像名称
#查看启动的容器
docker ps -a
#默认Docker只支持https的地址,为了使用http协议的地址,集群内所有的服务器需要把私有仓库地址添加到daemon.json文件中
#在daemon.json文件中添加私有镜像仓库地址,注意要用逗号连接
cp /etc/docker/daemon.json /etc/docker/daemon.json-bak
vi /etc/docker/daemon.json
{
"insecure-registries": ["hub.osyunwei.com:5000"],
"registry-mirrors": ["https://t1fyrekt.mirror.aliyuncs.com","https://hub-mirror.c.163.com","https://mirror.baidubce.com/"]
}
:wq! #保存退出
#重启docker服务
systemctl restart docker.service
#如果不对私有仓库命名的话,docker默认访问的是官方仓库docker hub
#私有仓库镜像的命名规则:宿主机ip地址或域名:端口号/镜像名:版本
#修改镜像标签
docker tag nginx:1.20.1 hub.osyunwei.com:5000/nginx:1.20.1
docker tag php-fpm:8.0.11 hub.osyunwei.com:5000/php-fpm:8.0.11
docker tag mysql:v8.0.26 hub.osyunwei.com:5000/mysql:v8.0.26
#上传镜像
docker push hub.osyunwei.com:5000/nginx:1.20.1
docker push hub.osyunwei.com:5000/php-fpm:8.0.11
docker push hub.osyunwei.com:5000/mysql:v8.0.26
#列出私有仓库的所有镜像
curl -X GET http://hub.osyunwei.com:5000/v2/_catalog
#集群内其他服务器下载镜像
docker pull hub.osyunwei.com:5000/nginx:1.20.1
docker pull hub.osyunwei.com:5000/php-fpm:8.0.11
docker pull hub.osyunwei.com:5000/mysql:v8.0.26
二、搭建https访问的私有镜像仓库
#私有镜像仓库服务器ip和对应域名,集群内所有服务器都提前做好解析
1、创建相关目录
vi /etc/hosts #添加以下解析
192.168.21.8 hub.osyunwei.com
:wq! #保存退出
#下载镜像
docker pull registry:latest
#创建镜像挂载目录
mkdir -p /docker/data/registry
#创建证书存放文件夹
mkdir -p /docker/data/registry/certs
#创建存储鉴权密码文件目录
mkdir -p /docker/data/registry/auth
2、给域名hub.osyunwei.com签发证书,我们使用openssl工具
#服务器要先安装好openssl
yum install -y openssl openssl-devel
#生成自签名证书文件
openssl req -newkey rsa:2048 -nodes -sha256 -keyout /docker/data/registry/certs/hub.osyunwei.com.key -x509 -days 3650 -out /docker/data/registry/certs/hub.osyunwei.com.crt -subj "/C=CN/ST=Shannxi /L=Xian/O=osyunwei/OU=osyunwei/CN=hub.osyunwei.com/emailAddress=vip@osyunwei.com"
参数说明:
openssl req:创建证书签名请求等功能
-newkey:创建CSR证书签名文件和RSA私钥文件
rsa:2048:指定创建的RSA私钥长度为2048
-nodes:对私钥不进行加密
-sha256:使用SHA256算法
-keyout:创建的私钥文件名称及位置
-x509:自签发证书格式
-days:证书有效期
-out:指定CSR输出文件名称及位置
3、创建访问私有镜像仓库的用户和密码,我们使用htpasswd工具
#htpasswd是apache http的基本认证文件,使用htpasswd命令可以生成用户及密码文件
#要先安装http
yum install -y httpd
#创建用户root和密码123456
htpasswd -Bbn root 123456 > /docker/data/registry/auth/htpasswd
4、创建私有仓库容器,我们使用Docker-Compose工具
#编写yaml文件
vi /docker/data/registry/registry.yaml
version: '3'
networks:
mycust-bridge:
external: true
services:
registry:
restart: always
image: registry:latest
ports:
- 443:443
environment:
REGISTRY_HTTP_ADDR: 0.0.0.0:443
REGISTRY_HTTP_TLS_CERTIFICATE: /certs/hub.osyunwei.com.crt
REGISTRY_HTTP_TLS_KEY: /certs/hub.osyunwei.com.key
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
volumes:
- /docker/data/registry:/var/lib/registry
- /docker/data/registry/certs:/certs
- /docker/data/registry/auth:/auth
:wq! #保存退出
#一定要注意yaml文件格式,前后缩进、空格
#创建容器
cd /docker/data/registry/
docker-compose -f registry.yaml up -d
5、配置https访问
#自行签发的证书默认不被系统信任,我们需要设置让Docker信任该证书
#集群内的所有服务器都需要做如下设置
#创建文件夹,注意后面的端口要加上
cd /etc/docker
mkdir -p /etc/docker/certs.d/hub.osyunwei.com:443
#在镜像仓库服务器拷贝hub.osyunwei.com.crt证书文件
[root@master01 docker]# cat /docker/data/registry/certs/hub.osyunwei.com.crt
-----BEGIN CERTIFICATE-----
MIID9zCCAt+gAwIBAgIJAIoc1SqSbXpRMA0GCSqGSIb3DQEBCwUAMIGRMQswCQYD
VQQGEwJDTjERMA8GA1UECAwIU2hhbm54aSAxDTALBgNVBAcMBFhpYW4xETAPBgNV
BAoMCG9zeXVud2VpMREwDwYDVQQLDAhvc3l1bndlaTEZMBcGA1UEAwwQaHViLm9z
eXVud2VpLmNvbTEfMB0GCSqGSIb3DQEJARYQdmlwQG9zeXVud2VpLmNvbTAeFw0y
MTEwMjcxMzUwMjdaFw0zMTEwMjUxMzUwMjdaMIGRMQswCQYDVQQGEwJDTjERMA8G
A1UECAwIU2hhbm54aSAxDTALBgNVBAcMBFhpYW4xETAPBgNVBAoMCG9zeXVud2Vp
MREwDwYDVQQLDAhvc3l1bndlaTEZMBcGA1UEAwwQaHViLm9zeXVud2VpLmNvbTEf
MB0GCSqGSIb3DQEJARYQdmlwQG9zeXVud2VpLmNvbTCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBAJfnaUUTWAC0vLHOuqFOwPLouY5Qh7vk9IZ2m83g7dEY
Y6jyHefTfHa5XXY5jWnIYwlasiZW4+9EurispltNIzpsUDjij6tPWhPRLJ7/eRDU
R6uqN89UM3RDqATY8eHCzLzi04eq6XP5aqq18VxQxJnJeWqzXVgH6BG9f7zHFAli
hdeAKzJQke/lQAc09LZA8VdDcIlvUwemdAqq7HsJKSMt3bQEXUGtaI3f/ljTY6Gf
VM96Rc9Znivus7Ht7tj1Ki/9W+pn3DQQAArad0x2b6Etx9apHMSXSjeigT4PKELy
q790QtEqtfACj5bjK9vKvkVTawlDf0JpweBtk/K0yTsCAwEAAaNQME4wHQYDVR0O
BBYEFJDkofGjHYIVNQQUtix1G4vClakXMB8GA1UdIwQYMBaAFJDkofGjHYIVNQQU
tix1G4vClakXMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAGaX5EnU
yZk/tKSSfHg/aI+ySGS6pfbMcjdlI03kARPbKOKu0cF/k6X8r43v5A1Nn5lUilLm
ppO/BDFk7OTBvmSWHwoUvF35gv1EWCcVVVjF6ylI8w1dfuRFjsiyX/eWoELdk0+g
o5yUoMYFsY7zdFym1IYX4US8GW6knqae0Hp11FCZMz1tZRzGJw50sVlV9+K/iZVW
BgX37vBE0u0Io7T4ma8N9a2cxAmjhaSJ0qwT6wdU18q1YmZmFfbtnJHYQ8NjiGTI
uA617M2WYthASVTvT6Ivr5L6dWOl8d+RCiPY3C154sKg+fK/DG/NkeiaIdXS7BxQ
g9Q57gFyLG+HmLI=
-----END CERTIFICATE-----
#把hub.osyunwei.com.crt文件复制到所有服务器/etc/docker/certs.d/hub.osyunwei.com:443/目录下,重命名为ca.crt
6、登录私有镜像仓库
docker login hub.osyunwei.com:443
#输入用户名root密码123456,出现Login Succeeded说明登录成功
7、集群内服务器上传下载镜像
首先要登录到私有仓库
docker login hub.osyunwei.com:443
#修改本地镜像标签
docker tag nginx:1.20.1 hub.osyunwei.com:443/nginx:1.20.1
docker tag php-fpm:8.0.11 hub.osyunwei.com:443/php-fpm:8.0.11
docker tag mysql:v8.0.26 hub.osyunwei.com:443/mysql:v8.0.26
#上传镜像
docker push hub.osyunwei.com:443/nginx:1.20.1
docker push hub.osyunwei.com:443/php-fpm:8.0.11
docker push hub.osyunwei.com:443/mysql:v8.0.26
#查看镜像
打开https://hub.osyunwei.com/v2/_catalog地址,输入用户名密码可以看到镜像列表
{"repositories":["mysql","nginx","php-fpm"]}
#集群内其他服务器下载镜像
docker pull hub.osyunwei.com:443/nginx:1.20.1
docker pull hub.osyunwei.com:443/php-fpm:8.0.11
docker pull hub.osyunwei.com:443/mysql:v8.0.26
注意:
在有权限验证的Docker私有仓库,先要登录到私有仓库,使用docker service创建容器还需要指定--with-registry-auth参数,否则无法创建容器
1、登录私有仓库docker login hub.osyunwei.com:443
2、创建容器
docker service create \
--with-registry-auth \
--name nginx \
hub.osyunwei.com:443/nginx:1.20.1
--name nginx #nginx是创建的容器名称
至此,搭建Docker本地私有镜像仓库教程完成