Docker-学习总结(三剑客之Docker-compose)

文章目录

  • 相关网站
  • 背景
  • 概念
  • 相关命令
  • docker-compose.yml文件中的命令
  • 练习

相关网站

  • Docker Compose官方:https://docs.docker.com/compose/
  • GitHub资源:https://github.com/docker/compose/releases
  • 阿里云资源:http://mirrors.aliyun.com/docker-toolbox/linux/compose/

背景

  • Docker Compose 的前身是 Fig。Fig 是一个由 Orchard 公司开发的强有力的工具,在当时是进行多容器管理的最佳方案。Fig 是一个基于 Docker 的 Python 工具,允许用户基于一个 YAML 文件定义多容器应用,从而可以使用 fig 命令行工具进行应用的部署。Fig 还可以对应用的全生命周期进行管理。内部实现上,Fig 会解析 YAML 文件,并通过 Docker API 进行应用的部署和管理。后来Docker 公司收购了 Orchard 公司,并将 Fig 更名为 Docker Compose。命令行工具也从 fig 更名为 docker-compose,并自此成为绑定在 Docker 引擎之上的外部工具。虽然它从未完全集成到 Docker 引擎中,但是仍然受到广泛关注并得到普遍使用。直至今日,Docker Compose 仍然是一个需要在 Docker 主机上进行安装的外部 Python 工具。

概念

  • Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排
  • Docker Compose 是一种编排服务,基于python语言实现
  • Docker Compose 实现容器编排,需要先使用 YAML 文件来配置你的应用服务,然后, 将YAML 文件交由docker-compose命令处理,Docker Compose 就会基于 Docker 引擎 API 完成应用的部署。
  • Docker Compose 将所管理的容器分为三层:项目(project),服务(service)以及容器(contaienr)
    • 项目【project】:Docker Compose 运行的目录下的所有文件(docker-compose.yml, extends 文件或环境变量文件等)组成一个工程(若无特殊指定工程名即为当前目录名);一个工程当中可包含多个服务
    • 服务【service】:服务中定义了容器运行的镜像,参数,依赖一个服务当中可包括多个容器实例
    • 容器【contaienr】:真实承载内容的容器
  • Docker Compose 并没有解决负载均衡的问题,需要借助其他工具实现服务发现及负载均衡
  • Docker Compose 是用来在单机上编排容器(定义和运行多个容器,使容器能互通)

相关命令

[root@node1 compose]# docker-compose --help
Define and run multi-container applications with Docker.
#使用docker,定义运行多容器应用
Usage:
  docker-compose [-f ...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help
#格式
Options:
  -f, --file FILE             Specify an alternate compose file|指定一个可选的Compose yaml文件(默认:docker-compose.yml)
                              (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name|指定项目名称(默认:当前目录名称)
                              (default: directory name)
  --verbose                   Show more output|展示更多信息
  --log-level LEVEL           Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)|设置日志等级
  --no-ansi                   Do not print ANSI control characters
  -v, --version               Print version and exit|打印版本信息并且退出
  -H, --host HOST             Daemon socket to connect to|连接守护进程套接字

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the
                              name specified in the client certificate
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the Compose file)
  --compatibility             If set, Compose will attempt to convert deploy
                              keys in v3 files to their non-Swarm equivalent

Commands:
  build              Build or rebuild services|构建或者重建服务
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file|验证和查看配置文件,可以将配置信息显示出来
  create             Create services|创建服务
  down               Stop and remove containers, networks, images, and volumes|停止并且删除容器、服务、网络设置、镜像、数据卷
  events             Receive real time events from containers|从容器接收时时的事件
  exec               Execute a command in a running container|给正在运行的容器执行一条命令
  help               Get help on a command|帮助信息
  images             List images|显示使用的镜像
  kill               Kill containers|强制停止服务容器
  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.yml文件中的命令

