本文章适应于阿里云服务器(Centos8.0)、Django2项目、Docker多容器部署。如果在部署的过程中遇到问题可以QQ联系(610039018)。
参考官方文档:https://docs.docker.com/engine/install/centos/
Docker在centos8中安装docker需要三个资源: docker-ce、docker-ce-cli和containered.io。
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
由于在centos8中安装docker时,需要依赖容器服务containerd.io,默认情况下版本较低,需要提前安装,命令如下:
dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
【提示】CentOS8启用了DNF作为系统软件包管理工具,它是yum的一个更新版本。它优化了性能和内存及速度等,同时DNF是Python编写的。
yum install -y docker-ce docker-ce-cli
systemctl enable docker
systemctl start docker
如果启动成功,则可以通过docker -v
或docker version
命令查看版本信息。
可以为docker配置aliyun的加速器,可以在阿里云注册用户后可以免费获取镜像加速度的地址。
编辑/etc/docker/daemon.json, 内容如下:
{
"registry-mirrors": ["https://oj1asep7.mirror.aliyuncs.com"]
}
编辑完成后,执行如下命令:
systemctl daemon-reload
systemctl restart docker
因为项目中使用了MySQL服务,为了可以使得容器之间可以相互连接,需要在容器创建时,指定桥接网络--network
,同在一个桥接网络的容器之间可以相互访问。
创建oanet桥接的命令如下:
docker network create oanet
可以通过docker network
命令查看相关的桥接操作。如下所示:
[root@iZm5e169m15n5ykmff2r2rZ ~]# docker network
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
docker pull mysql
默认拉取的是mysql 8 的数据库。可以通过docker images
命令查看。
运行镜像时,指定端口、root用户的口令和相关资源目录。
docker run -itd --network oanet --name dbserver -p 3306:3306 -v /opt/mysql/sql:/opt/sql -e MYSQL_ROOT_PASSWORD=root mysql
-v
指定本机的sql资源目录和容器同步接收的目录(容器启动后会自动创建)
-e
指定MySQL的root用户的口令,本案例指定是root。
--name
指定本次启动镜像的容器名称(实例名称,唯一名称)
-itd
表示异步启动,启动后可以通过docker exec -it dbserver bash
命令进入容器中。
由于项目启动前,需要执行初始化的sql脚本(项目提交的文件目录中包含初始化脚本)。初始化sql脚本有两种方式,一种是在项目代码中执行,一种是手动在数据库客户中执行【本次使用方案】。
将init.sql脚本复制到/opt/mysql/sql
目录中,docker服务会自动将此脚本同步到容器中。
我的项目资源存放在/projects/xxxpro
,复制资源的命令如下:
cp /projects/xxxpro/init.sql /opt/mysql/sql/
进入容器并执行sql脚本,命令如下:
docker exec -it dbserver bash
bash # mysql -uroot -proot
mysql> source /opt/sql/init.sql
Dockerfile是用于构建项目镜像,内容如下:
FROM ubuntu
MAINTAINER disenQF [email protected]
ADD . /usr/src/
WORKDIR /usr/src
RUN ./init.sh
CMD /usr/src/run.sh
【注意】Dockerfile是文件名,它的位置在项目目录中。
ADD
命令是将当前项目目录文件复制到ubuntu镜像启动的容器(临时的)/usr/src
目录中。
init.sh文件主要针对ubuntu镜像(版本18.04, 大小64M左右)安装Python3.6环境和安装项目依赖包做准备的,内容如下:
#!/bin/bash
cat sources.list > /etc/apt/sources.list
apt update
apt upgrade -y
apt install python3 python3-pip -y
apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev -y
pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
pip3 install gunicorn -i https://mirrors.aliyun.com/pypi/simple
sources.list文件是为ubuntu镜像安装包时准备的阿里云的源配置文件,内容如下:
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
run.sh文件是项目镜像构建成功后,启动镜像后运行容器的命令,内容如下:
#!/bin/bash
gunicorn EQMS.wsgi:application -w 2 -b 0.0.0.0:8000
通过cd切换到Dockerfile所在的项目目录下,执行如下命令:
docker build -t eqoa:latest .
【提示】在构建的过程中,会出现一些警告,不影响整体进度。如果构建成功,则可以通过docker images
命令查看镜像列表中存在eqoa
。
docker run -itd --name oa1 -p 8000:8000 --network oanet -v /projects/EQMS/:/usr/src eqoa
docker pull nginx
在/opt/nginx/目录下编写default.conf配置文件,内容如下:
upstream oaserver {
server oa1:8000;
}
server {
listen 80;
server_name localhost;
charset utf-8;
access_log /var/log/nginx/access.log;
location /s/ {
alias /opt/static/;
}
location / {
proxy_pass http://oaserver;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
docker run -itd --name nginx -p 80:80 --network oanet -v /opt/nginx:/etc/nginx/conf.d/ -v /projects/EQMS/static:/opt/static nginx
【注意】容器之间的网络通信,使用是容器名,因此在django项目中的settings.py文件中,将连接服务地址改成容器名,如下所示:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'eqoa',
'HOST': 'dbserver',
'PORT': 3306,
...
}
}
可以通过docker network inspect oanet
命令查看桥接网络下的包含哪些容器连接,如下所示:
[root@iZm5e169m15n5ykmff2r2rZ ~]# docker network inspect oanet
[
{
"Name": "oanet",
"Id": "8c3ac51d4fb26ab51aa0aa4a10eaa1e230123253619dd2a7bc3e5829736548a7",
"Created": "2020-04-09T11:46:29.426117364+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"71b2c96436f2b3168ba5478104cce417dcd2b742494f7764e13f0b3161788771": {
"Name": "cachedb",
"EndpointID": "ad9fdad8d4d3ca50d0fa4c91d6814521978af2f97114daff60881fd2832277b6",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
},
"8ee5c95e66c7b71a09cc7a3e7fea698d29a961a4f8aab3283946b6413a44a067": {
"Name": "oa1",
"EndpointID": "57c40276bc07d9a2a2b9930f25ba35791e187e58f028c2b0334bf6e4758c8a80",
"MacAddress": "02:42:ac:12:00:05",
"IPv4Address": "172.18.0.5/16",
"IPv6Address": ""
},
"dcc2d8097327b74241b5fad977d24fbd56147a7c9dacb7526f73802f55c51527": {
"Name": "nginx",
"EndpointID": "7485bc09ba3c28cf524b1743df05e21f437eb49b87f24e33ebf81aae1781cf5e",
"MacAddress": "02:42:ac:12:00:04",
"IPv4Address": "172.18.0.4/16",
"IPv6Address": ""
},
"fa9d64805b37307eef79d4526a2208686c268d767b97b9f0b48d79159a806e8e": {
"Name": "dbserver",
"EndpointID": "8b0c28c8ebddbd26883363e0bba787772b6901a31789f52ff66fc54a3a807903",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
如果出现容器启动失败的情况,可以查看日志,或进入容器中进行调试。
docker logs nginx
可以查看到相关的错误,如文件不存、请求路径出错或default.conf文件格式错误等。
docker logs oa1
可以查看gunicorn启动项目的信息。
最简单的命令是lsof(list open files), 它是一个列出当前系统打开文件的工具,用法如下:
lsof -i:80
也可以使用netstate命令,用法如下:
netstat -tunlp|grep 80