Background
- 整个流程走通还是踩了很多坑的,这里记录下,方便大家参考哈。
1、流程介绍
- 这里我们通过一个测试项目
call-test
,走一下全流程。 - 该项目已上传到github,call-test项目地址。该项目很简单,访问8111端口输出hello world。
- 在三台服务器上测试,都已部署了docker,一台部署docker registry(110.110.110.110),一台构建项目(110.110.110.111),还有一台用于拉取项目测试(110.110.110.112)。
- 下图是访问成功后输出内容:
2、docker部署
- docker的安装部署之前已经记录过了,在线和离线版部署都有,具体可以参考下面两篇博客。
- centos7通过yum在线安装Docker CE。
- centos7离线安装DockerCE最新版。
3、docker registry部署
- 我们部署在
110.110.110.110
这个IP上。 - 仓库(Repository)是集中存放镜像的地方。Dockerhub是官方维护的一个公共仓库,我们也可以搭建私有仓库(Habor和Docker Registry)。
- 就像你可以使用公共仓库Maven Repository,也可以自建搭建Nexus Repository私服;你可以使用公共仓库pypi,也可以自建搭建个pypiserver;你可以使用github,也可以自己搭建个Gitlab等,都一样的概念。
- 我们这里使用官方提供的Dokcer Registry来构建一个私有仓库。
- 下载Register的Docker镜像
docker pull registry
- 设置私有仓库用户认证
# 账户信息存储目录
mkdir -p /data/my-dockerhub/auth
# 镜像存储目录
mkdir -p /data/my-dockerhub/mirrors
- 用httpd-tools创建账号信息
yum install -y httpd-tools
htpasswd -Bbn admin 123456 > /data/my-dockerhub/auth/htpasswd
- 启动registry
REGISTRY_STORAGE_DELETE_ENABLED="true"标识可删除镜像
docker run --name my-dockerhub -p 5000:5000 --restart=always \
-v /data/my-dockerhub/mirrors/:/var/lib/registry \
-v /data/my-dockerhub/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-e REGISTRY_STORAGE_DELETE_ENABLED="true" \
-d registry
- 修改客户端Docker Daemon的配置文件
/etc/docker/daemon.json
,这里我们改成我们自己搭建的仓库的IP
{
"insecure-registries": [
"110.110.110.110:5000"
]
}
- 重启配置生效
systemctl daemon-reload && systemctl restart docker
- 安装registry ui
这个不是必须的,不过有个UI界面看着方便点哈。
docker pull joxit/docker-registry-ui:1.5-static
- 运行docker-registry-ui服务
docker run -p 8281:80 --restart=always --name my-dockerhub-ui \
--link my-dockerhub:my-dockerhub \
-e REGISTRY_URL="http://my-dockerhub:5000" \
-e DELETE_IMAGES="true" \
-e REGISTRY_TITLE="my-dockerhub" \
-d joxit/docker-registry-ui:1.5-static
- 浏览器访问docker-registry-ui
可以看到这里我已经上传了两个镜像。
4、创建测试项目 call-test
该项目已上传到github,call-test项目地址。
5、构建docker镜像并发布
这里我已经把构建的命令写成了脚本 upload.sh
,执行脚本,输入自己docker registry的密码就可以了。
- 构建上传过程如下
[root@elephant call-test]# ll
total 32
drwxr-xr-x. 2 root root 40 Jul 22 11:04 app
-rw-r--r--. 1 root root 135 Jul 21 18:59 docker-compose.yml
-rw-r--r--. 1 root root 197 Jul 21 18:59 Dockerfile
-rw-r--r--. 1 root root 745 Jul 21 18:59 LICENSE
-rw-r--r--. 1 root root 634 Jul 22 09:03 README.md
-rw-r--r--. 1 root root 32 Jul 21 18:59 requirements.txt
-rw-r--r--. 1 root root 4971 Jul 22 11:01 test.sh
-rw-r--r--. 1 root root 417 Jul 22 10:57 upload.sh
[root@elephant call-test]# sh upload.sh
Sending build context to Docker daemon 98.82kB
Step 1/7 : FROM python:3.7.8-slim
---> 6bd913dd0ca1
Step 2/7 : ENV HOST = "0.0.0.0"
---> Running in ee8bf7f84858
Removing intermediate container ee8bf7f84858
---> 2e8c5bc1c4d5
Step 3/7 : EXPOSE 8111
---> Running in fa85bbd33f1f
Removing intermediate container fa85bbd33f1f
---> f4e91ab52bd6
Step 4/7 : WORKDIR /app/
---> Running in 39bc13320577
Removing intermediate container 39bc13320577
---> c7f6aafda59b
Step 5/7 : COPY . ./
---> b30e006b2678
Step 6/7 : RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
---> Running in 10bd227ed31e
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting fastapi==0.78.0
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/61/0f/427f0af121b226e62237e430f5bf4485e0ae1565b3f5b782613b59f30abc/fastapi-0.78.0-py3-none-any.whl (54 kB)
Collecting uvicorn==0.17.6
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/36/ab/c13847c53d0624ee5a2e19c9c8d19a8cea5f865b95d08b839fac375a9e83/uvicorn-0.17.6-py3-none-any.whl (53 kB)
Collecting starlette==0.19.1
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/f1/9d/1fa96008b302dd3e398f89f3fc5afb19fb0b0f341fefa05c65b3a38d64cf/starlette-0.19.1-py3-none-any.whl (63 kB)
Collecting pydantic!=1.7,!=1.7.1,!=1.7.2,!=1.7.3,!=1.8,!=1.8.1,<2.0.0,>=1.6.2
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/f1/ea/1b879b2b30c4e041bce20f3baf785a640f93ae4146d5258dff5661d0bebf/pydantic-1.9.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.1 MB)
Collecting typing-extensions; python_version < "3.8"
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/ed/d6/2afc375a8d55b8be879d6b4986d4f69f01115e795e36827fd3a40166028b/typing_extensions-4.3.0-py3-none-any.whl (25 kB)
Collecting click>=7.0
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/c2/f1/df59e28c642d583f7dacffb1e0965d0e00b218e0186d7858ac5233dce840/click-8.1.3-py3-none-any.whl (96 kB)
Collecting asgiref>=3.4.0
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/af/6d/ea3a5c3027c3f14b0321cd4f7e594c776ebe64e4b927432ca6917512a4f7/asgiref-3.5.2-py3-none-any.whl (22 kB)
Collecting h11>=0.8
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/19/d2/32a15a4955be1b8114a1c570999eefd31279c7f9aa2d2a43d492a79b53c5/h11-0.13.0-py3-none-any.whl (58 kB)
Collecting anyio<5,>=3.4.0
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/c3/22/4cba7e1b4f45ffbefd2ca817a6800ba1c671c26f288d7705f20289872012/anyio-3.6.1-py3-none-any.whl (80 kB)
Collecting importlib-metadata; python_version < "3.8"
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/d2/a2/8c239dc898138f208dd14b441b196e7b3032b94d3137d9d8453e186967fc/importlib_metadata-4.12.0-py3-none-any.whl (21 kB)
Collecting sniffio>=1.1
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/52/b0/7b2e028b63d092804b6794595871f936aafa5e9322dcaaad50ebf67445b3/sniffio-1.2.0-py3-none-any.whl (10 kB)
Collecting idna>=2.8
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/04/a2/d918dcd22354d8958fe113e1a3630137e0fc8b44859ade3063982eacd2a4/idna-3.3-py3-none-any.whl (61 kB)
Collecting zipp>=0.5
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/f0/36/639d6742bcc3ffdce8b85c31d79fcfae7bb04b95f0e5c4c6f8b206a038cc/zipp-3.8.1-py3-none-any.whl (5.6 kB)
Installing collected packages: typing-extensions, sniffio, idna, anyio, starlette, pydantic, fastapi, zipp, importlib-metadata, click, asgiref, h11, uvicorn
Successfully installed anyio-3.6.1 asgiref-3.5.2 click-8.1.3 fastapi-0.78.0 h11-0.13.0 idna-3.3 importlib-metadata-4.12.0 pydantic-1.9.1 sniffio-1.2.0 starlette-0.19.1 typing-extensions-4.3.0 uvicorn-0.17.6 zipp-3.8.1
WARNING: You are using pip version 20.2.2; however, version 22.2 is available.
You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.
Removing intermediate container 10bd227ed31e
---> eb9967a1e815
Step 7/7 : CMD python3 app/main.py $HOST
---> Running in f69f982f3afd
Removing intermediate container f69f982f3afd
---> d0232fe40c74
Successfully built d0232fe40c74
Successfully tagged call-test:v1
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
The push refers to repository [110.110.110.110:5000/call-test]
26d882126030: Pushed
3ee8620ade90: Pushed
64f79a6cfc5f: Pushed
880d8e38a8e4: Layer already exists
23746fb81c22: Layer already exists
2de5ba74fd9a: Layer already exists
2b99e2403063: Layer already exists
d0f104dc0a1f: Layer already exists
v1: digest: sha256:5dd815d7c5189e7975cf98434b897d503821786a6a7ce317d9368c9bd95b6149 size: 1998
[root@elephant call-test]#
- 然后可以在docker registry ui看到我们上传的镜像
- 需要注意一点
通过下面两个箭头所指处复制的镜像拉取地址的端口不对,需要把它给的8281端口改成5000。
6、在另一台服务器上拉取运行项目
我们在服务器110.110.110.112上拉取我们刚上传的镜像进行测试。
- 第一次可能需要先登录,按提示输入密码
docker login --username=admin 110.110.110.110:5000
- 再拉取镜像
docker pull 110.110.110.110:5000/call-test:v1
- 然后运行项目
docker run -d --name=call-test --restart=always -e HOST="0.0.0.0" -p 8111:8111 110.110.110.110:5000/call-test:v1
- 网页访问测试是否成功