version:					#指定 docker-compose.yml 文件的写法格式
services:					#服务设置
  image:					#指定服务所使用的镜像,这个镜像可以是本地也可以是远程的,如果本地不存在,Compose会尝试去pull下来。当然除了使用镜像名称,也可以使用镜像ID
  build: 					#指定Dockerfile文件的路径,该目录也是发送到守护进程的构建环境(这句有点),Compose将会以一个已存在的名称进行构建并标记,并随后使用这个image
    context:				#上下文路径
    dockerfile:			#指定构建镜像的 Dockerfile 文件命
    args:					#添加构建参数,这是只能在构建过程中访问的环境变量
    labels:				#设置构建镜像的标签
    target:				#多层构建,可以指定构建哪一层
  cap_add:					#添加容器拥有的宿主机的内核功能
    - ALL 					#开启全部权限
  cap_drop:					#删除容器拥有的宿主机的内核功能
    - SYS_PTRACE 			#关闭 ptrace权限
  cgroup_parent:			#为容器指定父 cgroup 组,意味着将继承该组的资源限制
  command:					#覆盖容器启动后默认执行的命令
  container_name			#指定自定义容器名称,而不是生成的默认名称
  depend_on:  				#规定service的加载顺序,例如数据库服务需要在后台服务前运行
  deploy:					#指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用
    endpoint_mode:			#访问集群服务的方式
  	endpoint_mode: vip 		#Docker集群服务一个对外的虚拟IP。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。
 	endpoint_mode: dnsrr	#DNS轮询(DNSRR)。所有的请求会自动轮询获取到集群ip列表中的一个ip 地址。
  	labels:				#在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels
      description: 			#具体标签描述的内容
 	mode:					#指定服务提供的模式
 	mode:replicated			#复制服务,复制指定服务到集群的机器上。
  	mode:global				#全局服务,服务将部署至集群的每个节点
  	replicas:				#mode为replicated时,需要使用此参数配置具体运行的节点数量
  	resources:				#配置服务器资源使用的限制,例如配置集群运行需要的 cpu 的百分比和内存的占用。避免占用资源过高出现异常
  	  limits:				#资源限制
    	cpus: '0.50'		#CPU限制为正常使用的50%
    	memory: 50M			#内存使用上限为50M
  	restart_policy:		#配置如何在退出容器时重新启动容器
	  condition:			#在什么条件下重新启动容器,可选none\on-failure(非正常退出)\any(默认值:any)
	  delay:				#设置多久之后重启(默认值:0)
	  max_attempts:		#尝试重新启动容器的次数,超出次数,则不再尝试(默认值:一直重试)
	  window:				#设置容器重启超时时间(默认值:0) 
	rollback_config:		#配置在更新失败的情况下应如何回滚服务
	  parallelism:			#一次要回滚的容器数。如果设置为0,则所有容器将同时回滚
	  delay:				#每个容器组回滚之间等待的时间(默认为0s)
	  failure_action:		#如果回滚失败,该怎么办。其中一个continue 或者 pause(默认pause)
	  monitor:				#每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)
	  max_failure_ratio:	#在回滚期间可以容忍的故障率(默认为0)
	  order:				#回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认 stop-first )
    update_config:			#配置应如何更新服务,对于配置滚动更新很有用。

	  parallelism:			#一次更新的容器数。
	  delay:				#在更新一组容器之间等待的时间。
      failure_action:		#如果更新失败,该怎么办。其中一个 continue,rollback 或者pause (默认:pause)。
	  monitor:				#每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
      max_failure_ratio:	#在更新过程中可以容忍的故障率。
      order:				#回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认stop-first)
  devices					#指定设备映射列表
    - "/dev/ttyUSB0:/dev/ttyUSB0"
  dns						#自定义DNS服务器,可以是单个值或列表的多个值
  dns: 8.8.8.8				#单个形式
  dns:						#多个形式
    - 8.8.8.8			
    - 114.114.114.114
  dns_search				#自定义DNS搜索域。可以是单个值或列表
  dns_search: example.com	#单个形式
  dns_search:				#多个形式
    - dc1.example.com
    - dc2.example.com
  entrypoint:				#覆盖容器默认的entrypoint
  env_file:				#从文件添加环境变量。可以是单个值或列表的多个值
  env_file: .env			#单个形式
  env_file:					#多个形式
 	- ./common.env
    - ./apps/web.env
    - /opt/secrets.env
  environment:				#添加环境变量。可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False
  expose:					#定义容器用到的端口,显示出来方便用ports映射,仅可以指定容器内部端口为参数
  extra_hosts:				#添加主机名映射,类似于docker里的--add-host参数,配置DNS域名解析
  extra_hosts:				#映射格式“域名:IP地址”
   - "hostname1:1.1.1.1"
   - "host2:2.2.2.2"
  healthcheck				#用于检测docker服务是否健康运行
  healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost"] #设置检测程序
    interval: 1m30s			#设置检测间隔
    timeout: 10s 			#设置检测超时时间
  	retries: 3 				#设置重试次数
  	start_period: 40s 		#启动后,多少秒开始启动检测程序
  logging:					#服务的日志记录配置,可以设置驱动程序dirver,diver有三种模式
    dirver:				#dirver指定服务容器的日志记录驱动程序,默认值为json-file
    driver: json-file		# json-file驱动程序下,可以使用以下参数,限制日志得数量和大小
      options:				#设置选项,根据设置选项当达到文件限制上限,会自动删除旧得文件
        max-size: "200k"	#单个文件大小为200k
        max-file: "10"	   	#最多10个
    driver: syslog			#syslog驱动程序,可以使用 syslog-address 指定日志接收地址
      options:
        syslog-address: "tcp://192.168.0.42:123"
    driver: "none"			#none
  links:					#将指定容器连接到当前连接,可以设置别名
  networks:				#设置使用指定网络配置(bridge:默认)
  network_mode:			#设置网络模式
  ports:					#定义宿主机端口和容器端口的映射,可使用宿主机IP+宿主机端口进行访问【宿主机端口:容器端口】
  privileged: true 			#开启特权模式
  restart:  				#配置重启,后接条件
  restart: "no"				#是默认的重启策略,在任何情况下都不会重启容器
  restart: always			#容器总是重新启动
  restart: on-failure		#在容器非正常退出时(退出状态非0),才会重启容器
  restart: unless-stopped	#unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容
  secrets:					#存储敏感数据
  security_opt				#修改容器默认的schema标签
  security-opt:
    - label:user:USER   	#设置容器的用户标签
    - label:role:ROLE   	#设置容器的角色标签
    - label:type:TYPE   	#设置容器的安全策略标签
    - label:level:LEVEL  	#设置容器的安全等级标签
  stop_grace_period:		#指定在容器无法处理 SIGTERM (或者任何stop_signal的信号),等待多久后发送 SIGKILL 信号关闭容器(默认的等待时间是10秒)
  stop_signal				#设置停止容器的替代信号。默认情况下使用 SIGTERM 
  sysctls:					#设置容器中的内核参数,可以使用数组或字典格式
    - net.ipv4.tcp_syncookies=0
  tmpfs:					#在容器内安装一个临时文件系统。可以是单个值或列表的多个值
  tmpfs: /run				#单个形式
  tmpfs:					#多个形式
    - /run
    - /tmp
  ulimits:					#覆盖容器默认的 ulimit,用于控制系统资源
  ulimits:
    nproc: 65535
    nofile:
      soft: 20000
      hard: 40000
  user: root 				#指定容器运行的用户名
  volumes:					#卷挂载路径,定义宿主机的目录/文件和容器的目录/文件的映射【宿主机路径:容器路径】

