Advertisement

Docker Nginx 一台服务器部署多个服务项目

阅读量:

文章目录

  • Docker Nginx 开启多个服务
    • 部署两个二级域名的服务

      • bookstore
      • dv(数据可视化)
      • docker 网络
    • 部署Nginx

    • 启动

    • 踩坑记录

    • 常用docker、docker-compose命令

    • 总结

Docker Nginx 开启多个服务

使用 docker 安装 Nginx 反向代理服务器,实现二级域名功能

部署两个二级域名的服务

这里部署两个项目,一个是使用Flask开发的bookstore,另一个是使用Django开发的数据可视化项目covid-19

bookstore

复制代码
    version: '2.0'
    
    services:
    
      mysql_bs:
    image: mysql
    restart: always
    networks:
      - bookstore_net
    command: '--default-authentication-plugin=mysql_native_password'
    volumes:
      - ./script/data/mysql/init:/docker-entrypoint-initdb.d/
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
    
      mongo:
    restart: always
    build:
      context: .
      dockerfile: mongo-dockerfile
    privileged: true
    networks:
      - bookstore_net
    volumes:
      - /home/caisi/bookstore/script/data/mongo/init:/mongo/back
    environment:
      MONGO_INITDB_DATABASE: bookstore
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: root
    
    #  nginx:
    #    image: nginx
    #    restart: always
    #    volumes:
    #      - ./conf/nginx.conf:/etc/nginx/conf.d/default.conf
    #      - ~/nginx:/etc/nginx/conf.d/
    #    ports:
    #      - 80:80
    # depends_on:
    #   - bookstore
    #    links:
    #      - bookstore
    
      bookstore:
    restart: always
    build:
      context: .
      dockerfile: Dockerfile
    #volumes:
      #- .:/code
      # - /etc/localtime:/etc/localtime  # 时区
    expose:
      - 8000
    links:
      - mysql_bs
      - mongo
    networks:
      - bookstore_net
    
    networks:
      bookstore_net:
    driver: bridge

这里的nginx服务注销了是因为要开启两个服务加入到nginx中,所以需要把nginx单独放出来

这个项目的github地址https://github.com/caisi35/BookStore

dv(数据可视化)

复制代码
    version: '2.0'
    
    services:
    
      mysql:
    image: mysql
    #build:
    #  context: .
    #  dockerfile: docker-mysql
    restart: always
    networks:
      - dv-net
    command: '--default-authentication-plugin=mysql_native_password'
    volumes:
      - ./data/:/docker-entrypoint-initdb.d/
      - ./config/mysql.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
    
    #  nginx:
    #    image: nginx
    #    restart: always
    #    volumes:
    #      - ./config/nginx.conf:/etc/nginx/conf.d/default.conf
    #    ports:
    #      - 81:80
    #    links:
    #      - covid_dv
    
      covid_dv:
    restart: always
    build:
      context: .
      dockerfile: Dockerfile
    #    volumes:
    #      - :/
    networks:
      - dv-net
    
      #  ipv4_address: 172.20.0.2
    ports:
      - 8001:8001
    expose:
      - 8001
    links:
      - mysql
    
    networks:
      dv-net:
    driver: bridge

这里的nginx也和上面的一样,在单独运行的时候才开启

这个dv项目的github地址https://github.com/caisi35/DataVisualization/tree/master/covid_19_dv

docker 网络

  • 创建自定义网卡的docker命令:
复制代码
    docker network create xxxxxxx_name
复制代码
    caisi@iZbp142i6z3h2th6j7ehvyZ:~/covid_19_dv$ docker network ls
    NETWORK ID     NAME                      DRIVER    SCOPE
    65215fa7b138   bookstore_bookstore_net   bridge    local
    b0ac60625ee0   bookstore_default         bridge    local
    1b6e904504fe   bridge                    bridge    local
    944d9d8d2667   covid19dv_dv-net          bridge    local
    f1e7dcca0fc6   host                      host      local
    9f9104f35bc3   none                      null      local

这里为两个服务都设置了自定义的network,bookstore项目的bookstore_net 和 dv 的 dv-net,这里没有设置网络的名称,所以docker自动会加上docker-compose.yml文件的文件夹名称和networks作为NAME。所以就是上面的bookstore_bookstore_net, covid19dv_dv-netbookstore_default是之前单独部署bookstore的时候docker创建的默认的网络。

部署Nginx

重点来了

