之前也想过将 django 项目打包成 docker 部署,但是由于之前的项目过于庞大,用到了系统的定时任务等各种系统服务,不知道打包成 docker 之后相关的服务是否依然能够启动,所以并未实施。
前几天做的我的足迹地图,项目相对来说比较独立,没有其他的依赖项,正好可以尝试一下。
首先在项目下创建 Dockerfile,写入以下内容:
# 使用官方Python运行时作为父镜像 FROM python:3.8.18-slim # 设置工作目录 WORKDIR /app # 将当前目录内容复制到位于/app中的容器中 COPY . /app # 安装项目依赖 RUN pip install --no-cache-dir -r requirements.pip -i https://pypi.tuna.tsinghua.edu.cn/simple # 暴露端口8000,与Django的默认运行端口一致 EXPOSE 10086 # 定义环境变量 ENV NAME=Django # 在容器启动时运行Django的manage.py命令 CMD ["python", "manage.py", "runserver", "0.0.0.0:10086"]
网上代码来回抄,第二行都是FROM python:3.8-slim 如果这么写会导致下面的错误:
PS E:\Pycharm_Projects\BabyFootprintV2> docker build -t baby-footprint:1.0 . [+] Building 21.2s (2/2) FINISHED docker:desktop-linux => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 568B 0.0s => ERROR [internal] load metadata for docker.io/library/python:3.8-slim 21.1s ------ > [internal] load metadata for docker.io/library/python:3.8-slim: ------ Dockerfile:2 -------------------- 1 | # 使用官方Python运行时作为父镜像 2 | >>> FROM python:3.8-slim 3 | 4 | # 设置工作目录 -------------------- ERROR: failed to solve: python:3.8-slim: failed to resolve source metadata for docker.io/library/python:3.8-slim: failed to do request: Head "https://registry-1.docker.io/v2/library/python/manifests/3.8-slim": dialing registry-1.docker.io:443 container via direct connection because has no HTTPS proxy: connecting to registry-1.docker.io:443: dial tcp 69.63.186.31:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
直接访问上面的网址docker.io/library/python:3.8-slim会发现根本没这么东西,所以要改成FROM python:3.8.18-slim
搜索一下,会有教程提示先下载 python3.8的 docker:
PS E:\Pycharm_Projects\BabyFootprintV2> docker pull python:3.8.18-slim 3.8.18-slim: Pulling from library/python 8a1e25ce7c4f: Pull complete 1103112ebfc4: Pull complete b7d41b19b655: Pull complete 6a1ad0671ce8: Pull complete de92c59aadaa: Pull complete Digest: sha256:e796941013b10bb53a0924d8705485a1afe654bbbc6fe71d32509101e44b6414 Status: Downloaded newer image for python:3.8.18-slim docker.io/library/python:3.8.18-slim
3.8.18是 ok 的,此时重新 build 即可:
PS E:\Pycharm_Projects\BabyFootprintV2> docker build -t baby-footprint:1.0 . [+] Building 214.6s (9/9) FINISHED docker:desktop-linux => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 571B 0.0s => [internal] load metadata for docker.io/library/python:3.8.18-slim 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [1/4] FROM docker.io/library/python:3.8.18-slim 0.1s => [internal] load build context 0.9s => => transferring context: 43.30MB 0.8s => [2/4] WORKDIR /app 0.1s => [3/4] COPY . /app 0.2s => [4/4] RUN pip install --no-cache-dir -r requirements.pip -i https://pypi.tuna.tsinghua.edu.cn/simple 212.0s => exporting to image 1.4s => => exporting layers 1.4s => => writing image sha256:cba073b574f88f19be7487b29612e19b9826ab99e7b54ea748bd5df22e83e1a0 0.0s => => naming to docker.io/library/baby-footprint:1.0 0.0s
编译变成,就可以像 docker hub 推送镜像了,不过首先需要设置 tag,如果直接推送会提示下面的错误:
PS E:\Pycharm_Projects\BabyFootprintV2> docker push baby-footprint:1.0 The push refers to repository [docker.io/library/baby-footprint] 04013169f44d: Preparing f7c443286fad: Retrying in 5 seconds fd749af069d5: Retrying in 5 seconds 3482d4cd60de: Retrying in 5 seconds 370c0e78e3ea: Retrying in 5 seconds a74bee0a48a5: Waiting c8f253aef560: Waiting a483da8ab3e9: Waiting denied: requested access to the resource is denied
这个提示也比较坑人,由于 docker 被屏蔽,我一直以为是网络连接问题,直到后来才发现是路径问题。
通过下面的命令设置 tag 后 push:
docker tag baby-footprint:1.0 obaby/baby-footprint:1.0
PS E:\Pycharm_Projects\BabyFootprintV2> docker push obaby/baby-footprint:1.0 The push refers to repository [docker.io/obaby/baby-footprint] 04013169f44d: Pushed f7c443286fad: Pushed fd749af069d5: Pushed 3482d4cd60de: Pushed 370c0e78e3ea: Layer already exists a74bee0a48a5: Pushed c8f253aef560: Pushed a483da8ab3e9: Layer already exists 1.0: digest: sha256:0d0c0989a64cc3f3e192e5c8e7bc4931676d49ab66d810061a1daec6b1a6af58 size: 2000
受限于网络问题,可能会 push 失败,多重试几次就 ok 了。
最后就可以直接 docker 安装运行啦:
docker push obaby/baby-footprint:tagname
33 comments
强势沙发
评论框顶端没边框线条,强迫症表示不可忍
灵妹妹换成什么路由器了呀
我也没搞明白为啥第一个没有,哈哈哈
没换,返厂修
#comment-list > .comment:first-child > .comment-body {
border-top: none;
}
去掉这句
这个需要改主题的文件,换了个方法改好了。
6,灵妹妹加了个:border-top: 1px dashed #ff7aa4 !important;
权重更高的样式覆盖前面
是的,不想去改主题的 css,😂
docker不得不说,再部署的时候很方便~
是的~~
我感觉第一个框上边你可以加入一个占位符解决,。只是我感觉哈。我不懂
早上博客好像打不开了,我rss也没拉到你的,评论区样式改了?
家里路由器挂了,哈哈哈
稍微改了一下
我感觉第一个框上边你可以加入一个占位符解决,。只是我感觉哈。我不懂
改好了~~
你这评论区我提的建议 也不夸夸我啊
谢谢亲~~
山河四省一家亲
亲~~
原来这么构建的哈。
是滴
好好好,学到咯,哈哈
不错不错,只是我不喜欢用docker,不知道为什么,总感觉管理不方便。
管理还行 就是更新我一直没搞定
我也喜欢用docker,服务器可以管理得很整齐
是的 很整洁
出于安全方面着想 直接使用docker run来启动容器会不会有一定的暴露风险呢😳 如果用docker-compose或Kubernetes工具来管理容器会不会更好些
本质上没区别吧,docker 不都是这么用的吗?
docker-compose只是一种docker命令的增强版,对于运行复杂的项目有帮助,而简单的项目并不一定需要。
Docker个人理解它的主要是用途是运行环境的管理,如果真的是一些大型的应用,或是应用更新换代较快的话,可以考虑使用目录外挂载的方式把应用安装介质加载到Docker镜像就可以,这样也可以减小Docker镜像的大小,便于传输与分享。
是的,这个还是有必要的额。尤其是资源文件。
Docker恐惧症患者表示看不懂(⊙o⊙)哇,弱弱问下,服务器重启Docker会丢失吗?
不回哒
不错不错,改天试试。