练习

  • 练习内容:使用docker compose管理nginx、haproxy镜像,实现nginx网页的高可用,就是在一台宿主机上同时利用多个镜像拉起多个容器,实现负载均衡
  • 试验环境:一台虚拟机,安装有docker软件,包含nginx和haproxy镜像
  • 练习步骤:
  1. 安装docker-compose
[root@node1 opt]# mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
#将下载的二进制文件,复制到/usr/local/bin/,并且将名称改短点
[root@node1 opt]# chmod +x /usr/local/bin/docker-compose
#赋予执行权限
[root@node1 opt]# docker-compose -v
docker-compose version 1.21.2, build a133471
#查看版本信息
  1. 配置docker-compose.yml文件
[root@node1 compose]# mkdir compose
#创建compose目录,放置配置文件
[root@node1 opt]# cd compose/
[root@node1 compose]# vim docker-compose.yml
web1:										#设置后端服务容器web1
  image: nginx								#使用镜像
  volumes:									#添加本地数据卷
    - ./web1:/usr/share/nginx/html
web2:
  image: nginx
  volumes:
    - ./web2:/usr/share/nginx/html
haproxy:									#设置集群控制容器
  image: haproxy							#使用镜像haproxy
  volumes:									#添加配置文件
    - ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
  expose:									#端口显示信息
    - 80
  ports:									#端口映射
    - "80:80"
  links:									#链接容器
    - web1
    - web2
  1. 根据docker-compose.yml文件,配置相应的启动条件
