🚀 Docker Hub 概览
Docker Hub 是 Docker 的官方公共仓库,其中包含了大量的镜像,由 Docker 公司、组织和个人用户创建和维护。
📌 注册与登录
-
注册:你可以在 Docker Hub 官网 免费注册一个 Docker 账号。
-
登录:在命令行中,使用
docker login
并交互式地输入用户名和密码来登录 Docker Hub。退出登录可以通过docker logout
命令实现。
📌 拉取与推送镜像
-
查找镜像:可以使用
docker search
命令来查找 Docker Hub 中的镜像。例如:docker search centos
。 -
下载镜像:使用
docker pull
命令来下载选定的镜像到本地。例如:docker pull centos
。 -
推送镜像:首先,你需要给你的镜像打上一个标签,然后使用
docker push
命令将其推送到 Docker Hub。例如:$ docker tag ubuntu:18.04 username/ubuntu:18.04 $ docker push username/ubuntu:18.04
📌 自动构建
-
自动构建概述:从 2021 年 7 月 26 日开始,某些功能可能是受限制的。自动构建可以帮助用户自动触发镜像的构建,这在软件或应用有新的版本更新时特别有用。
-
配置自动构建:为了配置自动构建,你需要在 Docker Hub 上关联你的代码存储库(如 GitHub 或 Bitbucket),然后选择一个特定的项目和分支来进行追踪。一旦在这些代码存储库中有新的提交或标签创建,Docker Hub 将自动触发一个新的镜像构建。
💡 小贴士:Docker Hub 不仅仅是一个镜像存储库;它也为开发者、团队和组织提供了一个平台,用于协作、共享和自动化。此外,Docker Hub 还有其他许多功能,如组织和团队管理、私有仓库和集成。这些功能可以帮助团队更有效地使用 Docker。
📝 私有 Docker 仓库
Docker 官方的 Docker Hub 是一个公开的镜像仓库,但在某些场景中,你可能需要一个私有的 Docker 镜像仓库来存储和管理自己的镜像。以下是设置和使用私有 Docker 仓库的方法。
📌 安装并运行 docker-registry
-
使用容器运行:你可以使用 Docker Hub 上的官方
registry
镜像来运行你的私有仓库。$ docker run -d -p 5000:5000 --restart=always --name registry registry:2
-
指定存储路径:如果你想将上传的镜像存放在主机的特定路径(例如
/opt/data/registry
),可以使用-v
参数。$ docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry:2
📌 上传、搜索和下载镜像
-
标记镜像:使用
docker tag
命令将本地的镜像标记为私有仓库中的镜像。$ docker tag ubuntu:latest 127.0.0.1:5000/ubuntu:latest
-
上传镜像:使用
docker push
命令将标记的镜像上传到私有仓库。$ docker push 127.0.0.1:5000/ubuntu:latest
-
查看仓库中的镜像:使用
curl
或浏览器查看私有仓库中的镜像。$ curl 127.0.0.1:5000/v2/_catalog
-
下载镜像:你可以使用
docker pull
命令从私有仓库下载镜像。$ docker pull 127.0.0.1:5000/ubuntu:latest
📌 配置非 HTTPS 仓库地址
默认情况下,Docker 要求使用 HTTPS 来与私有仓库进行通信。但在内部网络或测试环境中,你可能不想设置 HTTPS。这种情况下,需要告诉 Docker 信任这个非 HTTPS 的私有仓库。
-
对于 Ubuntu 16.04+, Debian 8+, CentOS 7:编辑
/etc/docker/daemon.json
文件(如果不存在,则创建),并添加以下内容。{ "registry-mirrors": [ "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ], "insecure-registries": [ "192.168.199.100:5000" ] }
请确保该 JSON 文件格式正确,否则 Docker 服务将无法启动。
-
其他系统:对于 Docker Desktop for Windows 或 Docker Desktop for Mac,你可以直接在图形界面中的 Docker Engine 设置中编辑上述内容。
💡 小贴士:虽然私有 Docker 仓库非常有用,但请记住,如果不设置适当的安全性(例如 HTTPS 和身份验证),它可能会暴露你的镜像和数据。在生产环境中使用私有仓库时,应确保采取适当的安全措施。
📊 私有 Docker 仓库的高级配置
Docker 允许用户在本地搭建私有 Docker 仓库,而这个仓库可以通过一些高级配置来增强其安全性和功能。本小节将引导你如何使用 Docker Compose 搭建一个带有权限认证和 TLS 的私有 Docker 仓库。
📌 准备站点证书
在实际生产环境中,我们通常会为 Docker 私有仓库配置 HTTPS 以提高安全性。为此,你需要为你的 Docker 仓库准备 SSL/TLS 证书。你可以购买证书,也可以使用 OpenSSL 工具自签名证书。上述步骤详细描述了如何使用 OpenSSL 生成 CA 根证书和站点证书。
# 第一步创建 CA 私钥。
$ openssl genrsa -out "root-ca.key" 4096
# 第二步利用私钥创建 CA 根证书请求文件。
$ openssl req \
-new -key "root-ca.key" \
-out "root-ca.csr" -sha256 \
-subj '/C=CN/ST=Shanxi/L=Datong/O=Your Company Name/CN=Your Company Name Docker Registry CA'
# 第三步配置 CA 根证书,新建 root-ca.cnf。
[root_ca]
basicConstraints = critical,CA:TRUE,pathlen:1
keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
subjectKeyIdentifier=hash
# 第四步签发根证书。
$ 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 "docker.domain.com.key" 4096
# 第六步使用私钥生成证书请求文件。
$ openssl req -new -key "docker.domain.com.key" -out "site.csr" -sha256 \
-subj '/C=CN/ST=Shanxi/L=Datong/O=Your Company Name/CN=docker.domain.com'
# 第七步配置证书,新建 site.cnf 文件。
[server]
authorityKeyIdentifier=keyid,issuer
basicConstraints = critical,CA:FALSE
extendedKeyUsage=serverAuth
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = DNS:docker.domain.com, IP:127.0.0.1
subjectKeyIdentifier=hash
# 第八步签署站点 SSL 证书。
$ openssl x509 -req -days 750 -in "site.csr" -sha256 \
-CA "root-ca.crt" -CAkey "root-ca.key" -CAcreateserial \
-out "docker.domain.com.crt" -extfile "site.cnf" -extensions server
# 创建 ssl 文件夹并将生成的文件移入
$ mkdir ssl
$ mv docker.domain.com.key docker.domain.com.crt root-ca.crt ssl/
📌 配置私有仓库
-
配置文件:
config.yml
是 Docker 仓库的主配置文件。它定义了日志、存储、认证、HTTP/TLS 设置等。 -
生成 HTTP 认证文件:为了提供 HTTP 基本认证,你需要一个 htpasswd 文件,该文件包含允许推送和拉取仓库的用户名和密码。
## 生成 http 认证文件
$ mkdir auth
$ docker run --rm \
--entrypoint htpasswd \
httpd:alpine \
-Bbn username password > auth/nginx.htpasswd
📌 使用 docker-compose 启动仓库
使用 docker-compose.yml
文件,你可以定义和运行 Docker 仓库容器的多容器 Docker 应用程序。在这里,我们定义了一个服务“registry”,它使用官方的 registry 镜像,并将其暴露在 443 端口上。
## 编辑 docker-compose.yml
version: '3'
services:
registry:
image: registry
ports:
- "443:443"
volumes:
- ./:/etc/docker/registry
- registry-data:/var/lib/registry
volumes:
registry-data:
📌 修改 hosts 文件
这一步是为了确保你的机器知道如何解析你为 Docker 仓库定义的域名。
# 添加以下内容
127.0.0.1 docker.domain.com
📌 启动 Docker 仓库
使用 docker-compose up -d
命令启动你的 Docker 仓库。
$ docker-compose up -d
📌 测试私有仓库功能
为了确保你的私有 Docker 仓库正常工作,你应该进行一些基本的测试,例如登录、推送、拉取和注销。
# 将 CA 根证书添加到 Docker 的受信任的证书目录中
$ sudo mkdir -p /etc/docker/certs.d/docker.domain.com
$ sudo cp ssl/root-ca.crt /etc/docker/certs.d/docker.domain.com/ca.crt
# 登录到私有仓库
$ docker login docker.domain.com
# 尝试推送、拉取镜像
$ docker pull ubuntu:18.04
$ docker tag ubuntu:18.04 docker.domain.com/username/ubuntu:18.04
$ docker push docker.domain.com/username/ubuntu:18.04
$ docker image rm docker.domain.com/username/ubuntu:18.04
$ docker pull docker.domain.com/username/ubuntu:18.04
# 退出登录
$ docker logout docker.domain.com
💡 注意事项
- 如果你的机器上已经有其他服务使用了 443 端口,你需要更改 Docker 仓库的端口。你可以在
docker-compose.yml
文件中进行这些更改。 - 使用自签名证书时,Docker 默认不会信任该证书。因此,你需要将你的 CA 根证书添加到 Docker 的受信任的证书目录中,以避免在与私有仓库通信时出现证书错误。
- 虽然使用自签名证书在内部网络和测试环境中可能是可行的,但在生产环境中,建议使用由受信任的证书颁发机构颁发的证书。
总的来说,为 Docker 仓库配置权限认证和 TLS 可以增强其安全性,防止未经授权的访问。确保在将私有仓库用于生产环境之前进行适当的安全配置和测试。
🔥 Nexus 3
使用 Docker 的官方 Registry 可能会带来一些维护问题。例如,某些已删除的镜像默认不会释放空间。Nexus 3.x 是 Sonatype 的仓库管理器,它支持 Docker、Maven、Yum、PyPI 等。使用 Nexus 可以集中管理这些仓库。
1. 🐳 启动 Nexus 容器
$ docker run -d --name nexus3 --restart=always \
-p 8081:8081 \
--mount src=nexus-data,target=/nexus-data \
sonatype/nexus3
✨ 提示: 等待3-5分钟,然后检查日志以确保 Nexus 已成功启动:
$ docker logs nexus3 -f
🌐 在浏览器中打开 http://YourIP:8081
以访问 Nexus。首次运行时,需要获取初始密码:
$ docker exec nexus3 cat /nexus-data/admin.password
🔑 使用默认账号 admin
和上述命令获取的密码登录。首次登录时,系统会提示您更改初始密码。
2. 📦 创建仓库
- 转到
Repository->Repositories
并选择Create repository
,然后选择docker (hosted)
。配置如下:- Name: 仓库名称
- HTTP: 仓库的 HTTP 端口(例如:5001)
- Hosted -> Deployment policy: 选择
Allow redeploy
✨ 额外提示: 你还可以创建一个 docker (proxy)
类型的仓库链接到 DockerHub,以及一个 docker (group)
类型的仓库来组合前两者。
3. 🔐 添加访问权限
- 在
Security->Realms
中,将Docker Bearer Token Realm
移动到右侧的列表中。 - 转到
Security->Roles->Create role
,在 Privileges 选项中搜索 docker,并将相应的权限添加到角色中。 - 转到
Security->Users->Create local user
,为用户分配上述角色。
4. 🌐 使用 NGINX 设置加密代理
首先,按照上述步骤生成证书。然后,创建 NGINX 配置文件以代理对 Nexus 的请求。以下是示例配置:
upstream register
{
server "YourHostName OR IP":5001; #端口为上面添加私有镜像仓库时设置的 HTTP 选项的端口号
check interval=3000 rise=2 fall=10 timeout=1000 type=http;
check_http_send "HEAD / HTTP/1.0\r\n\r\n";
check_http_expect_alive http_4xx;
}
server {
server_name YourDomainName;#如果没有 DNS 服务器做解析,请删除此选项使用本机 IP 地址访问
listen 443 ssl;
ssl_certificate key/example.crt;
ssl_certificate_key key/example.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
large_client_header_buffers 4 32k;
client_max_body_size 300m;
client_body_buffer_size 512k;
proxy_connect_timeout 600;
proxy_read_timeout 600;
proxy_send_timeout 600;
proxy_buffer_size 128k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 512k;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://register;
proxy_read_timeout 900s;
}
error_page 500 502 503 504 /50x.html;
}
5. 🐳 Docker 主机访问镜像仓库
如果不使用 SSL,可以修改 Docker 的配置以添加非 HTTPS 仓库地址。但如果使用了 SSL,则需要将证书添加到 Docker 的信任列表中:
$ openssl s_client -showcerts -connect YourDomainName OR HostIP:443 </dev/null 2>/dev/null|openssl x509 -outform PEM >ca.crt
$ cat ca.crt | sudo tee -a /etc/ssl/certs/ca-certificates.crt
$ systemctl restart docker
然后,使用 docker login YourDomainName OR HostIP
命令并输入在 Nexus 中设置的用户名和密码进行登录。