本文首发于微信公众号:Hunter 后端
原文链接:Docker 笔记三之运行 Django 零碎
这一篇笔记介绍一下如何应用 Docker 运行 Django 零碎。
流程大略是这样,拉取一个 python 镜像,而后将咱们的 Django 零碎放到该镜像中构建一个新的镜像,运行新镜像产生的容器就有咱们的 Django 服务了。
以下是本篇笔记目录:
- 镜像和零碎筹备
- Dockerfile 筹备
- 构建镜像
- 运行容器
- 其余 Dockerfile 命令
1、镜像和零碎筹备
镜像拉取
首先咱们须要筹备一个 Python 3.6 的镜像,用于前面构建咱们的 Django 镜像。
通过上面的命令拉取:
docker pull python:3.6
而后通过 docker images
能够看到在 REPOSITORY 下名一个 python,TAG 为 3.6 镜像
Django 零碎筹备
依据隔壁 Django 笔记,咱们能够创立一个新零碎,也能够用本人的我的项目零碎,这里咱们命名为 hunter,放在 ~/ 目录下,这个目录地址能够自定义
python 依赖筹备
而后筹备一个 requirements.txt,这蕴含了咱们运行零碎所须要的全副依赖,能够在咱们创立的 Django 零碎下通过 pip freeze 命令取得:
pip3 freeze > requirements.txt
requirements.txt 这个文件咱们也放在 ~/ 目录下
2、Dockerfile 筹备
而后咱们须要新建一个 Dockerfile 文件,这个文件的作用是根据咱们写好的命令,在一个根底镜像上将咱们须要运行的 Django 零碎或者其余零碎传到镜像里成为一个新的镜像
咱们创立的 Dockerfile 也放在 ~/ 目录下
FROM python:3.6
RUN mkdir /hunter -p
WORKDIR /hunter
ADD ./requirements.txt /hunter
RUN cd /hunter
RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
ADD ./hunter /hunter
CMD ["python3", "manage.py", "runserver", "0:9898"]
- FROM 构建新的镜像的根底镜像,即应用哪个指定的镜像作为根底来构建新的镜像
- ADD 复制指令,相似于 COPY 指令,在这里,应用 COPY 指令也能够,不同点在于对压缩文件的解决
- RUN 执行指令,在构建新镜像的时候运行
- CMD 也是执行指令,不过是在容器运行的时候执行,相当于是容器启动时的默认指令
- WORKDIR 指定工作的目录,在容器运行起来后,应用命令进入容器,默认进入的也是 WORKDIR 的目录
所以咱们下面的 Dockerfile 的内容是:
- FROM 命令:在 python:3.6 的根底镜像上操作
- RUN 命令:在镜像内创立 /hunter 文件夹
- WORKDIR 命令:指定镜像内工作目录为 /hunter
- ADD 命令:将宿主机的 requirements.txt 文件复制到镜像内 /hunter 目录下
- RUN 命令:在镜像内进入 /hunter 文件夹下
- RUN 命令:在镜像内依据 /hunter 文件夹下的 requirements.txt 文件装置 python 依赖
- ADD 命令:将宿主机的 Django 系统文件整个复制到镜像内的 /hunter 文件夹下
- CMD 命令:指定容器启动时运行的命令
以上命令在咱们构建镜像的时候会顺次执行。
留神: CMD 指定的程序会被 docker run 的时候前面增加的程序指令笼罩
与 CMD 还有个作用相似的命令,ENTRYPOINT,这个用法前面再介绍
就此,咱们构建新镜像的步骤和命令就此指定了。
3、构建镜像
接下来的操作就是依据 Dockerfile 构建一个新镜像
进入 ~/ 文件夹下,有以下几个文件及文件夹:
hunter/
requirements.txt
Dockerfile
根本的命令如下:
docker build . -t tag -f Dockerfile
-t 参数示意构建新镜像时手动打的一个 tag
-f 示意指定的 Dockerfile 文件,如果不应用 -f 参数,会默认寻找以后文件夹的 Dockerfile
接下来咱们打一个 tag 为 Django:1.0.0 的镜像,应用后面咱们创立的 Dockerfile
docker build . -t django:1.0.0 -f Dockerfile
在这里 -f 参数能够不增加,因为会默认应用以后文件夹的 Dockerfile 文件
能够看到上面这种相似的输入内容:
Step 7/8 : ADD ./hunter /hunter
---> 84a62ad79b51
Step 8/8 : CMD ["python3", "manage.py", "runserver", "0:9898"]
---> Running in 33bcc53af8cf
Removing intermediate container 33bcc53af8cf
---> 926fce7b8cea
Successfully built 926fce7b8cea
Successfully tagged django:1.0.0
而后应用 docker images
命令能够看到有一个 django:1.0.0 的镜像了。
4、运行容器
接下来咱们能够依据 image id 或者 django:1.0.0 这个 tag 来运行容器:
docker run -p 9898:9898 django:1.0.0
而后以后界面会显示 Watching for file changes with StatReloader 这种信息
而后拜访咱们的零碎 localhost:9898 相似这种,在以后界面就会输入相应的访问信息
而如果咱们想要进行运行这个容器,能够在新开一个 shell,通过 docker ps 找到正在运行的容器,而后 docker stop xxxx 进行或者间接在以后界面 ctrl + c
在后盾运行这个容器能够如下操作:
docker run -itd -p 9898:9898 django:1.0.0
在这里咱们应用 -p 参数将容器的 9898 端口映射到宿主机的 9898 端口
留神: 为了以示辨别,假如端口映射为 -p 5678:9898,后面的 5678 是宿主机的端口,前面的 9898 是容器内的端口
在容器运行起来之后,如果想进入该容器,能够 通过 docker ps 找到这个运行的容器,而后 应用上面的命令进入容器内查看
5、其余 Dockerfile 命令
除了在后面介绍的 Dockerfile 命令,还有挂载的命令 VOLUME,端口申明的命令 EXPOSE,环境变量设置的命令 ENV,还有与 CMD 类似的指令执行的命令 ENTRYPOINT 等
EXPOSE
可用于申明这个镜像应用的端口,在运行的时候能够应用 -p 参数映射这个端口,但仿佛并无太多实际意义,能够用于在 Dockerfile 中申明,前期便于查看
VOLUME
挂载的命令,咱们能够在前面的运行 MySQL 镜像的时候介绍
ENV
命令为环境变量,能够在构建镜像的时候就指定变量,也能够在 运行容器的时候指定命令,能够间接在 Dockerfile 中如此申明:
ENV key value
ENTRYPOINT
与 CMD 相似的作用,但 ENTRYPOINT 不会被容器启动时的指定的指令笼罩,而 CMD 命令会被笼罩
比方:
docker run -itd image_id bash
这里就指定了新的 CMD 命令为 bash,那么原来的 CMD 命令就被笼罩,不会执行了
如果想要笼罩 Dockerfile 中的 ENTRYPOINT 命令,仅在容器 run 的时候,应用 –entrypoint 的参数,则会笼罩 ENTRYPOINT 指定的程序
在 Dockerfile 中,如果存在多个 ENTRYPOINT 命令,仅最初一个失效,比方:
# Dockerfile
ENTRYPOINT ["python3", "manage.py", "runserver", "0:7979"]
ENTRYPOINT ["python3", "manage.py", "runserver", "0:9898"]
则零碎会运行 最初一条,应用 9898 的端口
ENTRYPOINT 和 CMD 搭配应用
因为 entrypoint 不会被笼罩,所以能够放入不会变的命令
而 CMD 会被前面的参数笼罩,所以能够放入会被更改的数据,比方端口,或者其余会变的配置文件地位
以 Django 零碎为例,咱们能够将 python3 manage.py 这两个命令给 entrypoint,将端口的设置给 CMD,因为端口咱们是能够更改的。
示例如下:
ENTRYPOINT ["python3", "manage.py", "runserver"]
CMD ["0:9898"]
而后咱们从新构建镜像,取得新的 image_id,而后运行容器,加上 CMD 命令更换端口为 9999:
docker run -itd -p 9898:9999 image_id 0:9999
通过下面的命令将零碎运行起来后,还是能够拜访宿主机的 localhost:9898,然而容器外部应用的端口曾经变成了 9999
咱们能够进入容器外部,查看运行的过程,能够看到在容器内曾经是 应用的 9999 端口在运行
docker exec -it container_id bash
ps aux
如果想获取更多后端相干文章,可扫码关注浏览: