把基于fastapi开发的python项目打包成docker镜像并发布拉取

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部署

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
  • 网页访问测试是否成功
    在这里插入图片描述
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WaiSaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值