[root@node1 compose]# mkdir haproxy web1 web2
[root@node1 compose]# vim haproxy/haproxy.cfg
#使用haproxy实现负载均衡,所以要有配置文件
global	#全局设置
        maxconn         65535				#设定一个前端的最大并发连接数
        stats socket    /var/run/haproxy.stat mode 600 level admin
        log             127.0.0.1 local0	#日志输出配置,所有日志都记录在本机,通过local0输出
        uid             200					#所属运行的用户uid
        gid             200					#所属运行的用户组
        #chroot          /var/empty			#改变当前工作目录
        daemon								#以守护进程方式运行
defaults#默认设置
        mode            http				#工作模式,支持TCP、http、health
        log             global				#引用全局的日志配置
        option          httplog				#启用HTTP请求,会话状态和计时器的日志记录
        option          dontlognull			#启用空连接不记录日志
        monitor-uri     /monitoruri			#
        maxconn         8000				#每个进程可用的最大连接数
        timeout client  30s					#设置客户端的最长不活动时间
        retries         2					#当对server的connection失败后,重试的次数
        option redispatch					#当serverid对应的服务器挂掉后,强制定向到其他健康服务器
        timeout connect 5s					#设置等待连接尝试到服务器成功的最长时间
        timeout server  5s					#设置服务器端的最长不活动时间
        stats uri       /admin/stats		#haproxy 监控页面的访问地址
# The public 'www' address in the DMZ
frontend public#前端设置
        bind            *:80
        default_backend dynamic
# The static backend backend for 'Host: img', /img and /css.
backend dynamic											#后端设置
        balance         roundrobin 						#轮询方式rr
        server          web1 web1:80 check inter 1000	#后端web1,检测心跳频率1000
        server          web2 web2:80 check inter 1000	#后端web2,检测心跳频率1000
[root@node1 compose]# echo web1 > web1/index.html
[root@node1 compose]# echo web2 > web2/index.html
#web1和web2显示页面,切分调度轮询
[root@node1 compose]# tree -C ./
./
├── docker-compose.yml
├── haproxy
│   └── haproxy.cfg
├── web1
│   └── index.html
└── web2
    └── index.html
#conpose目录下的文件结构
[root@node1 images]# docker load -i haproxy.tar 
917c0fc99b35: Loading layer  130.9MB/130.9MB
5f70bf18a086: Loading layer  1.024kB/1.024kB
c205bb11f213: Loading layer  4.684MB/4.684MB
ffef890bdf7b: Loading layer  9.549MB/9.549MB
3ec368642ee3: Loading layer  2.048kB/2.048kB
Loaded image: haproxy:latest
[root@node1 images]# docker load -i nginx.tar 
014cf8bfcb2d: Loading layer  58.46MB/58.46MB
832a3ae4ac84: Loading layer  53.91MB/53.91MB
e89b70d28795: Loading layer  3.584kB/3.584kB
Loaded image: nginx:latest
[root@node1 images]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              e548f1a579cf        24 months ago       109MB
haproxy             latest              fbd1f55f79b3        3 years ago         139MB
#建立docker和nginx镜像
  1. 运行docker-compose.yml配置
