购买云服务器(ubuntu系统)

购买服务器后,设置root密码

# 设置两次密码
sodo passwd root
# 切换到root用户
su root

安全组开放博客端口8888

安装docker环境

安装docker

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install docker.io

安装docker-compose

使用如下链接下载安装

sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

修改二进制权限

sudo chmod +x /usr/local/bin/docker-compose

检查docker和docker-compose版本

docker -v
docker-compose -v

设置镜像仓库源

默认的镜像仓库是国外的,拉取镜像的速度很慢,所以为了方便镜像获取,可以更改镜像源,方法是添加一个配置文件

sudo vi /etc/docker/daemon.json

添加信息如下

{ "registry-mirrors": ["https://registry.docker-cn.com"] } 重启容器服务,生效

sudo systemctl daemon-reload 
sudo systemctl restart docker

镜像准备

具体要准备的镜像可以查看我github项目中指定的第三方镜像版本,查看地址为https://gitlab.com/zhangmoumou1/izone-docker/-/blob/master/env.template 具体看到的内容可能如下(以实际为准):

# db
MYSQL_IMAGE=mysql:5.7
MYSQL_ROOT_PASSWORD=python

# redis
REDIS_IMAGE=redis:alpine

# web
IZONE_IMAGE=hopetree/izone:lts
IZONE_MYSQL_NAME=izone

# nginx
NGINX_IMAGE=nginx:stable-alpine
NGINX_PORT=8888

这里我们拉取mysql、redis、nginx、博客代码镜像,镜像依次拉取的命令如下:

docker pull mysql:5.7
docker pull redis:alpine
docker pull nginx:stable-alpine
# 登录拉取izone镜像
docker login ccr.ccs.tencentyun.com --username=100006655230
docker pull ccr.ccs.tencentyun.com/zhangyc_izone/izone:1.0

拉取镜像需要一定的时间,请耐心等待,镜像拉取完成,可以查询一下镜像:

root @ VM - 12 - 6 - ubuntu: ~ / backup  # docker images
REPOSITORY     TAG            IMAGE ID        CREATED          SIZE
izone_web      1.0         c8c9c1272add    23 hours  ago      1.14GB
redis         alpine       435993df2c8d     3 months ago       41MB
mysql          5.7         5107333e08a8     4 months ago       501MB
nginx    stable - alpine   249f59e1dec7    12 months ago      41.1MB

容器化部署

启动服务

首先克隆启动容器的项目izone-docker到本地:

git clone https://gitlab.com/zhangmoumou1/izone-docker.git

然后进入项目

cd izone-docker

查看项目结构,如下:

    [root@zero-0 izone-docker]# ll
total 24
drwxr-xr-x. 2 root root   20 Sep 18 14:37 db
-rw-r--r--. 1 root root 1548 Sep 18 14:37 docker-compose.yml
-rw-r--r--. 1 root root  205 Sep 18 14:37 env.template
-rw-r--r--. 1 root root  910 Sep 18 14:37 izone.env.template
-rw-r--r--. 1 root root 1266 Sep 18 14:37 Jenkinsfile
-rw-r--r--. 1 root root 1065 Sep 18 14:37 LICENSE
drwxr-xr-x. 3 root root   20 Sep 18 14:37 nginx
-rw-r--r--. 1 root root  647 Sep 18 14:37 README.md
drwxr-xr-x. 2 root root   22 Sep 18 14:37 web

此时需要复制默认的模板文件,执行复制命令:

cp env.template .env && cp izone.env.template izone.env

.env 文件决定了使用的镜像,以及izone的端口,基本不需要变动,izone.env是项目的配置文件的环境变量,可以根据自己的需要进行修改(初始可以不用改,等项目运行正常之后再去按需修改即可)。

然后执行容器启动命令:

 docker-compose up

此时可以看到容器运行的输出,此时的容器已经运行了,但是数据还没有初始化,可以直接Ctrl+C断开。

初始化数据

执行数据表创建:

 docker-compose run web python manage.py migrate

继续执行命令,收集静态文件

docker-compose run web python manage.py collectstatic

然后创建一个超级用户

docker-compose run web python manage.py createsuperuser

然后执行重启,把容器放到后台运行:

docker-compose down
docker-compose up -d

看到如下输出就是容器已经在后台运行了:

[root@zero-0 izone-docker]# docker-compose up -d
/usr/lib/python2.7/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 2 is no longer supported by the Python core team. Support for it is now deprecated in cryptography, and will be removed in the next release.
  from cryptography.hazmat.backends import default_backend
Creating network "izone-docker_frontend" with driver "bridge"
Creating network "izone-docker_backend" with driver "bridge"
Creating izone_redis ... done
Creating izone_db    ... done
Creating izone_web   ... done
Creating izone_nginx ... done

此时可以查看容器的运行情况和暴露的端口:

root@VM-12-6-ubuntu:~/backup# docker ps
CONTAINER ID   IMAGE                                            COMMAND                  CREATED        STATUS        PORTS                                                  NAMES
8b8de56ee497   nginx:stable-alpine                              "/docker-entrypoint.…"   22 hours ago   Up 22 hours   0.0.0.0:8888->80/tcp, :::8888->80/tcp                  izone_nginx
a0f8b5babe40   ccr.ccs.tencentyun.com/zhangyc_izone/izone:1.0   "supervisord -n -c s…"   22 hours ago   Up 22 hours                                                          izone_web
17d205d757ca   mysql:5.7                                        "docker-entrypoint.s…"   22 hours ago   Up 22 hours   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   izone_db
cb9c22966079   redis:alpine                                     "docker-entrypoint.s…"   22 hours ago   Up 22 hours   6379/tcp                                               izone_redis

