Django使用Docker部署+Nginx部署+多容器间通信+阿里云部署问题处理

221 阅读3分钟

服务器配置

解决ssh连接不了的问题(修改本地电脑的 .ssh/known_hosts )

CentOS 8中 更新或下载时报错:为仓库 ‘appstream‘ 下载元数据失败 : Cannot prepare internal mirrorlist

cd /etc/yum.repos.d/
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
yum clean all && yum makecache
yum update -y

阿里云服务器 Docker 的安装 centos8.2

# 安装docker会报containerd.io版本过低的问题,下载最新版本
# 浏览器打开地址:https://download.docker.com/linux/centos/ ,找到想要的版本地址并复制,我的是这个:
wget https://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.4.3-3.1.el8.x86_64.rpm 
yum install -y containerd.io-1.4.3-3.1.el8.x86_64.rpm 
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
​
# 下面这个失败就重试几次
yum install -y docker-ce docker-ce-cli containerd.io
# yum install git
# 启动和测试
sudo systemctl start docker  # 启动docker
​
# docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
# 解决方式
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
        "https://do.nark.eu.org",
        "https://dc.j8.work",
        "https://docker.m.daocloud.io",
        "https://dockerproxy.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://docker.nju.edu.cn"
    ]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
​
docker run hello-world  #测试
# 查看docker状态
sudo docker info
​
# 安装docker -compose 
sudo yum install epel-release
sudo yum install -y python-pip
pip3 install docker-compose
sudo yum upgrade python*
​

多容器间使用名称通信(避免IP变化导致连接问题)

# 查看虚拟网卡,docker 安装好之后默认会创建三个虚拟网卡
docker network ls
# 由于默认的网卡需要设置端口映射并且 IP 地址会随着容器的启动停止而变动,所以我们这里选择使用自定义网络来实现容器之间互相访问。# 创建一个自定义的网络,网络驱动使用 bridge,在自定义网卡上,容器可以通过名称或者别名相互解析。
docker network create my-net
# 查看网卡详细信息
docker network inspect my-net
# 容器去掉网卡
docker network disconnect my-net 容器名
​
### 仅自定义网络也不行,需要用到网络别名,容器启动时如下:
--network my-net --network-alias hhydjango 
# 通过在容器里访问A容器的网络别名来访问A容器

Django主工程

工程源码放到服务器,启动docker

# 测试
docker pull python:3.8
# 构建镜像  
docker build -f Dockerfile -t hhy-django:v1.0 .
​
# 测试运行
docker run --rm -it --privileged=true --name hhydjango \
-p 9002:9002 \
--network my-net --network-alias hhydjango \
-v $(pwd):/var/www/html/djangoProject \
hhy-django:v1.0# 正式运行
docker run -itd --privileged=true --restart always --name hhydjango \
-p 9002:9002 \
--network my-net --network-alias hhydjango \
-v $(pwd):/var/www/html/djangoProject \
hhy-django:v1.0# docker run参数案例
# --rm 和 --restart always 不能同时使用
# --network my-net 
# --net=host 和宿主即共享网络

nginx容器 nginx:1.26

配置修改后nginx不用重启,nginx -s reload即可更新节点

创建镜像

docker build -f Dockerfile -t hhy-nginx:v1.0 .

执行镜像

# 测试运行
docker run -it --privileged=true --rm --name hhy-nginx -p 80:80 -p 443:443 \
--network my-net --network-alias hhy-nginx \
-v $PWD/config/conf.d:/etc/nginx/conf.d \
-v $PWD/config/cert:/usr/local/nginx/cert \
-v $PWD/log:/var/log/nginx hhy-nginx:v1.0  
​
# 正式运行
docker run -itd --privileged=true --restart always --name hhy-nginx -p 80:80 -p 443:443 \
--network my-net --network-alias hhy-nginx \
-v $PWD/config/conf.d:/etc/nginx/conf.d \
-v $PWD/config/cert:/usr/local/nginx/cert \
-v $PWD/log:/var/log/nginx hhy-nginx:v1.0 
​

-------------------------------------------------备注----------------------------------------------------------------------------------------------

python

python:3.8

venv的安装

安装venv
sudo apt install python3-venv
或
yum install python3-venv
创建虚拟环境
python3 -m venv venv
启用虚拟环境
source ./venv/bin/activate
退出虚拟环境
deactivate

安装依赖

把requirements.txt文件放到工程根目录

./venv/bin/pip install --default-timeout=10000 install -i https://pypi.doubanio.com/simple/ -r requirements.txt

uwsgi的配置

正式环境使用这个:
 socket=0.0.0.0:8000
测试时使用这个:
 http=0.0.0.0:8003