复制代码
    version: '2.0'
    
    services:
    
      nginx:
    image: nginx
    restart: always
    container_name: nginx
    volumes:
      #- ./conf/nginx.conf:/etc/nginx/conf.d/default.conf
      - ~/nginx:/etc/nginx/conf.d/
    ports:
      - 80:80
    networks:
      - bookstore_bookstore_net
      - covid19dv_dv-net
    
    networks:
      bookstore_bookstore_net:
    external: true
      covid19dv_dv-net:
    external: true

这里把上面两个项目的网卡加入到nginx中,否则nginx会找不到服务的HOST

并把~/nginx目录映射为nginx的配置文件放置的目录,把bookstore, covid_19的nginx配置文件放入物理主机的~/nginx,重启nginx容器。

复制代码
    caisi@iZbp142i6z3h2th6j7ehvyZ:~/nginx$ ls
    nginx-bs.conf  nginx-dv.conf
    
    caisi@iZbp142i6z3h2th6j7ehvyZ:~/nginx$ cat  nginx-bs.conf
    server {
    listen 80;
    
    server_name bs.caisi.xyz;
    
    access_log  /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;
    
    location / {
        proxy_pass         http://bookstore:8000;
        proxy_redirect     off;
    
        proxy_set_header   Host                 $host;
        proxy_set_header   X-Real-IP            $remote_addr;
        proxy_set_header   X-Forwarded-For      $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto    $scheme;
    }
    }
    
    caisi@iZbp142i6z3h2th6j7ehvyZ:~/nginx$ cat nginx-dv.conf
    server {
    listen 80;
    
    server_name dv.caisi.xyz;
    # server_name localhost;
    
    access_log  /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;
    
    location / {
        proxy_pass         http://covid_dv:8001;
        proxy_redirect     off;
    
        proxy_set_header   Host                 $host;
        proxy_set_header   X-Real-IP            $remote_addr;
        proxy_set_header   X-Forwarded-For      $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto    $scheme;
    }
    }

这里的nginx配置文件主要就是server_nameproxy_pass两个地方,server_name是二级域名解析的地址,proxy_pass则是需要代理的项目地址和端口,这里的bookstore, covid_dv分别是对应项目中docker-compose.yml文件中的服务。

启动

复制代码
    DEPLOY = Trueroot@697f95d9327c:/bookstore# caisi@iZbp142i6z3h2th6j7ehvyZ:~$ docker ps
    CONTAINER ID   IMAGE                  COMMAND                  CREATED             STATUS             PORTS                    NAMES
    a041f702f807   bookstore_bookstore    "uwsgi uwsgi.ini"        49 minutes ago      Up 49 minutes      8000/tcp                 bookstore_bookstore_1
    fe4a93a1873a   covid_19_dv_covid_dv   "uwsgi uwsgi.ini"        About an hour ago   Up 57 minutes      0.0.0.0:8001->8001/tcp   covid_19_dv_covid_dv_1
    816afdd3003e   mysql                  "docker-entrypoint.s…"   2 hours ago         Up 57 minutes      3306/tcp, 33060/tcp      covid_19_dv_mysql_1
    b4a99b068f83   nginx                  "/docker-entrypoint.…"   3 hours ago         Up About an hour   0.0.0.0:80->80/tcp       nginx
    1d259164cc89   bookstore_mongo        "docker-entrypoint.s…"   3 hours ago         Up 3 hours         27017/tcp                bookstore_mongo_1
    4cf012947b5c   mysql                  "docker-entrypoint.s…"   3 hours ago         Up 54 minutes      3306/tcp, 33060/tcp      bookstore_mysql_bs_1
  • DV
    在这里插入图片描述

    • bookstore
      在这里插入图片描述

踩坑记录

Nginx 没有找到相应的IP
在这里插入图片描述
看情况,应该是covid_19_dv这个应用引起的,因为没有启动,所以docker的network没有相应的IP,最终导致Nginx启动的时候配置文件那里报错了。
解决:1. 删除covid_19_dv的Nginx配置文件。 2. 启动covid_19_dv,让Nginx找到IP。

结论:需要先启动各个项目后,才启动nginx容器,这样nginx的配置文件才能找到相应的HOST

各个项目的networks,需要手动的创建。

nginx映射的~/nginx目录操作需要sudo权限。

Django的settings.py中需要添加允许的HOSTS

Django的静态文件需要单独配置,可以在uwsgi.ini添加static-map = /static=/covid_19_dv/static

常用docker、docker-compose命令

