目录

1.环境部署准备

2.进行部署

3.操作中遇到的问题


1.环境部署准备

首先从docker 里拉取nginx的镜像!

# 拉取镜像
docker pull nginx

# 查看当前拉取的所有镜像
docker images -a

# 运行打开容器
docker run [OPTIONS] IMAGE根据镜像新建并启动容器。IMAGE是镜像ID或镜像名称
OPTIONS说明:
     --name=“容器新名字”:为容器指定一个名称
     -d:后台运行容器,并返回容器ID,也即启动守护式容器
     -i:以交互模式运行容器,通常与-t同时使用
     -t:为容器重新分配一个伪输入终端,通常与-i同时使用
     -v: 挂载本地文件映射到容器里
     -P:随机端口映射
     -p:指定端口映射,有以下四种格式:
        ip:hostPort:containerPort
        ip::containerPort
        hostPort:containerPort
        containerPort

nginx 容器拉取完成后 准备nginx部署所需要的 nginx.conf 文件和 default.conf

这两个文件可以从运行的nginx容器中获取

# 随便创建一个nginx 容器
~] # docker run -p nginx

# 打开另一个终端 输入命令查看
~] # docker ps -a 
CONTAINER ID        IMAGE                COMMAND                  CREATED         ...
dac76787f7f2        nginx                "/docker-entrypoint.猞"   19 seconds ago ...

# 进入容器中
~] # dockers exec -it dac76787f7f2 bash
root@dac76787f7f2:/# ...已经进入到容器里面啦

# 把容器中的文件copy到本地(容器外操作)
docker cp dac76787f7f2:/etc/nginx/nginx.conf /root/nginx/nginx.conf
docker cp dac76787f7f2:/etc/nginx/conf.d/default.conf /root/nginx/conf.d/default.conf
docker cp 容器id:容器路径 本地路径

本地已经copy 下来后我们进行nginx.conf的修改

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            #后面跟上服务器的IP地址与uwgis发布的Django项目使用的端口
            proxy_pass http://106.12.205.171:8080;
            root   html;
            index  index.html index.htm;
        }
        # 静态文件 这里是容器内的路径
        location /static{
            alias /static;
        }
    }

}

进行uwsgi安装和 uwsgi.ini 文件的编写

# uwgis 的安装 通过pip 直接安装就可以啦
~] # python3 -m pip install uwsgi

# 查看python 安装包
~] # python3 -m pip list
uWSGI                  2.0.19    
websocket-client       0.57.0    
websockets             8.1
...

uwsgi.ini 文件

# 这个文件要在django的项目 目录下创建
[uwsgi]
# 和nginx.conf 文件的端口相对应
http=0.0.0.0:8080
socket=app.sock
master = true
# 项目目录
chdir = /root/qing/ChpHahaa
# 指定 wsgi.py 文件的目录
wsgi-file = ChpHahaa/wsgi.py
processes = 4
thread = 2
vacuum = true
我的文件路径
/root/qing/ChpHahaa
ChpHahaa - 
  ChpHahaa -
    __init__.py
    __settings__.py
    ...
  HLCHP -
    migrations - 
      __init__.py
      ...
    static - 
      js -
        xxx.js
        ...
      img -
        logo.png
        ...
    ...
  manage.py
  uwsgi.ini
  ...

2.进行部署

重新打开一个 docker nginx 容器 

# 一条命令 首先把nginx.conf 挂到容器中 在把静态文件挂到容器中
~] # docker run -p 443:443 -p 80:80 --name nginx 
-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf 
-v /root/qing/ChpHahaa/HLCHP/static:/static 
-d nginx

# 查看是否运行 显示下面的已经运行成功
~] # docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             
f7c58bd777cf        nginx                "/docker-entrypoint.猞"   20 hours ago        Up 2 
----------------------------------------------------------------------------------
STATUS              PORTS                                         NAMES
hours               0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp      nginx

# 这个时候访问 我们的主机ip 会是 503 服务器错误 还需要在服务器上启动 uwsig
# 从根目录进入 django 项目目录下 
~] # cd /root/qing/ChpHahaa/
运行uwsgi.ini 文件 保持这个运行不要 Ctrl+c 把这个给关啦
ChpHahaa] # uwsgi uwsgi.ini
[uWSGI] getting INI configuration from uwsgi.ini
*** Starting uWSGI 2.0.19 (64bit) on [Thu Jul 23 14:00:14 2020] ***
compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-39) on 15 June 2020 09:18:48
os: Linux-3.10.0-1062.4.1.el7.x86_64 #1 SMP Fri Oct 18 17:15:30 UTC 2019
nodename: instance-0jv3636j
machine: x86_64
clock source: unix
detected number of CPU cores: 1
...

这个时候我们在网页上打开 http://106.12.205.171 就可以看到网页啦

docker 部署网站到nginx docker部署django nginx_web app

3.操作中遇到的问题

a.docker 启动 nginx 遇见启动失败 端口并没有能打开

CONTAINER ID        IMAGE                COMMAND                  CREATED             
24e221f80985        nginx                "/docker-entrypoint.猞"   2 hours ago        
STATUS                    PORTS                                      NAMES 
Exited (0) 2 hours ago                                               dazzling_gates

# PORTS 端口为空
这里我们要检查我们的 nginx.conf 文件是否有书写错误的地方
# 可以通过docker 日志查看错误
~] # docker logs 24e221f80985
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
...

b.静态文件访问404错误

# 首先检查 nginx.conf 配置的静态文件路径
location /static{
    # 这里指容器内的路径
    alias  /static;
}

# 进入容器查看文件是否在
~] # docker exec -it 容器id bash
root@f7c58bd777cf:/# ls
mnt  opt  proc  root  run  sbin  srv  ssl  static ...

#这个目录下是有挂的static 文件夹的 进入 static文件夹 查看是否有静态文件 没有的话才会404 错误
root@f7c58bd777cf:/# cd static
root@f7c58bd777cf:/static# ls
root@f7c58bd777cf:/static#

# 退出容器把本地文件静态文件在挂到容器中(我是这么操作才不是404的)
docker cp 本地文件路径 容器id:/static

# 为了方便挂到容器中可以先把django 静态文件进行单独整理
# 在 django项目的setting.py 添加一下代码
STATIC_ROOT = os.path.join(BASE_DIR, "static_new") 

# 然后在django项目文件夹下运行
~] # python3 manage.py collectstatic
...

# 这个时候检查目录就可以发现文件夹下多了 static_new 目录这里面都是静态文件