docker-compose

参考
https://docs.docker.com/compose/compose-file/02-model/
https://mp.weixin.qq.com/s/Qenn7cdaX76ZVmK-mLRwdQ
https://mp.weixin.qq.com/s/3PEE28VomBYo5O525BaSzQ
https://www.jianshu.com/p/2217cfed29d7

docker compose是单机版的容器编排工具

docker-compose 项目是docker官方的开源项目, 负责实现对docker容器集群的快速编排,来轻松高效的管理容器,定义运行多个容器。
docker-compose将所管理的容器分为三层, 分别是工程(project),服务(service)以及容器(containner)
docker-compose运行目录下的所有文件(docker-compose.yml文件、extends文件或环境变量等)组成一个工程,如无特殊指定,工程名即为当前目录名。
一个工程当中,可以包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。
一个服务中可以包括多个容器实例

docker compose安装

方法1

yum install -y python2-pip
pip install docker-compose

方法2

yum -y install python36
pip3 install docker-compose

方法3

curl -SL https://github.com/docker/compose/releases/download/v2.17.0/docker-compose-linux-x86_64 -o /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose

docker-compose命令补全

yum install bash-completion
curl -L https://raw.githubusercontent.com/docker/compose/1.29.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

之后退出并重新登录即可

docker-compose命令

docker-compose [COMMAND] --help 或者docker-compose help [COMMAND]

格式

docker-compose [-f ...] [--profile ...] [options] [--] [COMMAND] [ARGS...]

Options参数选项

-f,--file file指定模板文件,默认是docker-compose.yml模板文件,可以多次指定
--profile  启动具有配置文件的服务
-p,--project-name name指定项目名称,默认使用所在目录名称作为项目名称
--x-networking 使用Docker的后端可插拔网络特性
--x-networking-driver driver指定网络的后端驱动,默认使用bridge
--verbose 输入更多的调试信息
-v,--version 输出版本信息

COMMAND参数详解

build              Build or rebuild services (构建项目中的服务容器)
bundle             Generate a Docker bundle from the Compose file (从Compose文件生成分布式应用程序包)
config             Validate and view the Compose file (验证并查看Compose文件)
create             Create services (为服务创建容器)
down               Stop and remove containers, networks, images, and volumes (停止容器并删除由其创建的容器,网络,卷和图像up)
events             Receive real time events from containers (为项目中的每个容器流式传输容器事件)
exec               Execute a command in a running container (这相当于docker exec。使用此子命令,您可以在服务中运行任意命令。默认情况下,命令分配TTY,因此您可以使用命令docker-compose exec web sh来获取交互式提示。)
help               Get help on a command (获得一个命令的帮助)
images             List images ()
kill               Kill containers (通过发送SIGKILL信号来强制停止服务容器)
logs               View output from containers (查看服务容器的输出)
pause              Pause services (暂停一个容器)
port               Print the public port for a port binding (打印某个容器端口所映射的公共端口)
ps                 List containers (列出项目中目前所有的容器)
pull               Pull service images (拉取服务依赖镜像)
push               Push service images (推送服务镜像)
restart            Restart services (重启项目中的服务)
rm                 Remove stopped containers (删除所有停止状态的服务容器)
run                Run a one-off command (在指定服务上执行一个命令)
scale              Set number of containers for a service (设置指定服务执行的容器个数)
start              Start services (启动已存在的服务容器)
stop               Stop services (停止已存在的服务容器)
top                Display the running processes (显示容器正在运行的进程)
unpause            Unpause services (恢复处于暂停状态的容器)
up                 Create and start containers (自动完成包括构建镜像、创建服务、启动服务并关联服务相关容器的一系列操作)
version            Show the Docker-Compose version information (输出版本)

docker-compose yaml语法

docker-compose语法版本可以参考官方文档
https://docs.docker.com/compose/compose-file/

语法说明

version: "3" #docker-compose语法版本
services: #容器
  servicename1: #服务名称,这个名称也是内部bridge网络可以使用的DNS name
    build: ./目录  # 指定一个包含 Dockerfile 的目录
    image: "镜像名称" #镜像名称
	container_name: 容器名称
    command: #可选,如果设置,则会覆盖默认镜像里面的CMD命令
    environment: #可选,相当于 docker run里面的--env
      - var: value
    volumes: #可选,相当于docker run里面的 -v
      - volumename:容器中目录:rw
    healthcheck:  #健康检查
      test: 检测命令
      interval: 30s
      timeout: 10s
      retries: 3
    networks: #可选,相当于docker run里面的--network
	  - networkname
    ports: #可选,相当于docker run里面的-p
      - 8080:5000
    links: #连接另一个服务
      - servicename
	depends_on: #依赖另一个服务
      - servicename
	restart: always #重启策略
    devices:
      - "/dev/kmsg:/dev/kmsg"
    ulimits: #设置ulimit
      nofile:
        soft: "65535"
        hard: "65535"
	user: username:groupname #运行容器时的用户
    configs:
      - source: configname
        target: 容器中文件
    secrets:
      - source: secretname
        target: 容器中文件
    deploy: #服务部署配置
      replicas: 3
      resources:
        limits:
          cpus: '0.5'
          memory: '256M'
        reservations:
          cpus: '0.25'
          memory: '128M'	
  servicename2: #服务名称,这个名称也是内部bridge网络可以使用的DNS name
    build: ./目录  # 指定一个包含 Dockerfile 的目录
    image: "镜像名称" #镜像名称
	container_name: 容器名称
    command: #可选,如果设置,则会覆盖默认镜像里面的CMD命令
    environment: #可选,相当于 docker run里面的--env
      - var: value
    volumes: #可选,相当于docker run里面的 -v
	  - volumename:容器中目录:rw
    networks: #可选,相当于docker run里面的--network
      - networkname
    ports: #可选,相当于docker run里面的-p
      - 8080:5000
    links: #连接另一个服务
      - servicename
	depends_on: #依赖另一个服务
      - servicename
	restart: always #重启策略
	user: username:groupname #运行容器时的用户
    configs:
      - source: configname
        target: 容器中文件
    secrets:
      - source: secretname
        target: 容器中文件
    deploy: #服务部署配置
      replicas: 3
      resources:
        limits:
          cpus: '0.5'
          memory: '256M'
        reservations:
          cpus: '0.25'
          memory: '128M'

