1 安装Docker CE

1.1 卸载旧版本

旧版本的Docker被称为dockerdocker-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仓库

  1. 安装依赖软件包。yum-utils软件包包含了yum-config-manager工具,devicemapper存储驱动依赖于device-mapper-persistent-datalvm2软件包:

    yum install -y yum-utils device-mapper-persistent-data lvm2
    
  2. 使用如下命令配置stable版本的软件仓库:

    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    

    如果你需要从edge或者test版本的软件仓库安装软件包,也会需要stable的软件仓库:

  3. 可选:启用edgetest仓库。这两个仓库均包含在上面获取的docker.repo文件中,但是默认处于禁用状态。执行如下命令启用:

    yum-config-manager --enable docker-ce-edge
    yum-config-manager --enable docker-ce-test
    

    你也可以使用yum-config-manager命令禁用edgetest仓库,执行时加上--disable参数即可。使用--enable参数重新启用。下面的命令演示了如何禁用edge仓库:

    yum-config-manager --disable docker-ce-edge
    

    Note: 从Docker 17.06开始,stabe版本的Docker软件包,也可以在edgetest仓库中找到。点此:Learn about stable and edge builds.

1.2.2 安装Docker CE

  1. 执行如下命令安装最新版本的Docker CE:

    yum install -y docker-ce
    

    Docker安装后不会自动启动。docker组会被自动创建,但默认时该组中没有添加任何用户。

  2. 安装指定版本的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组会被自动创建,但默认时该组中没有添加任何用户。

  3. 启动Docker CE:

    systemctl start docker
    systemctl enable docker
    
  4. 使用如下命令,运行一个hello-world镜像,可以验证docker已正确安装:

    docker run hello-world
    

1.3 使用RPM包安装

如果你不能使用Docker在线仓库,你也可以下载.rpm文件并手动安装。

  1. 访问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 to edge. Learn about stable and edgechannels.

  2. 安装Docker CE:

    yum install /PATH/TO/PACKAGE.rpm
    
  3. 启动和验证安装结果参考章节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的二进制文件来安装。

  1. 执行如下命令下载最新版本的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

  2. 修改可执行文件的权限:

    chmod +x /usr/local/bin/docker-compose
    
  3. 可选:参考command completion,启用bashzsh的命令补全功能;

  4. 测试安装结果:

    $ docker-compose --version
    docker-compose version 1.22.0, build 1719ceb
    

3 配置私有镜像仓库

3.1 配置私有镜像仓库

  1. 设置私有仓库域名:

    IP_ADDRESS=192.168.18.81
    echo "$IP_ADDRESS   registry.yhjcb.net" >> /etc/hosts
    
  2. 创建工作目录:

    mkdir -p /data/registry/{data,ssl-file}
    
  3. 创建CA私钥:

    cd /data/registry/ssl-file
    openssl genrsa -out "root-ca.key" 4096
    
  4. 利用私钥创建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'
    
  5. 配置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通用名称。

  6. 签发根证书:

    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
    
  7. 生成站点SSL私钥:

    openssl genrsa -out "registry.yhjcb.net.key" 4096
    
  8. 使用私钥生成证书请求文件:

    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'
    
  9. 配置证书,新建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
    
  10. 签署站点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

  1. 保存证书及相关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
    
  2. 编辑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,我们先在本地编辑,之后将其挂载到容器中。

  3. 生成http认证文件:

    mkdir auth
    docker run --rm --entrypoint htpasswd registry -Bbn admin admin123 > auth/nginx.htpasswd
    

    将上面的用户admin和密码admin123替换为你自己的用户名和密码。

  4. 编辑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
    
  5. 启动私有镜像仓库:

    docker-compose up -d
    
  6. 查看服务状态:

    # 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的服务器上执行如下步骤,测试私有仓库可用性:

  1. 配置仓库域名解析:

    IP_ADDRESS=192.168.18.81
    echo "$IP_ADDRESS   registry.yhjcb.net" >> /etc/hosts
    
  2. 拷贝认证文件到本地:

    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
    
  3. 登陆私有仓库:

    docker login -u admin -p admin123 registry.yhjcb.net
    
  4. 获取一个镜像,如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 
    
  5. 推送该镜像到私有仓库中:

    docker push registry.yhjcb.net/admin/oraclelinux:7-slim
    
  6. 删除tag后的本地镜像:

    docker rmi registry.yhjcb.net/admin/oraclelinux:7-slim
    
  7. 测试从仓库重新拉取该镜像:

    docker pull registry.yhjcb.net/admin/oraclelinux:7-slim
    
  8. 重新tag拉取到的镜像:

    docker tag registry.yhjcb.net/admin/oraclelinux:7-slim oraclelinux:7-slim
    docker rmi registry.yhjcb.net/admin/oraclelinux:7-slim
    

4 参考链接整理