这两天要把python项目部署到gongan内网,下面来简要记录一下这次部署遇到的各种问题。由于内网不能上网,遇到的各种问题不能截图或者直接复制粘贴,只能是部分零零散散的手机拍照
由于内网不能访问互联网,导致好多依赖和环境不能安装,所有就选择来用docker部署项目
1,先下载centos7版本的docker离线安装包。到时候跟打包好的镜像一起拷贝到内网
ps:互联网的文件放到内网很麻烦,有2个U盘,通过专门的渠道把文件放到内网上,后续数据传输将通过ftp服务器传输。
2,把python、uWSGI、requirements.txt打包成docker镜像
在flask项目根目录下创建Dockerfile
FROM alpine:3.9
WORKDIR /app
COPY ./requirements.txt /app
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
apk update && \
apk add python3 py3-pip python3-dev git gcc g++ linux-headers libstdc++ libffi-dev&& \
apk add uwsgi-python3 tzdata libxml2-dev libxslt-dev openssl-dev && \
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone && \
pip3 install --index-url=http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements.txt && \
apk del py3-pip python3-dev git tzdata gcc g++ linux-headers && \
cd / && \
rm -rf /app ~/.cache/pip /var/cache/apk/*
在当前Dokcerfile目录下运行:docker build -t balz:20191111 .
导出镜像:docker save balz:20191111 > balz.tar
3,分别下载nginx、mysql、redis的镜像,直接docker pull 就能下载,centos7宿主机先安装docker,之后docker load 加载镜像
docker images 查看镜像
4,docker运行mysql容器
docker run -d -p 3306:3306
--restart=always
-e MYSQL_ROOT_PASSWORD="root"
-e MYSQL_USER="myroot"
-e MYSQL_PASSWORD="myroot"
--name mysql
-v /var/lib/mysql:/var/lib/mysql
-v /etc/mysql/conf.d/mysql.conf:/etc/mysql/conf.d/mysql.conf mysql:latest
# -v /var/lib/mysql:/var/lib/mysql
把宿主机的目录挂载到容器的/var/lib/mysql目录下,把mysql的数据放在宿主机的目录下
# -v /etc/mysql/conf.d/mysql.conf:/etc/mysql/conf.d/mysql.conf
把宿主机的配置文件挂载到容易的/etc/mysql/conf.d配置文件,宿主机修改配置文件可以影响到容器的配置文件
docker ps #查看容器是否运行
docker logs mysql #查看是否运行成功
docker exec -it mysql bash #进入mysql容器里面
exit#退出容器
docker stop mysql #停止容器
docker rm mysql #删除容器
docker restart mysql #重新启动mysq镜像
# python项目配置mysql
DB_CONFIG = {
'user': 'youname',
'password': 'youpwd',
'host': '127.0.0.1', #应该改成mysql容器的地址172.17.0.5
'port': 3306,
'db': 'youdb',
'charset': 'utf8',
}
此时我犯的错误导致python程序链接不了mysql
原因:python配置文件中链接mysql的地址是:127.0.0.1
对策:应该要写mysql运行容器中的地址:172.17.0.5
docker inspect --format '{{ .NetworkSettings.IPAddress }}' node1 # 查看容器id或者名称
5,docker运行redis容器
# 启动redis命令
docker run
-p 6379:6379
--name redis
--restart=always
-v /etc/redis/redis.conf:/etc/redis/redis.conf
-v /var/lib/redis/:/data
-d redis
# docker redis镜像数据默认存储在容器的/data目录下,
# 如需访问容器,可使用
docker exec -it redis bash
redis-cli
# 或直接使用redis-cli访问容器内redis
docker exec -it redis redis-cli
docker run -it redis:alpine redis-cli -h 172.17.0.1
# 注意,这个是容器运行的ip,可通过 docker inspect redis_s | grep IPAddress 查看
# 查看活跃的容器
docker ps
# 如果没有 myredis 说明启动失败 查看错误日志
docker logs myredis
# 查看 myredis 的 ip 挂载 端口映射等信息
docker inspect myredis
# 查看 myredis 的端口映射
docker port myredis
# session
DEFAULT_REDIS = {
'host': '172.17.0.1', # 此处应该填写redis容器运行的ip
'port': 6379,
'db': 1,
}
5,docker运行nginx容器
# 启动容器
docker run -d --name nginx nginx
# 启动临时容器,把目录找到
docker exec -it nginx bash # 进入容器里面,找到配置目录
# 拷贝容器里的配置文件到宿主机
docker cp nginx:/etc/nginx ./ # 把nginx中的配置文件复制到当前目录(当前目录/etc/nginx)
# 再次启动nginx容器
docker run --name nginx
-p 80:80
--restart=always
-v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro #配置文件
-v /var/log/nginx:/var/log/nginx #日志
-v /var/http/dist:/usr/share/nginx #静态资源
-d nginx
要注意的是:-v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
在宿主机的/etc/nginx/nginx.conf直接写nginx的配置
因为这两句include并不会真正加载到容器里
# include /etc/nginx/conf.d/*.conf;
# include /etc/nginx/sites-enabled/*;
改nginx配置文件之前,找到nginx容器里静态文件路径
docker exec -it nginx bash # 进入容器里面,找到nginx加载静态文件目录:
发现目录为:/usr/share/nginx
exit # 退出nginx容器
在宿主机的/etc/nginx/nginx.conf写配置文件
# 只截取里部分
server {
listen 80; #这里我只监听的80端口
server_name (nginx容器的ip);
root /usr/share/nginx; # 刚开始写宿主机的静态路径/var/http/dist/ 一直加载不了,后面改成nginx容器中的静态路径/usr/share/nginx就ok
location /css{
alias /usr/share/nginx/css;
}
location /fonts{
/usr/share/nginx/fonts;
}
...
}
此时访问127.0.0.1:8080可以正常加载页面里,这是该启动python
6,docker运行python
cd /home/data/youapp/ 进入到你代码目录
编写uwsgi.ini配置文件
[uwsgi]
module=web:app
callable=app
master=true
processes=3
chmod-socket=666
logfile-chmod=644
socket=127.0.0.1:5050
enable-threads=true
logto=%(chdir)/uwsgi/uwsgi.log
启动python
docker run -d --name balz
-v $PWD:/app -p 0.0.0.0:5050:5050 balz:20191111 uwsgi --plugin=python3 --ini uwsgi.ini
docker大法好,但各种细节真的要注意
注意项目代码中mysql,reids配置要写容器内的ip