Docker-compose 详解

Docker-compose 详解

1.下载安装

sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose

#删除
rm -f /usr/local/bin/docker-compose

2.常用命令

docker --version 			#查看版本
docker-compose -h    		# 查看帮助
docker-compose up    		# 启动docker-compose服务
docker-compose up -d    	# 启动服务 -f 指定yaml文件
docker-compose down     	# 停止服务 -f 指定yaml文件
docker-compose top      	 # 展示当前docker-compose编排过的容器进程
docker-compose logs <name id> # 查看容器输出日志
docker-compose config    	 # 检查配置
docker-compose config -q 	 # 检查配置,有问题才有输出
docker-compose restart   	 # 重启服务

3.yaml 文件说明

version : '3'        #Compose文件版本支持特定的Docker版本
services:            #本工程的服务配置列表
  swapping:            #spring boot的服务名,服务名自定义
    container_name: swapping-compose   
                    #本spring boot服务之后启动的容器实例的名字,如果指定,按照这个命名容器,
                    #如果未指定,容器命名规则是【[compose文件所在目录]_[服务名]_1】,例如【swappingdockercompose_swapping_1】
            #如果多启动,也就是docker-compose scale swapping=3 mysql=2的话,就不需要指定容器名称,否则会报错 容器名重复存在的问题
    build:            #基于Dockerfile文件构建镜像时使用的属性
      context: .    #代表当前目录,也可以指定绝对路径[/path/test/Dockerfile]或相对路径[../test/Dockerfile],尽量放在当前目录,便于管理
      dockerfile: Dockerfile-swapping    #指定Dockerfile文件名。如果context指定了文件名,这里就不用本属性了
    ports:                        #影射端口属性
      - "9666:9666"               #建议使用字符串格式,指定宿主机端口映射到本容器的端口,前面是宿主机端口,后面是容器端口
    volumes:                      #挂载属性
      - .:/vol/development       
                                  #指定[宿主机目录:容器内目录]的挂载方式。
    depends_on:                   #本服务启动,需要依赖哪些别的服务  例如这里;mysql服务就会先于swapping服务启动。
      - mysql
    links:                        #与depends_on相对应,上面控制启动顺序,这个控制容器连接问题。
      - "mysql:mysql"            #值可以是- mysql[- 服务名],也可以是- "mysql:mysql"[- "服务名:别名"]
    restart: always              #是否随docker服务启动重启
    networks:                    #加入指定网络
      - my-network               #自定义的网络名
    environment:                 #environment 和 Dockerfile 中的 ENV 指令一样会把变量一直保存在镜像、容器中,类似 docker run -e 的效果。设置容器的环境变量
      - TZ=Asia/Shanghai        #这里设置容器的时区为亚洲上海,也就解决了容器通过compose编排启动的时区问题!
 
  mysql:                            #服务名叫mysql,自定义
    container_name: mysql-compose   #容器名
    image: mysql:5.7                #虽然没有使用build,但使用了image,指定基于mysql:5.7镜像为基础镜像来构建镜像。【使用build基于Dockerfile文件构建,Dockerfile文件中也有FROM基于基础镜像】
    ports:
      - "33061:3306"
    command: [                        #使用 command 可以覆盖容器启动后默认执行的命令
            '--character-set-server=utf8mb4',            #设置数据库表的数据集
            '--collation-server=utf8mb4_unicode_ci',    #设置数据库表的数据集
            '--default-time-zone=+8:00'                    #设置mysql数据库的 时区问题!!!! 而不是设置容器的时区问题!!!!
    ]
    environment:           
      MYSQL_DATABASE: swapping                             #设置初始的数据库名
      MYSQL_ROOT_PASSWORD: 398023                        #设置root连接密码
      MYSQL_ROOT_HOST: '%'
    restart: always
    networks:
      - my-network
networks:                        #关于compose中的networks的详细使用https://blog.csdn.net/Kiloveyousmile/article/details/79830810
  my-network:                    #自定义的网络,会在第一次构建时候创建自定义网络,默认是bridge

version

#version 指定了Docker-compose的版本信息
version: '3'

services

#services 指定了Docker Compose 编排中需要运行的服务,每个服务都要指定名称以及镜像
version: '3'
services:
	mysql: #服务名
		image: mysql:5.7 #指定镜像

build and image

#build 字段允许Docker Compose 编排中指定Dockerfile的位置,从而使用Docker Compose 构建镜像,image 需要指定已存在本地的镜像或者是自己指定的dockerhub
version: '3'
services:
	mysql:
		image: mysql:5.7
	redis:
		build: ./dockerfile

volumes and environment

# volumes 指定了需要挂载到容器的数据卷 environment 字段指定了容器的变量
version: '3'
services:
	mysql: 
		image: mysql:5.7
		environment:
			MYSQL_ROOT_PASSWD: 00000000	#指定了数据库密码
		volumes:
		- "$PWD/mysql/data:var/lib/mysql" #数据持久化挂载

ports and expose

# ports 是将容器的端口映射到宿主机上(宿主机端口:容器端口)expose 是将容器的端口暴露出来,并不是映射到宿主机上
version: '3'
services:
	mysql:
		image: mysql:5.7
		ports:
			- "3306:3306"
	redis:
		image: redis
		expose:
			- "6379"

container_name

#指定容器启动名称
version: '3'
services:
	mysql:
		container_name: mysql
		image: mysql:5.7

resources

#进行资源限制
version: "3"
services:
  redis:
    image: redis:alpine
    deploy:
      resources:
        # 设置容器的资源限制
        limits:
          cpus: '0.50'
          memory: 50M
        #设置为容器预留的系统资源(随时可用)
        reservations:
          cpus: '0.25'
          memory: 20M

command

#覆盖容器默认启动的命令
command: ["bundle", "exec", "thin", "-p", "3000"]

dns

#指定容器dns
dns: 8.8.8.8

dns:
  - "8.8.8.8"
  - "114.114.114.114"

env_file

#从文件添加环境变量。可以是单个值或列表的多个值
env_file: .env

extra_hosts

#添加主机名映射。类似 docker client --add-host。
extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"
 
 #以上会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系
162.242.195.82  somehost
50.31.209.229   otherhost

healthcheck

#用于检测 docker 服务是否健康运行。
healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序
  interval: 1m30s # 设置检测间隔
  timeout: 10s # 设置检测超时时间
  retries: 3 # 设置重试次数
  start_period: 40s # 启动后,多少秒开始启动检测程序

restart

# no:是默认的重启策略,在任何情况下都不会重启容器
# always:容器总是重新启动
# on-failure:在容器非正常退出时(退出状态非0),才会重启容器
# unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

sysctls

#设置容器中的内核参数,可以使用数组或字典格式
sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0

sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0

ulimits

#覆盖容器默认的 ulimit
ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000

常用模板

version: '3'
services: 
  nginx:
    restart: always 
    image: <imagename>
    container_name: <name>
    environment:
      - SET_CONTAINER_TIMEZONE=true
      - CONTAINER_TIMEZONE=Asia/Shanghai
    ports:
      - 80:80
    volumes: 
      - /etc/localtime:/etc/localtime

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值