基于Docker的Apache-Django-Mysql应用容器化 使用Dockerfile+compose的方式实战部署Django项目
安装docker与compose,准备需要用到的 image 这里在centos7上安装,详细过程看前面文章,这里只记录版本号 docker版本信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 [root@centos-7 ~ ]Client: Docker Engine - Community Version: 19.03 .2 API version: 1.40 Go version: go1.12.8 Git commit: 6a30dfc Built: Thu Aug 29 05 :28:55 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03 .2 API version: 1.40 (minimum version 1.12 ) Go version: go1.12.8 Git commit: 6a30dfc Built: Thu Aug 29 05 :27:34 2019 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.2 .6 GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb runc: Version: 1.0 .0 -rc8 GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f docker-init: Version: 0.18 .0 GitCommit: fec3683
compose 版本信息
1 2 3 4 5 [root@centos -7 ~]# docker-compose version docker-compose version 1.24 .1 , build 4667896 b docker-py version : 3.7 .3 CPython version : 3.6 .8 OpenSSL version : OpenSSL 1.1 .0 j 20 Nov 2018
查找Docker Hub上的mysql镜像
1 2 docker search mysql docker search centos
拉取官方的镜像
国内访问 hub.docker.com 网速不好,建议配置阿里云加速或网易云加速
1 2 3 docker pull mysql:5 .7 docker pull centos:6 .8
准备文件结构docker文件夹目录结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 └── docker │ ├── docker-compose.yml ├── Dockerfile │ └── work └── html │ └── dist │ └── PmsService │ └── httpd │ ├── PmsService.conf │ └── mod_wsgi.conf │ └── mysql
构建httpd+django容器的Dockerfile 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 FROM centos:6.8 LABEL version="1.0" LABEL author=keker LABEL description="httpd+wsgi+django" RUN (cd /lib/ systemd/system/ sysinit.target.wants/; for i in *; do [ $i == \ systemd-tmpfiles-setup.service ] || rm -f $i ; done); \ rm -f /lib/ systemd/system/mu lti-user.target.wants/*;\ rm -f /etc/ systemd/system/ *.wants/*;\ rm -f /lib/ systemd/system/ local-fs.target.wants/*; \ rm -f /lib/ systemd/system/ sockets.target.wants/*udev*; \ rm -f /lib/ systemd/system/ sockets.target.wants/*initctl*; \ rm -f /lib/ systemd/system/ basic.target.wants/*;\ rm -f /lib/ systemd/system/ anaconda.target.wants/*; RUN yum -y update && yum clean all && yum -y install epel-release \ && yum --enablerepo=epel install -y python-pip \ && yum install -y gcc libffi-devel python-devel openssl-devel \ && yum install -y mysql-devel python-devel python-setuptools \ && yum -y install httpd* \ && pip install -i https:// pypi.tuna.tsinghua.edu.cn/simple django==1.6 .2 \ && pip install -i https:// pypi.tuna.tsinghua.edu.cn/simple djangorestframework==2.3 .14 \ && pip install MySQL-python && pip install mod_wsgi && mod_wsgi-express install-module \ && chkconfig --level 2345 httpd on EXPOSE 80 EXPOSE 8007 CMD ["sh" , "-c" , "service httpd start;bash" ]
编辑wsgi配置文件 mod_wsgi.conf 1 2 LoadModule wsgi_module "/usr/lib64/httpd/modules/mod_wsgi-py26.so" WSGIPythonHome "/usr"
编辑httpd配置文件 PmsService.conf 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 Listen 8007 <VirtualHost *:8007 > WSGIScriptAlias / "var/www/html/PmsService/PmsService/wsgi.py" ServerName www.pmsservice.com Alias /static /var/www/html/PmsService/static <Directory "/var/www/html/PmsService" > Order Allow ,Deny Allow from all </Directory> </VirtualHost> <VirtualHost *:80 > DocumentRoot /var/www/html/dist <Directory /var/www/html/dist> Order Allow ,Deny Allow from All </Directory> </VirtualHost>
注意,Django项目的setting.py中连接数据库处要写成数据库容器名“db”
1 2 3 4 5 6 7 8 9 10 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'haerbinxi_users', 'USER': 'root', 'PASSWORD': 'keker@168168 ', 'HOST': 'db', # 此处与docker-compose.yml处一致,不可写成ip地址 'PORT': '3306 ', },
编写docker-compose.yml配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 # docker-compose版本 version: '3' # 服务 services: web: # 构建镜像 build: . # 运行容器的名称 container_name: webservice # 允许后台运行 tty: true # 端口映射 ports: - "80:80" - "8007:8007" # 挂载卷 # 项目文件和apache配置文件本地持久化挂载卷 volumes: - ~/docker/ work/html:/var/ www/html - ~/docker/ work/httpd:/etc/ httpd/conf.d # 依赖db服务,先启动db再启动web depends_on: - db # 宕机即重启 restart: always # 连接数据库 links: - db db: # 拉取镜像 image: mysql:5.7 # 运行容器的名称 container_name: mysql # 环境变量 数据库密码需要复杂密码,简单密码导致无法连接数据库(1045错误) environment: - MYSQL_ROOT_PASSWORD=keker@168168 # 端口映射 ports: - "3306:3306" # 宕机即重启 restart: always # 挂载卷 volumes: # 数据库本地持久化挂载卷 - ~/docker/ work/mysql:/var/ lib/mysql
在docker-compose所在目录docker/ 构建、启动项目 构建项目
启动项目
使用Navicat 导入项目数据库后就可以在浏览器访问web网页了 关闭项目
项目打包迁移部署 保存镜像到tar文件 1 2 3 docker save docker_web > docker_web.tardocker save mysql:5 .7 > mysql:5 .7 .tar
在目标目标主机安装好docker以及compose 把打包好的镜像拷贝到目标主机用户目录下,减压本地镜像包
1 2 3 docker load < docker_web.tardocker load < mysql:5 .7 .tar
目标主机启动项目 将打包好的docker文件夹拷贝到目标主机的用户目录下 windows下需要修改docker-compose挂载卷的本地目录 在docker文件夹下使用下面命令启动项目