关于后端:Docker笔记三之运行Django系统

35次阅读

共计 3711 个字符,预计需要花费 10 分钟才能阅读完成。

本文首发于微信公众号:Hunter 后端

原文链接:Docker 笔记三之运行 Django 零碎

这一篇笔记介绍一下如何应用 Docker 运行 Django 零碎。

流程大略是这样,拉取一个 python 镜像,而后将咱们的 Django 零碎放到该镜像中构建一个新的镜像,运行新镜像产生的容器就有咱们的 Django 服务了。

以下是本篇笔记目录:

  1. 镜像和零碎筹备
  2. Dockerfile 筹备
  3. 构建镜像
  4. 运行容器
  5. 其余 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 的内容是:

  1. FROM 命令:在 python:3.6 的根底镜像上操作
  2. RUN 命令:在镜像内创立 /hunter 文件夹
  3. WORKDIR 命令:指定镜像内工作目录为 /hunter
  4. ADD 命令:将宿主机的 requirements.txt 文件复制到镜像内 /hunter 目录下
  5. RUN 命令:在镜像内进入 /hunter 文件夹下
  6. RUN 命令:在镜像内依据 /hunter 文件夹下的 requirements.txt 文件装置 python 依赖
  7. ADD 命令:将宿主机的 Django 系统文件整个复制到镜像内的 /hunter 文件夹下
  8. 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

如果想获取更多后端相干文章,可扫码关注浏览:

正文完
 0