访问平台

访问平台的话使用服务器或者虚拟机的IP+8888端口就可以访问了,至此,平台的容器化部署就完成了。

平台升级

平台的升级是只izone项目代码有更新,需要将更新的内容升级到平台的部署环境的操作。这里可以将更新的内容分为几种类型,每种类型需要进行的操作稍微不同。

只涉及逻辑更新

只涉及逻辑代码的更新是只项目的更新只有一些模板、视图、URL等逻辑的变动,这种更新只需要重新构建镜像然后重新启动izone容器即可,具体操作参考:

构建镜像的操作就不再重复描述了,这里说一下如何使用新镜像重新启动izone容器的操作,进入项目的启动目录izone-docker中,执行命令:

docker-compose restart izone_web

涉及静态文件更新

如果涉及静态文件的变动,也就是css文件,ji文件和图片这些,那么除了重新构建镜像之外并且重新启动容器之外,还需要执行静态文件收集:

docker-compose restart izone_web
docker-compose run  izone_web python manage.py collectstatic

涉及模型变动

如果涉及模型的变动,除了重启容器服务,还需要进行数据迁移:

docker-compose restart izone_web
docker-compose run  izone_web python manage.py migrate

涉及配置变更

如果项目的更新涉及到配置的变动,主要是指的izone.env的变动,则需要按照项目的更新模板izone.env.template来更新izone.env配置,然后重启容器即可。

平台迁移

上面的步骤足够完成新平台的搭建,如果涉及到平台的迁移,比如更换服务器,可以参考下面的步骤进行操作。

数据备份

平台需要备份的数据包括两部分:数据库,静态文件。

可以直接参考我的备份脚本,我一般的都是在平台上面设置成定时任务进行自动备份。

首先是静态文件备份脚本(back_media.sh):

#!/bin/bash

input_dir=/opt/cloud/izone-docker/web
backup_dir=/root/backup/backup_file
maxnum=15
backup_name=media_$(date +'%Y%m%d_%H%M%S').zip
izone_container=izone_web

# 备份 media 目录到指定目录
# cd $input_dir
# zip -r $backup_dir/$backup_name ./media
docker cp $izone_container:$input_dir/media $backup_dir
zip -r $backup_dir/$backup_name $backup_dir/media

function check_files()
{
    cd $backup_dir
    local file_lis=$(ls | grep media.*zip)
    for file in ${file_lis[@]}
    do
        num=$(ls | grep media.*zip | wc -l)
        if [[ $num -lt $maxnum ]]; then
            break
        else
            rm -f $file && echo "remove ${file}"
        fi
    done
    echo "$(ls)"
}

check_files

然后是数据库备份脚本(back_mysql.sh):

#!/bin/bash

backup_dir=/root/backup/backup_file
backup_name=izone_$(date +'%Y%m%d_%H%M%S').sql
maxnum=15
db_name=izone_db

# 执行 db 容器的备份命令
docker exec $db_name sh -c 'exec mysqldump -uroot -p$MYSQL_ROOT_PASSWORD $MYSQL_DATABASE' > ${backup_dir}/${backup_name}
[[ $? -eq 0 ]] && echo "backup $backup_name successfully." || echo "backup $backup_name failed."

# 检查备份文件数量,如果多余最大保存数量,就删除多余的备份
function check_files()
{
    cd $backup_dir
    local file_lis=$(ls | grep izone.*sql)
    for file in ${file_lis[@]}
    do
        num=$(ls | grep izone.*sql | wc -l)
        if [[ $num -lt $maxnum ]]; then
            break
        else
            rm -f $file && echo "remove ${file}"
        fi
    done
    echo "$(ls)"
}

check_files

定时备份(crontab)

执行命令写入定时任务

crontab -e

写入并保存

0 0 * * 1 /root/backup/backup_media.sh
0 0 * * 1 /root/backup/backup_mysql.sh

输入命令,输出存在则已在任务列表中,每周一凌晨0点会执行

crontab -l

拷贝备份数据

将备份数据拷贝到新的平台中,包括数据库备份和静态资源备份,还有项目的环境变量文件(.env和izone.env),这里只有izone.env是自定义的配置,所以只拷贝这个就行。当然,你也应该把备份脚本、Nginx配置等拷贝到新平台。

数据还原

1、还原配置文件

将izone.env文件覆盖项目的izone.env

 mv -f izone.env

2、还原静态文件

执行还原命令,注意根据实际的目录修改命令:

 unzip /root/media_20230918_050001.zip -d /root/izone-docker/web

这个解压会把压缩包中的media目录解压到/root/izone-docker/web中的media,可以解压后查看验证。

3、还原数据库

首先将数据库备份文件复制到mysql容器中,直接放到/tmp目录下面即可:

 docker cp /root/izone_20230918_050001.sql izone_db:/tmp/

然后登录数据库容器:

docker exec -it izone_db bash

然后执行数据库还原命令:

mysql -uroot -p$MYSQL_ROOT_PASSWORD -D $MYSQL_DATABASE --default-character-set=utf8 < /tmp/izone_20230918_050001.sql

执行完成输入exit后退出容器即可。

更新资源

由于静态文件和数据都是导入的,所以需要在Django里面进行更新,执行静态资源收集和搜索索引更新命令:

docker exec -it izone_web python manage.py collectstatic
docker exec -it izone_web python manage.py update_index

然后进入izone-docker的项目中,重启容器:

docker-compose down
docker-compose up -d

此时再访问一下服务器IP+8888端口看看效果,可以看到数据已经完美还原。

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:http://zhangyanc.club/article/django_docker/

许可协议:署名-非商业性使用 4.0 国际许可协议