购买云服务器(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=123456
# redis
REDIS_IMAGE=redis:alpine
# web
IZONE_IMAGE=ccr.ccs.tencentyun.com/zhangyancheng/public_izone:1.0
IZONE_MYSQL_NAME=izone
# nginx
NGINX_IMAGE=nginx:stable-alpine
NGINX_PORT=80
这里我们拉取mysql、redis、nginx、博客代码镜像,镜像依次拉取的命令如下:
docker pull mysql:5.7
docker pull redis:alpine
docker pull nginx:stable-alpine
# 登录拉取izone代码镜像(博主个人镜像)
docker pull ccr.ccs.tencentyun.com/zhangyancheng/public_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 国际许可协议