经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Docker » 查看文章
Docker实践之python应用容器化
来源:jb51  时间:2019/6/5 11:40:24  对本文有异议

一、前言

  容器使用沙箱机制,互相隔离,优势在于让各个部署在容器的里的应用互不影响,独立运行,提供更高的安全性。本文主要介绍python应用(django)跑在docker容器里,编写dockerfile实现镜像构建自动化以及docker神器compose。

二、编写Dockerfile文件

官网下载的python镜像比较精简,web应用相关依赖还是需要自己安装的。编写Dockerfile,可以让你构建镜像的时候自动化。实例如下:

  1. FROM python:3.6.4
  2.  
  3. RUN mkdir /code &&apt-get update &&apt-get -y install freetds-dev &&apt-get -y install unixodbc-dev
  4. COPY app /code
  5. COPY requirements.txt /code
  6. RUN pip install -r /code/requirements.txt -i https://pypi.douban.com/simple
  7. WORKDIR /code
  8.  
  9. 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 . 命令构建一个名字为 webtest 的镜像,构建完成后返回一个镜像id1dfa2905efac。

  1. [root@CentOS webtest]# ls
  2. app Dockerfile requirements.txt run.sh
  3. [root@CentOS webtest]# docker build -t webtest .
  4. ...
  5. ...
  6. ...
  7. Removing intermediate container 9c510e88e659
  8. Step 6/6 : CMD /bin/bash run.sh
  9. ---> Running in 0bd29255c648
  10. ---> 1dfa2905efac
  11. Removing intermediate container 0bd29255c648
  12. Successfully built 1dfa2905efac
  • app:django项目
  • Dockerfile
  • requirements.txt是项目运行所需要的python库
    • Django
    • djangorestframework
    • pyDes
    • PyMySQL
    • redis
    • requests
    • pymssql
    • pyodbc
    • paramiko
    • psutil

run.sh是运行容器时需要调用的shell脚本

  1. python /code/app/manage.py runserver 0.0.0.0:8000

启动容器,运行刚才构建的镜像。

docker run -it -p 6500:8000 -v /home/code/webtest:/code --name web --restart always --privileged=true webtest

  1. [root@CentOS webtest]# docker run -it -p 6500:8000 -v /home/code/webtest:/code --name web --restart always --privileged=true webtest
  2. Performing system checks...
  3.  
  4. System check identified no issues (0 silenced).
  5.  
  6. You have 15 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
  7. Run 'python manage.py migrate' to apply them.
  8.  
  9. August 09, 2018 - 09:56:51
  10. Django version 2.1, using settings 'ShiHangTool.settings'
  11. Starting development server at http://0.0.0.0:8000/
  12. 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来安装

  1. pip install docker-compose

3.编写docker-compose.yml文件

这是docker-compose.yml主模板格式

  1. version: '3'
  2. services:
  3. web1:
  4. build: .
  5. image: web1
  6. ports:
  7. - "7500:8000"
  8. volumes:
  9. - /home/code/webtest:/code
  10. privileged: true
  11. restart: always

4.运行compose项目

将 dockerfile、requirements.txt、docker-compose.yml、app 文件夹放在同一目录,运行命令 docker-compose up

  1. [root@CentOS webtest]# docker-compose up
  2. Creating network "webtest_default" with the default driver
  3. Building web1
  4. Step 1/6 : FROM python3.6.4-dev
  5. ---> ca46b1ed99ab
  6. Step 2/6 : COPY app /code
  7. ---> f59b9540f8ab
  8. Removing intermediate container e987c66b51f5
  9. Step 3/6 : COPY requirements.txt /code
  10. ---> 2095b64882ac
  11. Removing intermediate container e3099b386727
  12. ...
  13. ...
  14. ...

运行完成后,docker ps查看刚刚启动的容器web1,已经在运行啦

  1. [root@CentOS ~]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. eeab6b5a993b web1 "/bin/bash run.sh" About a minute ago Up 59 seconds 0.0.0.0:7500->8000/tcp webtest_web1_1
  4. 5fb51ce5a51c webtest "/bin/bash run.sh" 23 hours ago Up About an hour 0.0.0.0:6500->8000/tcp web

5.总结

compose把构建镜像,运行容器两个步骤放在一个yml文件里配置,实现自动化部署。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号