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

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
    在这里插入图片描述

踩坑记录

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

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

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

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

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

  5. 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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用Docker部署Nginx来托管您的项目。以下是一个简单的步骤指南: 1. 首先,确保您已经安装了DockerDocker Compose。您可以在Docker官方网站上找到安装文档。 2. 创建一个目录来存储您的项目文件,比如`myproject`。 3. 在`myproject`目录中创建一个`Dockerfile`文件,用于定义Nginx容器的构建过程。示例`Dockerfile`内容如下: ``` FROM nginx:latest COPY nginx.conf /etc/nginx/nginx.conf COPY static /usr/share/nginx/html ``` 上述示例中使用了最新版本的Nginx镜像,并将本地的`nginx.conf`文件和`static`目录复制到容器中对应的位置。 4. 在`myproject`目录中创建一个`nginx.conf`文件,用于配置Nginx服务器。根据您的项目需求进行配置。示例配置文件如下: ``` worker_processes 1; events { worker_connections 1024; } http { server { listen 80; server_name localhost; root /usr/share/nginx/html; location / { try_files $uri $uri/ =404; } } } ``` 上述示例中配置了一个简单的HTTP服务器,监听80端口,并将静态文件根目录设置为`/usr/share/nginx/html`。 5. 将您的项目文件复制到`myproject/static`目录中。 6. 在`myproject`目录中创建一个`docker-compose.yml`文件,用于定义多个容器之间的关系。示例`docker-compose.yml`内容如下: ``` version: "3" services: nginx: build: . ports: - "8080:80" ``` 上述示例中定义了一个Nginx服务,将主机的8080端口映射到容器的80端口。 7. 打开终端,导航到`myproject`目录,并运行以下命令启动容器: ``` docker-compose up -d ``` 8. 稍等片刻,Nginx容器将在后台运行,并将您的项目文件提供给外部访问。 现在,您可以通过访问`http://localhost:8080`来查看您部署项目。请注意,如果您在步骤6中更改了端口映射,请相应地修改访问URL。 希望这可以帮助到您!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值