这里楼主使用的是centos7环境。
1、如果大家环境上还有旧版本docker的,需要先去卸载执行如下:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
2、然后使用如下脚本命令安装:
curl -sSL https://get.docker.com/ > get-docker.sh
sh get-docker.sh --mirror Aliyun #使用阿里云源
或者使用:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
3、等待安装完成之后,设置docker开机启动,以及启动docker服务:
systemctl enable docker #设置默认开机启动
systemctl start docker #启动docker
4、然后检查docker是否安装成功
docker --version
5、紧接着配置国内镜像源,加快下载镜像速度,在
vi /etc/docker/daemon.json
写入如下,输入 :wq
保存退出。
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com",
"https://hub-mirror.c.163.com",
"https://mirror.ccs.tencentyun.com",
"https://reg-mirror.qiniu.com"
]
}
6、然后执行此配置,重启docker服务。
systemctl daemon-reload
systemctl restart docker
7、开始拉取镜像,这里先拉取mysql的镜像,输入如下,等待安装完成。
docker pull mysql:5.7.36
8、使用如下命令查看,出现下图则已拉取成功。
docker images
9、先创建一个目录,然后填写配置my.cnf文件。
mkdir docker_mysql_server #创建一个目录
vi /root/docker_mysql_server/my.cnf #进入配置
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
# 作用是禁止域名解析:在mysql的授权表中就不能使用主机名了,只能使用IP
skip-name-resolve
# 设置3306端口
port = 3306
#设置远程访问ip
bind-address=0.0.0.0
# 设置mysql数据库的数据的存放目录
datadir=/var/lib/mysql
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#设置查询操作等不区分大小写
lower_case_table_names=1
10、然后使用如下命令启动一个mysql镜像容器:
docker run -it -d -p 3306:3306 \
-v /root/docker_mysql_server/log:/var/log/mysql \
-v /root/docker_mysql_server/data:/var/lib/mysql \
-v /root/docker_mysql_server/my.cnf:/var/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name the_mysql \
-e TZ=Asia/Shanghai \
--privileged=true \
--restart=always \
mysql:5.7.36
其中
-it -d -i指的是用于控制台交互,-t支持终端登录,通常和-i参数一起使用,-d为后台运行 -p 用于对外映射容器端口,用法:-p 宿主机端口:容器端口 -v 用于挂载容器目录路径,内外共享目录,用法:-v 宿主机路径:容器路径 -e 用于设置容器环境变量相关配置,用法 -e 环境变量名=变量值 --name 用于指定容器的名称,不是必填项,但是这里需要填写,方便后面配置参数 -e TZ=Asia/Shanghai 设置时区为国内 --privileged=true 使root用户在容器内真正具有root权限 --restart=always 设置容器开机自启 --rm 设置停止容器后删除掉容器 如果已经启动了没有开启自启动,可以追加命令 docker update --restart=always 容器名/id
11、输入如下,出现如下,则成功启动。
docker ps
12、然后输入如下,进入容器内部。
docker exec -it 容器名/容器id bash
使用 mysql -uroot -p
然后输入刚刚设置的密码123456登录。
13、这时候可以输入命令,建立后端数据库,输入
CREATE DATABASE `your_db_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql容器默认root带有远程权限,如果还需要创建远程用户的可以输入
grant all privileges on *.* to '用户名'@'%' identified by '密码';
开始拉取nginx镜像
1、输入
docker pull nginx
拉取最新的nginx镜像,等待安装完成。
2、输入
docker images
查看是否拉取下来。
3、然后开始启动nginx容器,创建一个存配置的文件夹,
mkdir docker_nginx_server
4、这里先是启动容器,参数带好--rm,停止容器时删掉,然后去容器内部查看配置文件目录,然后复制出来,再重新启动新容器挂载文件夹,输入:
docker run -it -d -p 80:80 --rm -e TZ=Asia/Shanghai --name the_nginx nginx
5、输入如下,查看是否启动成功。
docker ps
6、浏览器输入云主机ip,出现如下,则证明启动成功。
7、然后进入容器内部查看配置文件,方便配置环境,这里楼主直接写出了。
/etc/nginx #nginx内部配置文件目录
/usr/share/nginx/html #静态文件目录
/var/log/nginx #运行日志目录
8、然后开始配置,从容器内目录复制到本地来。
docker cp the_nginx:/etc/nginx/ /root/docker_nginx_server/nginx_conf #映射配置环境
docker cp the_nginx:/usr/share/nginx/html ./docker_nginx_server/html #映射静态文件目录
docker cp the_nginx:/var/log/nginx ./docker_nginx_server/log #映射运行日志目录
其中命令格式为: docker cp 容器名/ID:容器目录 本地目录
开始重新挂载目录,实现实时共享目录。
9、停止掉nginx容器,输入命令:
docker stop the_nginx
然后再重新启动,以挂载目录方式。
docker run -it -d -p 80:80 --name the_nginx \
-v /root/docker_nginx_server/nginx_conf:/etc/nginx \
-v /root/docker_nginx_server/html:/usr/share/nginx/html \
-v /root/docker_nginx_server/log:/var/log/nginx \
-e TZ=Asia/Shanghai \
--restart=always \
nginx
10、然后把前端文件拷贝到
cp -r /本地前端文件路径/* /root/docker_nginx_server/html
11、配置后端服务,
vi /root/docker_nginx_server/nginx_conf/conf.d/default.conf
输入如下到server块中
location /api/ {
include /etc/nginx/uwsgi_params; #注意,这里填的是容器内部的绝对路径
uwsgi_pass 127.0.0.1:9001; #后面还要改
}
开始配置后端服务:
这里使用的是py3环境+uwsgi,所以先拉取python3镜像。
1、输入
docker pull python:3.9.9
2、然后使用
docker images
查看是否下载成功。
3、开始运行py3容器。输入如下
docker run -it -d --name the_uwsgi \
-v /pycode_s1/pytestcode:/py_code \
-e TZ=Asia/Shanghai \
--restart=always \
python:3.9.9
其中 -v 是把本地存放后端代码目录映射到py3容器内部的新开辟的目录
,这里不需要对外映射端口,前端服务器 和 数据库 对外映射即足够。
4、输入
docker ps
查看是否运行成功。
5、这里记得把后端代码的 uwsgi.ini 文件里,通信模式改为 socker = 0.0.0.0:9001
。
6、使用 git pull
拉取一下更新,嫌麻烦的同学可以直接本地自己vim改了。
7、进入后端容器配置需要的依赖库,输入
docker exec -it the_uwsgi bash
进入到刚刚挂载的目录 cd py_code
8、然后执行如下,用的是国内的清华源。
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn
成功安装。
9、安装完依赖包后使用,(代码里的settings下的数据库ip要对准好mysql容器的ip,查看容器ip: docker network inspect bridge
the_mysql的ip,然后vi进入代码修改)
python manage.py makemigrations #生成迁移文件
python manage.py migrate #执行迁移文件
python manage.py runserver #启动
生成迁移文件,在执行迁移文件,最后输入测试是否能启动。
10、然后开始安装uwsgi服务,输入
pip install uwsgi -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn
等待安装成功,如下图。
11、然后使用
uwsgi uwsgi.ini #启动uwsgi服务
ps -ef |grep uwsgi #查看进程是否启动
启动uwsgi服务。然后使用查看是否启动成功。(配置文件uwsgi.ini可参考另一篇Django本地部署教程)
12、查看
tail -n 20 uwsgi.log
查看是否成功启动服务。
这里楼主为了防止关机后容器启动,容器的ip改变,所以自定义一个bridge网络模式。
13、输入
docker network create mynet
创建一个自定义网络。
14、输入
docker network ls
查看是否建立成功。
15、然后把运行的容器加入到此网络中,依此执行命令如下
docker network connect mynet the_nginx #加入到新网络
docker network connect mynet the_uwsgi
docker network connect mynet the_mysql
docker network disconnect bridge the_nginx #从原网络断开
docker network disconnect bridge the_uwsgi
docker network disconnect bridge the_mysql
16、查看新网络是否加入成功。
docker network inspect mynet #查看某个容器网络
docker network ls #查看所有的容器网络
出现则加入成功。
17、查看原网络是否断开连接执行
docker network inspect bridge
18、然后修改配置,然后修改配置,后端连接数据库ip改成此时的数据库的容器名the_mysql,本地ide修改 git push
,然后云主机 git pull
即可, 然后nginx也配置改成后端服务的容器名即可,如下。docker会自动去解析这个容器别名到对应的容器ip,所以不用担心重启容器ip改变的问题。(嫌麻烦同学本地vim修改即可,不用在修改拉取)
19、重新启动,即可。
docker restart the_nginx
20、访问云服务主机ip看到前端页面,能交互即可成功。
可能出现的问题:
1、启动uwsgi发现端口被占用
2、执行如下,杀掉进程。
pkill -9 -f uwsgi
3、也可以执行如下。
apt-get install -y psmisc #容器内先下载该命令
fuser -k 9001/tcp #杀死占用端口进程