Docker容器间网络通信遇到的问题
在安装了Docker
的Linux
上输入ip addr
会发现有一个名为docker0
的网络设备,容器和宿主机之间的网络通信靠的就是这个docker0
**【了解】修改docker0的网段(CentOS6.*)**
sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0
Docker容器之间的网络连接
docker
默认是允许所有的容器之间可以进行网络连接的,比如说在一个容器中去ping
另一个容器的IP
是可以ping
的通的,尽管是可以ping
通的,但是也没有人使用IP
的方式去做容器互相访问。
当然也可以在启动的时候加上--link
参数来进行容器之间的hosts
映射。其原理就是在容器的hosts
文件中加入了另一台容器ip
对应的别名。但是这种方式需要严格的容器启动顺序,而且这种写法也是官方不推荐的。
用Docker Compose
就可以解决这些问题了。
Docker Compose
Docker Compose
定位是"定义和运行多个 Docker
容器的应用",它允许用户通过一个单独的 docker-compose.yml
模板文件(YAML
格式)来定义一组相关联的应用容器为一个项目(project
)。
大白话:Docker Compose
可以根据yaml
配置文件来自动编排所有在yaml
配置文件中配置过的容器服务,免去自己写docker
命令这么无聊且浪费时间的工作。
Docker Compose
安装方式
Docker Compose
使用的yml
文件看上去是下面的样子(默认文件名docker-compose.yml
)
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
然后使用命令docker-compose up
即可进行构建并运行,就可以免去输入一堆的docker
命令的烦恼了
yaml
的更多配置:
docker compose
也有很多的命令:
通过一个实例来体验Docker Compose
目标:使用搭建该博客的Halo
镜像和Nginx
镜像实现网络互通
version: '3'
services:
halo:
restart: always # Docker重启的时候要重新启动容器
image: ruibaby/halo
container_name: halo
volumes:
- ~/cyblogs/.halo:/root/.halo
nginx:
restart: always
image: nginx
container_name: nginx-server
ports:
- 80:80
- 443:443 # HTTPS端口
volumes:
- ~/cyblogs/.halo/html:/root/html/.halo # 如果容器中不存在这个文件夹会自动创建
- ~/cyblogs/nginx/cert:/root/cert # HTTPS使用的SSL证书
- ~/cyblogs/nginx/logs:/var/log/nginx # 日志文件的映射
- ~/cyblogs/nginx/conf/nginx.conf:/etc/nginx/nginx.conf # 配置文件的映射
执行下面的命令检查yml
文件格式是否正常
docker-compose -f /root/cyblogs/docker-compose.yml config
如果原原本本的打印出原来文件内容,说明文件格式没有错误。
接下来执行下面命令开始编排:
docker-compose -f /root/cyblogs/docker-compose.yml up -d
其中的-d
和docker run
中的-d
一样都是后台运行
编排成功后使用exec
命令随便进去一个容器,以halo
容器为例
docker exec -it halo /bin/sh
然后执行ping
命令:
ping nginx
这个时候发现可以ping
通,而且不需要使用IP
地址了,使用服务名即可。
Nginx
配置:
# 配置halo.xxx.com的映射
upstream halo {
server halo:8090;
}
# 备用 为*.xxx.com做映射
server {
listen 80;
server_name ~^.*xxx\.com$;
location / {
root /root/html/.halo;
index index.html index.htm;
}
}
# 配置halo.xxx.com的SSL证书
server {
listen 80;
listen 443 ssl;
server_name halo.xxx.com;
root html;
index index.html index.htm;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
ssl_certificate /root/cert/halo.xxx.com.pem;
ssl_certificate_key /root/cert/halo.xxx.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://halo;
}
}
Nginx
配置文件中也可以直接使用“服务名”的方式来做反向代理,比如上面配置文件中的server halo:8090;