volumes: #可选,相当于 docker volume create
  volumename:

networks: #可选,相当于 docker network create
  networkname:
    driver: bridge
    external: true

configs:
  configname:
    file: 宿主机文件

secrets:
  secretname:
    file: 宿主机文件
version: "3"
services:
  servicename1:
    build: ./目录
    image: "镜像名称"
	container_name: 容器名称
    command:
    environment:
      - var: value
    volumes:
      - volumename:容器中目录
    networks:
	  - networkname
    ports:
      - 8080:5000
    links:
      - servicename
	depends_on:
      - servicename
	restart: always
	user: username:groupname
    configs:
      - source: configname
        target: 容器中文件
    secrets:
      - source: secretname
        target: 容器中文件
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: '0.5'
          memory: '256M'
        reservations:
          cpus: '0.25'
          memory: '128M'	
  servicename2:
    build: ./目录
    image: "镜像名称"
	container_name: 容器名称
    command:
    environment:
      - var: value
    volumes:
	  - volumename:容器中目录
    networks:
      - networkname
    ports:
      - 8080:5000
    links:
      - servicename
	depends_on:
      - servicename
	restart: always
	user: username:groupname
    configs:
      - source: configname
        target: 容器中文件
    secrets:
      - source: secretname
        target: 容器中文件
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: '0.5'
          memory: '256M'
        reservations:
          cpus: '0.25'
          memory: '128M'

volumes:
  volumename:

networks:
  networkname:
    driver: bridge

configs:
  configname:
    file: 宿主机文件

secrets:
  secretname:
    file: 宿主机文件

docker compose示例

示例1

mkdir my_wordpress
cd my_wordpress/

vim docker-compose.yml

version: '3'
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
volumes:
  db_data:

启动

docker-compose -f docker-compose.yml up

后台启动

docker-compose -f docker-compose.yml up -d

示例2

version: '3'
services:
  web:
    image: dockercloud/hello-world
    ports:
      - 8080
    networks:
      - front-tier
      - back-tier

  redis:
    image: redis
    links:
      - web
    networks:
      - back-tier

  lb:
    image: dockercloud/haproxy
    ports:
      - 80:80
    links:
      - web
    networks:
      - front-tier
      - back-tier
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock 

networks:
  front-tier:
    driver: bridge
  back-tier:
    driver: bridge

docker compose 官方文档示例

version: '3'
services:
  frontend:
    image: awesome/webapp
    ports:
      - "443:8043"
    networks:
      - front-tier
      - back-tier
    configs:
      - httpd-config
    secrets:
      - server-certificate

  backend:
    image: awesome/database
    volumes:
      - db-data:/etc/data
    networks:
      - back-tier

volumes:
  db-data:
    driver: flocker
    driver_opts:
      size: "10GiB"

configs:
  httpd-config:
    external: true

secrets:
  server-certificate:
    external: true

networks:
  # The presence of these objects is sufficient to define them
  front-tier: {}
  back-tier: {}

docker-compose更新服务

1.使用docker-compose up -d命令更新容器

如果已经修改了docker-compose.yml文件,并且希望更新其中的某个容器,可以直接使用docker-compose up -d命令。该命令会更新docker-compose.yml中修改过的服务,并根据修改的设置进行重新配置。例如:

docker-compose up -d service-name

其中 service-name是需要更新的服务名。

2.使用docker-compose stop和docker-compose rm命令重新启动容器

如果需要完全重启一个容器,并清除其中的所有数据,可以使用以下两个命令:

docker-compose stop service-name
docker-compose rm -f service-name
docker-compose up -d service-name

这会停止并删除名为 service-name 的容器,并根据docker-compose.yml重新启动它。这种方法比较适用于需要对容器进行某些比较复杂的更改,或者在更新过程中出现了一些问题

docker-compose 一组容器之间无法通过容器名称通信,可能是宿主机防火墙导致,关闭主机防火墙,恢复备份的iptables规则,然后docker-compose down && docker-compose up -d

iptables规则备份恢复

#保存iptables规则
iptables-save > iptables_bak

#恢复iptables规则
iptables-restore < iptables_bak

#查看iptables规则
iptables -t filter -nL
iptables -t nat -nL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wuxingge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值