1 配置文件的格式
- 一份示例
docker-compose.yml
services: elasticsearch: image: elasticsearch:7.14.2 container_name: es environment: discovery.type: single-node ES_JAVA_OPTS: "-Xms512m -Xmx512m" ports: - "9200:9200" - "9300:9300" healthcheck: test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"] interval: 10s timeout: 10s retries: 3 networks: - elastic logstash: image: logstash:7.14.2 container_name: log environment: discovery.seed_hosts: logstash LS_JAVA_OPTS: "-Xms512m -Xmx512m" volumes: - ./logstash/pipeline/logstash-nginx.config:/usr/share/logstash/pipeline/logstash-nginx.config - ./logstash/nginx.log:/home/nginx.log ports: - "5000:5000/tcp" - "5000:5000/udp" - "5044:5044" - "9600:9600" depends_on: - elasticsearch networks: - elastic command: logstash -f /usr/share/logstash/pipeline/logstash-nginx.config kibana: image: kibana:7.14.2 container_name: kib ports: - "5601:5601" depends_on: - elasticsearch networks: - elastic networks: elastic: driver: bridge
2 详解services部分
2.1 image
web
用户自定义的服务名称image
可以指定为镜像名称或镜像ID,如果本地不存在会自动去尝试拉取
services:
web:
image: redis
2.2 build
- 服务启动可以基于
2.1 image
,也可以基于Dockerfile
文件,启动时会在up的时候执行构建任务。 - 子标签
context
设定上下文根目录 - 子标签
dockerfile
指定Dockerfile文件 - 子标签
args
指定构建过程中使用到的环境变量services: web: build: context: ../ dockerfile: Dockerfile args: - buildno=1 - password=123456
- 同时指定image和build标签会将构建的镜像命名为image后面的名称
services: web: build: . image: webapp:tag
2.3 command
- 使用command会覆盖镜像启动后要默认执行的命令
services: web: command: redis-server /etc/redis/redis.conf --appendonly yes
services: web: command: ["redis-server", "/etc/redis/redis.conf", "--appendonly", "yes"]
2.4 container_name
- docker-compose启动容器名称格式为:
<项目名称><服务名称><序号>
- 也可以通过
container_name
自定义容器名称services: web: container_name: redis-6379
2.5 depends_on
- 一般在项目中容器需要有特定的启动顺序,否则会因为依赖问题而启动失败。
- 示例:如果没有启动数据库就启动应用容器,那么应用容器可能会因为找不到数据库而退出
- 解决:depends_on
services: web: build: . depends_on: - db - redis redis: image: redis:latest db: image: mysql:5.7
2.6 dns
- 和docker run中的
--dns
参数一样用途services: web: dns: 8.8.8.8
services: web: dns: - 8.8.8.8 - 114.114.114.114
2.7 entrypoint
- Dockerfile中有个指令
ENTRYPOINT
用于指定接入点,docker-compose.yml
中定义entrypoint会覆盖Dockerfile中的定义services: web: entrypoint: java -jar app.jar --spring.profiles.active=release
services: web: entrypoint: - java - -jar - app.jar - --spring.profiles.active=release
2.8 environment
- 相当于
docker run -e
的功能services: mysql: image: mysql environment: - MYSQL_ROOT_PASSWORD=123456 - MYSQL_ALLOW_EMPTY_PASSWORD=yes
2.9 extra_hosts
- 添加主机名的映射,相当于往
/etc/hosts
添加记录,相当于docker run --add-host
的功能services: web: extra_hosts: - webnode1:192.168.171.100 - webnode2:192.168.171.101
- 这时容器中
/etc/hosts
可以看到192.168.171.100 webnode1 192.168.171.101 webnode2
2.10 ports
- 端口映射标签,相当于
docker run -p
功能services: web: ports: - 80:80 - 1180:1180
2.11 volumes
- 挂载一个目录,或者一个已经存在的数据卷容器,相当于
docker run -v
功能 HOST:CONTAINER
HOST:CONTAINER:ro
,:ro
表示只读,默认为可读可写services: web: volumes: - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro - ./webdist:/home/webdist
2.12 volumes_from
- 从其他容器或者服务挂载数据卷
- 可选参数为:
:ro
表示容器对数据卷是只读、:rw
表示可读可写。默认是可读可写。services: web: volumes_from: - service_name - service_name:ro - container:container_name - container:container_name:rw
2.13 networks
- 加入指定网络
services: web: networks: - web-net - backend-net
2.14 cap_add、cap_drop
- 添加或删除容器的内核功能
2.15 cgroup_parent
- 指定容器的父级cgroup
2.16 其他
- 还有其他单值标签:
user
working_dir
hostname
privileged
restart
services: web: user: mysql working_dir: /home/webdist hostname: webnode privileged: true restart: always