docker-compose知识点

docker-compose知识点,第1张

作用

负责管理容器的运行

示例

下面的docker-compose.yaml只作为介绍之用

version: '2.2'
services:
  elasticsearch: #服务名
    image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0 #docker仓库中的镜像名:tag
    container_name: elasticsearch7.2.0 #容器名
    hostname: elasticsearch #主机名,容器是类Linux系统
    environment:
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes: #挂载卷,左边主机:右边容器
      - esdata:/usr/share/elasticsearch/data
    restart: always # 重启策略
    network_mode: host
    ports: # 端口映射,左边主机:右边容器
      - 9200:9200
      - 9300:9300
    expose: #声明暴露的端口,只是声明
      - 9200
  kibana:
    image: docker.elastic.co/kibana/kibana:7.2.0
    container_name: kibana7.2.0
    hostname: kibana
    environment:
     - elasticsearch.hosts=http://elasticsearch:9200
    depends_on: # !依赖服务,不是依赖容器
     - elasticsearch
    restart: always
    ports:
      - "5601:5601"
    # 容器运行时执行命令 exec模式
    command: ["bundle", "exec", "thin", "-p", "3000"]
  logstash:
    image: docker.elastic.co/logstash/logstash:7.2.0
    container_name: logstash7.2.0
    hostname: logstash
    restart: always
    external_links: 
      - elasticsearch:elasticsearch
    depends_on:
     - elasticsearch
    ports:
     - 9600:9600
     - 5044:5044
#卷驱动,esdata是elasticsearch下的主机目录
volumes:
  esdata:
    driver: local
#网络模式网桥
networks: 
  elknet: 
    driver: bridge
获取环境变量

注意:

  • 需要在docker-compose.yaml同级别目录下创建.env文件
  1. 创建Dockerfile文件
FROM alpine:3.14.6
RUN mkdir /vol
VOLUME /vol
  1. 构建镜像
sudo docker build -t test:1.0.0 .
  1. 创建.env文件
export DIR_BASE=/home/xcrj/test
  1. 添加到~/.bashrc配置文件末尾
export DIR_BASE=/home/xcrj/test
  1. 刷新~/.bashrc
source ~/.bashrc
  1. 创建docker-compose.yaml文件
version: '3'
services:
  test1:
    image: test:1.0.0
    container_name: test1
    hostname: test1
    volumes: 
      - ${DIR_BASE}/vol:/vol
  1. 运行容器
sudo docker-compose -f docker-compose.yaml up -d
  1. 检查
    找到Mounts,发现挂载成功
sudo docker inspect test1
network_mode

network_mode: bridge

  • 自有IP;此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥
  • 通过docker0网桥以及Iptables nat表配置与宿主机通信

network_mode: host

  • 使用主机的IP

network_mode: none

  • 关闭容器网络功能

network_mode: service_name

  • 此服务只能与指定服务通信
networks

todo

healthcheck

test:健康测试
interval:间隔执行测试时间
retries:尝试次数
start_period:开始执行测试的等待时间,等待容器先启动

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 1m30s
  timeout: 10s
  retries: 3
  start_period: 40s
depends_on

表明服务之间的依赖关系

  • service_started:依赖服务启动
  • service_healthy:依赖服务完成健康检查
  • service_completed_successfully:依赖服务完全运行成功

简单方式:等价于service_started

version: '2.2'
services:
  kibana:
    image: docker.elastic.co/kibana/kibana:7.2.0
    container_name: kibana7.2.0
    hostname: kibana
    environment:
     - elasticsearch.hosts=http://elasticsearch:9200
    depends_on: # !依赖服务,不是依赖容器
     - elasticsearch
    restart: always
    ports:
      - "5601:5601"
    # 容器运行时执行命令 exec模式
    command: ["bundle", "exec", "thin", "-p", "3000"]

详细

services:
  service0:
	depends_on:
      service1:
      	# service0依赖service1启动
        condition: service_started
      service2:
      	# service0依赖service2健康检查完成
        condition: service_healthy
	  service3: 
	  	# service0依赖service2完全启动
		condition: service_completed_successfully
restart

restart: “no”

  • 不重启

restart: always

  • 总是重启

restart: on-failure

  • 发生错误时重启,exit-code非0

restart: unless-stopped

  • 不管退出码
  • 除非服务停止,否则重启
external_links

todo

command和entrypoint

与Dockerfile中的CMD和ENTRYPOINT一样

  • 在容器运行时执行
  • command将覆盖Dockerfile中的CMD
  • entrypoint将覆盖Dockerfile中的ENTRYPOINT
  • 存在多个command只有最后1个生效
  • 存在多个entrypoint只有最后1个生效
  • 同时存在command和entrypoint,command拼接到entrypoint后面
# shell模式
command: bundle exec thin -p 3000
# exec模式
command: [ "bundle", "exec", "thin", "-p", "3000" ]

多command执行

command: /bin/bash -c "echo hi xcrj && echo hello world"
command: /bin/sh -c "echo hi xcrj && echo hello world"

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/589782.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-13
下一篇 2022-04-13

发表评论

登录后才能评论

评论列表(0条)

保存