本文仅用于对不熟悉Docker & Docker Compose的用户进行科普,并不代表任何个人意见

本文主要介绍Docker Compose的基础配置的修改,包括其中常用部分的修改等操作

案例

这是一个基本的 docker-compose yml配置文件,在使用时,可以通过创建一个 docker-compose.yml 文件,将下面的代码复制进去,然后在同级目录下执行 docker-compose up -d 命令,即可运行该配置。

version: '3'

services:
  redis:
    image: redis:5.0.14
    container_name: my-cache
    restart: always
    networks:
      - my-net
    ports:
      - "16379:6379"

  nginx:
    image: nginx
    container_name: my-web
    restart: always
    networks:
      - my-net
    ports:
      - "80:8000"
    volumes:
      - ./data/nginx/conf/conf.d:/etc/nginx/conf.d
      - ./data/nginx/html:/var/www/html
    
networks:
  my-net:
    driver: bridge

1. version

version: '3': 指定Docker Compose文件的版本。在这里,使用的是版本3的语法。一般也是比较常用的一个版本,没有特殊需求的情况下不必修改。

2. services

services:是docker compose配置文件的主要部分,定义了将要运行的服务列表的部分的开始。类似于一个数组。

2.1 redis

定义了一个redis服务,这个名称是可以自定义的,要注意的是不能和其他服务名重复。

image: redis:5.0.14

代表此服务使用的镜像,此处我们使用了redis官方的5.0.14版本

container_name: my-cache

代表此服务创建容器名称,实际上服务和Docker容器是有对应关系的,这里可以控制docker容器的名称

restart: always

代表出错的重启策略,主要有以下几种情况:

  • no:不采取措施,不配置情况下的默认值

  • always:始终重启,不关心什么原因退出的

  • on-failure:仅非正常退出情况下重启(退出的code不是0)

  • unless-stopped:容器退出时自动重启,除非是用户手动停止的

networks:

指定当前服务使用的网络,也就是下面我们创建的那个

- mynet

指定使用的网络,可以同时使用多个

ports:

指定主机端口和容器端口间的映射关系

- "16379:6379"

顺序:宿主:容器

将容器的6379端口映射到宿主机的16379端口上

2.2 nginx

image: nginx

使用了nginx镜像

container_name: my-web

容器名称为my-web

restart: always

重启策略为始终重启

ports:

映射的端口

- "80:8000"

将容器的8000端口映射到80

volumes:

文件卷挂载,用户可以将容器中的文件夹挂载到宿主机上,一般因为下面两种情况下需要配置:

  • 运行数据(数据持久化)

  • 配置文件

因为docker一般都用于运行无状态的应用,所以容器重启,其中的数据也会丢失,这时可以通过将重要数据挂载出来的方式,来实现有状态的容器应用;另外对于很多的配置文件,特别是经常修改的内容,也可以将其挂载出来,便于修改。

关于有状态应用和无状态应用的具体说明,请参阅《容器化:有状态&无状态

- ./data/nginx/conf/conf.d:/etc/nginx/conf.d

将容器中的/etc/nginx/conf.d文件夹挂载到宿主机中,此处用的是相对路径,也就是docker-compose文件所在目录下的data/nginx/conf/conf.d文件夹

- ./data/nginx/html:/var/www/html

将容器的/var/www/html文件夹挂载到宿主机的./data/nginx/目录,也就是当前目录下的data/nginx/html文件夹中

3. network

定义了docker compose实例的自定义网络,在此网络中的所有容器可以通过服务名直接通讯

3.1 my-net

定义了一个名为my-net的自定义网络。

3.1.1 driver: bridge

这行代码指定了网络的驱动程序为bridge,即使用桥接网络模式。类似于虚拟机中的桥接概念。