复制代码
    docker ps
    # 查看docker启动了的容器, 加`-a`查看所有的容器,包括没有启动的
    caisi@iZbp142i6z3h2th6j7ehvyZ:~$ docker ps -a
    CONTAINER ID   IMAGE                  COMMAND                  CREATED             STATUS                   PORTS                    NAMES
    a041f702f807   bookstore_bookstore    "uwsgi uwsgi.ini"        About an hour ago   Up About an hour         8000/tcp                 bookstore_bookstore_1
    fe4a93a1873a   covid_19_dv_covid_dv   "uwsgi uwsgi.ini"        About an hour ago   Up About an hour         0.0.0.0:8001->8001/tcp   covid_19_dv_covid_dv_1
    816afdd3003e   mysql                  "docker-entrypoint.s…"   3 hours ago         Up About an hour         3306/tcp, 33060/tcp      covid_19_dv_mysql_1
    b4a99b068f83   nginx                  "/docker-entrypoint.…"   3 hours ago         Up About an hour         0.0.0.0:80->80/tcp       nginx
    1d259164cc89   bookstore_mongo        "docker-entrypoint.s…"   3 hours ago         Up 3 hours               27017/tcp                bookstore_mongo_1
    4cf012947b5c   mysql                  "docker-entrypoint.s…"   3 hours ago         Up About an hour         3306/tcp, 33060/tcp      bookstore_mysql_bs_1
    b48f8fbf6076   nginx                  "/docker-entrypoint.…"   11 days ago         Exited (0) 4 hours ago                            bookstore_nginx_1
    d9f79226fd55   mysql                  "docker-entrypoint.s…"   11 days ago         Exited (0) 4 hours ago
    
    # 查看docker-compose.yml中的容器
    caisi@iZbp142i6z3h2th6j7ehvyZ:~/bookstore$ docker-compose ps
        Name                       Command               State          Ports
    ------------------------------------------------------------------------------------
    bookstore_bookstore_1   uwsgi uwsgi.ini                  Up      8000/tcp
    bookstore_mongo_1       docker-entrypoint.sh mongod      Up      27017/tcp
    bookstore_mysql_bs_1    docker-entrypoint.sh --def ...   Up      3306/tcp, 33060/tcp
    
    # 查看docker network
    caisi@iZbp142i6z3h2th6j7ehvyZ:~$ docker network ls
    NETWORK ID     NAME                      DRIVER    SCOPE
    65215fa7b138   bookstore_bookstore_net   bridge    local
    b0ac60625ee0   bookstore_default         bridge    local
    1b6e904504fe   bridge                    bridge    local
    944d9d8d2667   covid19dv_dv-net          bridge    local
    f1e7dcca0fc6   host                      host      local
    9f9104f35bc3   none                      null      local
    
    # 构建docker-compose.yml容器,后面加服务名称则只构建相应的服务,不加则docker-compose中的所以服务都会`build`
    caisi@iZbp142i6z3h2th6j7ehvyZ:~/bookstore$ docker-compose build bookstore
    Building bookstore
    Step 1/9 : FROM python:3.5
     ---> 3687eb5ea744
    Step 2/9 : RUN mkdir /bookstore
    
    # 启动docker-compose容器, 加`-d`参数为后台运行,后面加服务名称则只对相应的服务操作
    caisi@iZbp142i6z3h2th6j7ehvyZ:~/bookstore$ docker-compose up -d
    WARNING: Found orphan containers (bookstore_nginx_1, bookstore_mysql_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
    bookstore_mysql_bs_1 is up-to-date
    bookstore_mongo_1 is up-to-date
    Recreating bookstore_bookstore_1 ... done 
    
    # 停止docker-compose容器, 后面加服务名称,则只停止对应的服务,否则所有服务都停止。
    caisi@iZbp142i6z3h2th6j7ehvyZ:~/bookstore$ docker-compose stop bookstore
    Stopping bookstore_bookstore_1 ... done 
    
    # 进入容器的shell,首先需要只对要进入的容器`NAMES`,注意是使用docker,不是docker-compose命令
    caisi@iZbp142i6z3h2th6j7ehvyZ:~$ docker exec -it bookstore_bookstore_1 bash
    root@697f95d9327c:/bookstore# cat conf/db_config.py
    MYSQL_HOST = 'mysql'
    MYSQL_PASSWORD = 'root'
    
    MONGODB_HOST = 'mongo'
    MONGODB_PASSWORD = 'root'
    
    # 创建自定义网卡
    docker network create network_name
    # 删除网卡
    docker network rm network_name

总结

  • 这里主要就是为了能让Nginx容器找到其它的项目部署的容器的HOST,所以涉及到了docker的网络。
  • Django的项目部署静态文件需要特别注意一下,与Flask不同,Django默认有很多的APP,因此static目录也可以有多个,所以需要特地的配置一下。

关注我的公众号吧~
在这里插入图片描述

全部评论 (0)

还没有任何评论哟~