[root@node1 compose]# docker-compose up -d
#创建负载均衡集群
Creating compose_web2_1 ... done
Creating compose_web1_1 ... done
Creating compose_haproxy_1 ... done
[root@node1 compose]# docker-compose ps
#查看节点信息
      Name                     Command               State         Ports       
-------------------------------------------------------------------------------
compose_haproxy_1   /docker-entrypoint.sh hapr ...   Up      0.0.0.0:80->80/tcp
compose_web1_1      nginx -g daemon off;             Up      80/tcp            
compose_web2_1      nginx -g daemon off;             Up      80/tcp            
[root@node1 compose]# docker ps
#查看运行容器信息
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
b3601f5c43e1        haproxy             "/docker-entrypoint.…"   21 minutes ago      Up 21 minutes       0.0.0.0:80->80/tcp   compose_haproxy_1
ec95c2e401b4        nginx               "nginx -g 'daemon of…"   21 minutes ago      Up 21 minutes       80/tcp               compose_web1_1
db073481791b        nginx               "nginx -g 'daemon of…"   21 minutes ago      Up 21 minutes       80/tcp               compose_web2_1

  1. 访问测试
[root@node1 compose]# curl 192.168.27.11
web1
[root@node1 compose]# curl 192.168.27.11
web2
[root@node1 compose]# curl 192.168.27.11
web1
[root@node1 compose]# curl 192.168.27.11
web2
  1. 对配置docker-compose.yml文件修改,设置统一的数据访问,与网络
[root@node1 compose]# vim docker-compose.yml
version: '3'
services:
  web1:
    image: nginx
    volumes:
      - web-data:/usr/share/nginx/html
    networks:
      - vm_net
  web2:
    image: nginx
    volumes:
      - web-data:/usr/share/nginx/html
    networks:
      - vm_net
  haproxy:
    image: haproxy
    volumes:
      - ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
    expose:
      - 80
    ports:
      - "80:80"
volumes:
  web-data:
#统一数据卷
networks:
  vm_net:
#统一的网络,有DNS解析

7.删除之前的集群,重新生成新的集群

[root@node1 compose]# docker-compose down
Stopping compose_haproxy_1 ... done
Stopping compose_web1_1    ... done
Stopping compose_web2_1    ... done
Removing compose_haproxy_1 ... done
Removing compose_web1_1    ... done
Removing compose_web2_1    ... done
Removing network compose_vm_net
WARNING: Network compose_vm_net not found.
#由于修改了文件,提示没有vm_net
[root@node1 compose]# docker-compose up -d
Creating network "compose_vm_net" with the default driver
Creating compose_haproxy_1 ... done
Creating compose_web2_1    ... done
Creating compose_web1_1    ... done
  1. 在统一管理卷中设置访问页面
[root@node1 compose]# docker volume ls
DRIVER              VOLUME NAME
local               compose_web-data
#查看卷信息
[root@node1 compose]# docker volume inspect compose_web-data 
[
    {
        "CreatedAt": "2020-02-14T14:21:01-05:00",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "compose",
            "com.docker.compose.version": "1.21.2",
            "com.docker.compose.volume": "web-data"
        },
        "Mountpoint": "/var/lib/docker/volumes/compose_web-data/_data",
        "Name": "compose_web-data",
        "Options": null,
        "Scope": "local"
    }
]
#查看生成卷的挂载地址
[root@node1 compose]# cd /var/lib/docker/volumes/compose_web-data/_data
[root@node1 _data]# ls
50x.html  index.html
[root@node1 _data]# echo helloworld! > index.html
#修改访问页面
  1. 再次进行测试
[root@node1 compose]# curl 192.168.27.11
helloworld!
[root@node1 compose]# curl 192.168.27.11
helloworld!
[root@node1 compose]# curl 192.168.27.11
helloworld!
[root@node1 compose]# curl 192.168.27.11
helloworld!

你可能感兴趣的:(Linux运维-企业实战,Docker)