基于Docker在Centos8云服务部署Django项目

本文章适应于阿里云服务器(Centos8.0)、Django2项目、Docker多容器部署。如果在部署的过程中遇到问题可以QQ联系(610039018)。

一、Docker安装

参考官方文档:https://docs.docker.com/engine/install/centos/

Docker在centos8中安装docker需要三个资源: docker-ce、docker-ce-cli和containered.io。

1.1 安装yum-utils

yum install -y yum-utils

1.2 增加docker.repo源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

1.3 安装containerd.io

由于在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编写的。

1.4 安装docker

yum install -y docker-ce docker-ce-cli

1.5 启动docker服务

systemctl enable docker
systemctl start docker

如果启动成功,则可以通过docker -vdocker version命令查看版本信息。

1.6 docker加速

可以为docker配置aliyun的加速器,可以在阿里云注册用户后可以免费获取镜像加速度的地址。

编辑/etc/docker/daemon.json, 内容如下:

{
  "registry-mirrors": ["https://oj1asep7.mirror.aliyuncs.com"]
}

编辑完成后,执行如下命令:

systemctl daemon-reload
systemctl restart docker

1.7 创建network桥接

因为项目中使用了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

二、MySQL部署

2.1 下载镜像

docker pull mysql

默认拉取的是mysql 8 的数据库。可以通过docker images命令查看。

2.2 运行MySQL

运行镜像时,指定端口、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命令进入容器中。

2.3 执行init.sql脚本

由于项目启动前,需要执行初始化的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构建镜像

3.1 Dockerfile文件

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目录中。

3.2 init.sh文件

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

3.3 run.sh文件

run.sh文件是项目镜像构建成功后,启动镜像后运行容器的命令,内容如下:

#!/bin/bash
gunicorn EQMS.wsgi:application -w 2 -b 0.0.0.0:8000

3.4 build项目镜像

通过cd切换到Dockerfile所在的项目目录下,执行如下命令:

docker build -t eqoa:latest .

【提示】在构建的过程中,会出现一些警告,不影响整体进度。如果构建成功,则可以通过docker images命令查看镜像列表中存在eqoa

3.5 运行镜像

docker run -itd --name oa1 -p 8000:8000 --network oanet -v /projects/EQMS/:/usr/src eqoa

四、Nginx部署

4.1 下载nginx镜像

docker pull nginx

4.2 编辑配置文件

在/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;
    }
}

4.3 启动nginx服务

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": {}
    }
]

五、错误技巧

如果出现容器启动失败的情况,可以查看日志,或进入容器中进行调试。

5.1 查看nginx日志

docker logs nginx

可以查看到相关的错误,如文件不存、请求路径出错或default.conf文件格式错误等。

5.2 查看项目日志

docker logs oa1

可以查看gunicorn启动项目的信息。

5.3 查看端口

最简单的命令是lsof(list open files), 它是一个列出当前系统打开文件的工具,用法如下:

lsof -i:80

也可以使用netstate命令,用法如下:

netstat -tunlp|grep 80
  • -t (tcp) 仅显示tcp相关选项
  • -u (udp)仅显示udp相关选项
  • -n 拒绝显示别名,能显示数字的全部转化为数字
  • -l 仅列出在Listen(监听)的服务状态
  • -p 显示建立相关链接的程序名

你可能感兴趣的:(Docker项目部署)