Docker Compose编排容器

CY 2019年03月09日 437次浏览

Docker容器间网络通信遇到的问题

在安装了DockerLinux上输入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

其中的-ddocker 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;