文章目录
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-net
,bookstore_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_name
和proxy_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
目录也可以有多个,所以需要特地的配置一下。
关注我的公众号吧~