1 安装Docker CE
1.1 卸载旧版本
旧版本的Docker被称为docker
或docker-engine
,如果系统上已经安装了旧版本,可以执行如下命令卸载:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
It’s OK if yum
reports that none of these packages are installed.
/var/lib/docker/
目录下包含了镜像、容器、数据卷以及网络配置,在卸载旧版本时均会被清除。Docker CE软件包现在以docker-ce
来命名。
1.2 从仓库安装
在线安装之前,你需要配置Docker仓库源,然后从该仓库源安装Docker CE。
1.2.1 配置YUM仓库
-
安装依赖软件包。
yum-utils
软件包包含了yum-config-manager
工具,devicemapper
存储驱动依赖于device-mapper-persistent-data
和lvm2
软件包:yum install -y yum-utils device-mapper-persistent-data lvm2
-
使用如下命令配置stable版本的软件仓库:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
如果你需要从edge或者test版本的软件仓库安装软件包,也会需要stable的软件仓库:
-
可选:启用edge和test仓库。这两个仓库均包含在上面获取的
docker.repo
文件中,但是默认处于禁用状态。执行如下命令启用:yum-config-manager --enable docker-ce-edge yum-config-manager --enable docker-ce-test
你也可以使用
yum-config-manager
命令禁用edge或test仓库,执行时加上--disable
参数即可。使用--enable
参数重新启用。下面的命令演示了如何禁用edge仓库:yum-config-manager --disable docker-ce-edge
Note: 从Docker 17.06开始,stabe版本的Docker软件包,也可以在edge和test仓库中找到。点此:Learn about stable and edge builds.
1.2.2 安装Docker CE
-
执行如下命令安装最新版本的Docker CE:
yum install -y docker-ce
Docker安装后不会自动启动。
docker
组会被自动创建,但默认时该组中没有添加任何用户。 -
安装指定版本的Docker CE软件包。你可以先列出仓库中存在的所有版本,然后选择一个进行安装:
a. 列出并排序你的仓库中存在的Docker CE软件及版本。如下的命令将使用软件版本从高到低进行排序列出:
yum list docker-ce --showduplicates |sort -r
b. 使用如下命令,安装指定版本的软件包。例如安装
docker-ce-18.03.0.ce
版本:yum install docker-ce-<VERSION STRING>
同上,Docker安装后不会自动启动。
docker
组会被自动创建,但默认时该组中没有添加任何用户。 -
启动Docker CE:
systemctl start docker systemctl enable docker
-
使用如下命令,运行一个
hello-world
镜像,可以验证docker
已正确安装:docker run hello-world
1.3 使用RPM包安装
如果你不能使用Docker在线仓库,你也可以下载.rpm
文件并手动安装。
-
访问https://download.docker.com/linux/centos/7/x86_64/stable/Packages/并下载你需要的
.rpm
文件。Note: To install an edge package, change the word
stable
in the above URL toedge
. Learn about stable and edgechannels. -
安装Docker CE:
yum install /PATH/TO/PACKAGE.rpm
-
启动和验证安装结果参考
章节1.2
中的内容。
1.4 附加配置
Docker从1.13版本开始调整了默认的防火墙规则,禁用了iptables filter表中FOWARD链,这样会引起Kubernetes集群中跨Node的Pod无法通信,因此docker安装完成后,还需要手动修改iptables规则。
sed -i "13i ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT" /usr/lib/systemd/system/docker.service
systemctl start firewalld
systemctl enable firewalld
systemctl status firewalld
1.5 使用镜像加速
可以是用阿里云的镜像加速服务,加速镜像的下载速度:
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ht45blyl.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
2 安装Docker Compose
在Linux系统中,你可以从Compose repository release page on GitHub下载Docker Compose的二进制文件来安装。
-
执行如下命令下载最新版本的Docker Compose:
sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
The above command is an example, and it may become out-of-date. To ensure you have the latest version, check the Compose repository release page on GitHub.
如果使用
curl
命令安装失败,请参考:Alternative Install Options。 -
修改可执行文件的权限:
chmod +x /usr/local/bin/docker-compose
-
可选:参考command completion,启用
bash
和zsh
的命令补全功能; -
测试安装结果:
$ docker-compose --version docker-compose version 1.22.0, build 1719ceb
3 配置私有镜像仓库
3.1 配置私有镜像仓库
-
设置私有仓库域名:
IP_ADDRESS=192.168.18.81 echo "$IP_ADDRESS registry.yhjcb.net" >> /etc/hosts
-
创建工作目录:
mkdir -p /data/registry/{data,ssl-file}
-
创建CA私钥:
cd /data/registry/ssl-file openssl genrsa -out "root-ca.key" 4096
-
利用私钥创建CA根证书请求文件:
openssl req -new -key "root-ca.key" -out "root-ca.csr" -sha256 -subj '/C=CN/ST=SiChuan/L=ChengDu/O=My-Personal/CN=My-Personal Docker Registry CA'
-
配置
CA
根证书,新建root-ca.cnf
:cat <<EOF > root-ca.cnf [root_ca] basicConstraints = critical,CA:TRUE,pathlen:1 keyUsage = critical, nonRepudiation, cRLSign, keyCertSign subjectKeyIdentifier=hash EOF
以上命令中
-subj
参数里的/C
表示国家,如CN
;/ST
表示省;/L
表示城市或者地区;/O
表示组织名;/CN
通用名称。 -
签发根证书:
openssl x509 -req -days 3650 -in "root-ca.csr" -signkey "root-ca.key" -sha256 -out "root-ca.crt" -extfile "root-ca.cnf" -extensions root_ca
-
生成站点
SSL
私钥:openssl genrsa -out "registry.yhjcb.net.key" 4096
-
使用私钥生成证书请求文件:
openssl req -new -key "registry.yhjcb.net.key" -out "site.csr" -sha256 -subj '/C=CN/ST=SiChuan/L=ChengDu/O=My-Personal/CN=registry.yhjcb.net'
-
配置证书,新建
site.cnf
文件cat <<EOF > site.cnf [server] authorityKeyIdentifier=keyid,issuer basicConstraints = critical,CA:FALSE extendedKeyUsage=serverAuth keyUsage = critical, digitalSignature, keyEncipherment subjectAltName = DNS:registry.yhjcb.net, IP:127.0.0.1 subjectKeyIdentifier=hash EOF
-
签署站点
SSL
证书:openssl x509 -req -days 750 -in "site.csr" -sha256 -CA "root-ca.crt" -CAkey "root-ca.key" -CAcreateserial -out "registry.yhjcb.net.crt" -extfile "site.cnf" -extensions server
这样已经拥有了registry.yhjcb.net
的网站SSL私钥registry.yhjcb.net.key
和SSL证书registry.yhjcb.net.crt
及CA根证书 root-ca.crt
。
-
保存证书及相关SSL文件到特定目录下:
mkdir /data/registry/ssl mv registry.yhjcb.net.* /data/registry/ssl mv root-ca.crt /data/registry/ssl cd && rm -fr /data/registry/ssl-file
-
编辑
config.yml
文件:cd /data/registry/ cat <<EOF > config.yml version: 0.1 log: accesslog: disabled: true level: debug formatter: text fields: service: registry environment: staging storage: delete: enabled: true cache: blobdescriptor: inmemory filesystem: rootdirectory: /var/lib/registry auth: htpasswd: realm: basic-realm path: /etc/docker/registry/auth/nginx.htpasswd http: addr: :443 host: https://registry.yhjcb.net headers: X-Content-Type-Options: [nosniff] http2: disabled: false tls: certificate: /etc/docker/registry/ssl/registry.yhjcb.net.crt key: /etc/docker/registry/ssl/registry.yhjcb.net.key health: storagedriver: enabled: true interval: 10s threshold: 3 EOF
私有仓库默认的配置文件位于
/etc/docker/registry/config.yml
,我们先在本地编辑,之后将其挂载到容器中。 -
生成http认证文件:
mkdir auth docker run --rm --entrypoint htpasswd registry -Bbn admin admin123 > auth/nginx.htpasswd
将上面的用户
admin
和密码admin123
替换为你自己的用户名和密码。 -
编辑docker-compose.yml文件:
cd /data/registry cat <<EOF > docker-compose.yml version: '3' services: registry: image: registry ports: - "443:443" volumes: - ./:/etc/docker/registry - registry-data:/var/lib/registry volumes: registry-data: EOF
-
启动私有镜像仓库:
docker-compose up -d
-
查看服务状态:
# docker-compose ps Name Command State Ports --------------------------------------------------------------------------------------------- registry_registry_1 /entrypoint.sh /etc/docker ... Up 0.0.0.0:443->443/tcp, 5000/tcp # docker port registry_registry_1 443/tcp -> 0.0.0.0:443
可以使用
docker logs registry_registry_1
命令查看容器日志。
3.2 测试私有仓库
在一台安装了Docker的服务器上执行如下步骤,测试私有仓库可用性:
-
配置仓库域名解析:
IP_ADDRESS=192.168.18.81 echo "$IP_ADDRESS registry.yhjcb.net" >> /etc/hosts
-
拷贝认证文件到本地:
mkdir -p /etc/docker/certs.d/registry.yhjcb.net scp registry.yhjcb.net:/data/registry/ssl/root-ca.crt /etc/docker/certs.d/registry.yhjcb.net/ca.crt
-
登陆私有仓库:
docker login -u admin -p admin123 registry.yhjcb.net
-
获取一个镜像,如
oraclelinux:7-slim
,并将其tag后删除源镜像:docker pull oraclelinux:7-slim docker tag oraclelinux:7-slim registry.yhjcb.net/admin/oraclelinux:7-slim docker rmi oraclelinux:7-slim
-
推送该镜像到私有仓库中:
docker push registry.yhjcb.net/admin/oraclelinux:7-slim
-
删除tag后的本地镜像:
docker rmi registry.yhjcb.net/admin/oraclelinux:7-slim
-
测试从仓库重新拉取该镜像:
docker pull registry.yhjcb.net/admin/oraclelinux:7-slim
-
重新tag拉取到的镜像:
docker tag registry.yhjcb.net/admin/oraclelinux:7-slim oraclelinux:7-slim docker rmi registry.yhjcb.net/admin/oraclelinux:7-slim
4 参考链接整理
- https://www.stratoscale.com/blog/containers/run-docker-registry/
- https://www.digitalocean.com/community/tutorials/how-to-set-up-a-private-docker-registry-on-ubuntu-14-04
- http://www.macadamian.com/2017/02/07/creating-a-private-docker-registry/
- https://blog.sleeplessbeastie.eu/2018/04/16/how-to-setup-private-docker-registry/