一, 前言
容器使用沙箱机制, 互相隔离, 优势在于让各个部署在容器的里的应用互不影响, 独立运行, 提供更高的安全性. 本文主要介绍 python 应用 (django) 跑在 docker 容器里, 编写 dockerfile 实现镜像构建自动化以及 docker 神器 compose.
二, 编写 Dockerfile 文件
官网下载的 python 镜像比较精简, web 应用相关依赖还是需要自己安装的. 编写 Dockerfile, 可以让你构建镜像的时候自动化. 实例如下:
- FROM python:3.6.4
- RUN mkdir /code \
- &&apt-get update \
- &&apt-get -y install freetds-dev \
- &&apt-get -y install unixodbc-dev
- COPY app /code
- COPY requirements.txt /code
- RUN pip install -r /code/requirements.txt -i https://pypi.douban.com/simple
- WORKDIR /code
- CMD ["/bin/bash","run.sh"]
FROM:Dockerfile 中的一个非常重要的命令, 作用是指定一个基础镜像来进行构建流程. 比如上面指定了 python3.6.4 作为基础镜像, 后续的一切操作都会以这个镜像作为基础来进行定制, 如果不存在, 会从官网下载. FROM 必须是 Dockerfile 首个命令.
RUN :Dockerfile 执行命令最核心的部分, 在构建镜像的过程中执行参数.
COPY: 复制文件. COPY <源路径> <目标路径>
WORKDIR: 工作目录, 若不存在, 会自动帮你创建.
CMD: 容器启动命令, Docker 不是虚拟机, 容器就是进程. 既然是进程, 那么在启动容器的时候, 需要指定所运行的程序及参数. CMD 指令就是用于指定默认的容器主进程的启动命令. 如果 docker run 指定了命令参数, 这里的 cmd 将不会起作用. 例如 docker run -it -name redis docker.io/redis /bin/bash, 启动容器不会执行 dockerfile 中的 cmd, 因为 docker run 已经指定了命令参数 / bin/bash.
三, 构建镜像
docker build[OPTIONS]上下文路径 | URL
[OPTIONS]: 通常指令包括 - t, 用来指定 image 的名字.-f 指定 Dockfile 的上下文路径.
上下文路径 | URL: 上下文路径, 如果只有一个小圆点 "." 代表当前目录.
docker bulid -t webtest . 命令构建镜像, 构建完成后返回一个镜像 id 1dfa2905efac .
- [root@CentOS webtest]# ls
- app Dockerfile requirements.txt run.sh
- [root@CentOS webtest]# docker build -t webtest .
- ...
- ...
- ...
- Removing intermediate container 9c510e88e659
- Step 6/6 : CMD /bin/bash run.sh
- ---> Running in 0bd29255c648
- ---> 1dfa2905efac
- Removing intermediate container 0bd29255c648
- Successfully built 1dfa2905efac
app:django 项目
Dockerfile
requirements.txt 是项目运行所需要的 python 库
- Django
- djangorestframework
- pyDes
- PyMySQL
- redis
- requests
- pymssql
- pyodbc
- paramiko
- psutil
- View Code
run.sh 是运行容器时需要调用的 shell 脚本
- python /code/app/manage.py runserver 0.0.0.0:8000
- View Code
四, 运行容器
启动容器, 运行刚才构建的镜像.
- docker run -it -p 6500:8000 -v /home/code/webtest:/code --name web --restart always --privileged=true web
- [root@CentOS webtest]# docker run -it -p 6500:8000 -v /home/code/webtest:/code --name web --restart always --privileged=true web
- Performing system checks...
- System check identified no issues (0 silenced).
- You have 15 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
- Run 'python manage.py migrate' to apply them.
- August 09, 2018 - 09:56:51
- Django version 2.1, using settings 'ShiHangTool.settings'
- Starting development server at http://0.0.0.0:8000/
- Quit the server with CONTROL-C.
-p: 把容器的 8000 端口映射到宿主机 6500
-v: 主机的目录 / home/code/webtest 映射到容器的目录 / code
--name: 给容器起个名字 web,webtest 是我们刚刚构建的镜像
--restart:always 容器退出时总是重启
--privileged=true: 执行容器内文件需要的权限
输入 ip:6500/Home/OrderSettle-K8S/
运行成功!
五, compose
是否觉得上面的操作太过复杂, 如果能自动化部署就好了. 不要着急, compose 能够帮到你
1. 简介:
compose 是 docker 官方开源项目, 用于 docker 集群的快速编排. compose 通过 docker-compose.yml 文件定义和运行一个或多个容器. 是 fig 的升级版.
2. 安装:
compose 是通过 python 编写的, 调用了 docker 提供的 API 对容器进行管理. so 可以通过 python 管理工具 pip 来安装
pip install docker-compose
3. 编写 docker-compose.yml 文件
这是 docker-compose.yml 主模板格式
- version: '3'
- services:
- web1:
- build: .
- image: web1
- ports:
- - "7500:8000"
- volumes:
- - /home/code/webtest:/code
- privileged: true
- restart: always
4. 运行 compose 项目
运行命令 docker-compose up
- [root@CentOS webtest]# docker-compose up
- Creating network "webtest_default" with the default driver
- Building web1
- Step 1/6 : FROM python3.6.4-dev
- ---> ca46b1ed99ab
- Step 2/6 : COPY app /code
- ---> f59b9540f8ab
- Removing intermediate container e987c66b51f5
- Step 3/6 : COPY requirements.txt /code
- ---> 2095b64882ac
- Removing intermediate container e3099b386727
- ...
- ...
- ...
运行完成后, docker ps 查看刚刚启动的容器 web1, 已经在运行啦
- [root@CentOS ~]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- eeab6b5a993b web1 "/bin/bash run.sh" About a minute ago Up 59 seconds 0.0.0.0:7500->8000/tcp webtest_web1_1
- 5fb51ce5a51c web "/bin/bash run.sh" 23 hours ago Up About an hour 0.0.0.0:6500->8000/tcp web
5. 总结
compose 把构建镜像, 运行容器两个步骤放在一个 yml 文件里配置, 实现自动化部署. 上面的例子可能不够明显, 如果运行的是多个容器, 就会发现 compose 能很大的节省你的时间.
来源: https://www.cnblogs.com/shenh/p/9518343.html