Docker实战-基于Docker的Apache-Django-Mysql应用容器化

基于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 ~]# docker version
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 4667896b
docker-py version: 3.7.3
CPython version: 3.6.8
OpenSSL version: OpenSSL 1.1.0j 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 # docker-compose 配置文件
├── Dockerfile # 构建httpd+django容器的Dockerfile
│  
└── work
└── html # 项目代码源文件本地持久化
│ └── dist # Angular前端
│ └── PmsService # Django后端

└── httpd
│  ├── PmsService.conf # httpd配置文件
│ └── mod_wsgi.conf # wsgi配置文件

└── 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"

# centos:7和centos:latest基本容器中都包含Systemd,但是默认情况下它不处于活动状态。
# 为了使用systemd,您将删除了许多可能导致问题的文件

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/multi-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/*;


# yum 更新/安装pip源/安装环境软件
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

# 开机启动 apache 服务
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
# 主配置文件已经默认监听80端口,此处重复监听会报错

# 后端服务
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/ 构建、启动项目

构建项目

1
2
docker-compose build

启动项目

1
2
docker-compose up -d

使用Navicat 导入项目数据库后就可以在浏览器访问web网页了

关闭项目

1
2
docker-compose down

项目打包迁移部署

保存镜像到tar文件

1
2
3
docker save docker_web > docker_web.tar
docker save mysql:5.7 > mysql:5.7.tar

在目标目标主机安装好docker以及compose
把打包好的镜像拷贝到目标主机用户目录下,减压本地镜像包

1
2
3
docker load < docker_web.tar
docker load < mysql:5.7.tar

目标主机启动项目

将打包好的docker文件夹拷贝到目标主机的用户目录下
windows下需要修改docker-compose挂载卷的本地目录
在docker文件夹下使用下面命令启动项目

1
2
docker-compose up -d


Docker实战-基于Docker的Apache-Django-Mysql应用容器化
http://www.keker.top/2019/09/15/tools/docker/Docker实战-Apache-Django-Mysql容器化/
作者
Keker
发布于
2019年9月15日
许可协议