赞
踩
当服务数量增多的时候,我们需要多次使用Dockerfile Build Image
或者DockerHub
拉取Image
;需要创建多个Container
,多次编写启动命令;还需要处理Container
互相依赖的如何进行管理和编排。
这个时候就需要Docker Compose帮我们创建和管理多容器。
Docker Compose是一个工具,用于定义和运行多容器应用程序的工具;
Docker Compose通过yml文件定义多容器的docker应用;
Docker Compose通过一条命令根据yml文件的定义去创建或管理多容器;
Docker Compose 是用来做Docker 的多容器控制,是一个用来把 Docker 自动化的东西。有了 Docker Compose 你可以把所有繁复的 Docker 操作全都一条命令,自动化的完成。
#设置jdk版本 FROM java:8 #设置我们的个人信息,根据需求随便写 MAINTAINER xxx <xxx@XXX.com> #这两行是设置我们容器内的时间以及jvm的时间(默认不是GMT) RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN echo "Asia/Shanghai" > /etc/timezone COPY *.jar /app.jar CMD ["--server.port:80"] EXPOSE 8443 ENTRYPOINT ["java", "-jar","/app.jar"]
# 指定我们docker-compose的版本 version: "3" # 设置我们的服务 services: # 配置mysql服务 mysql: # 指定镜像文件,mysql版本是5.7 image: mysql:5.7 # 配置容器的名字 container_name: mysql # 通过宿主机的3306端口映射到容器里的3306端口 ports: - "3306:3306" # 配置环境,主要是配置我们的mysql的登陆密码 environment: - MYSQL_ROOT_PASSWORD=root # 配置挂载的文件夹,在当前文件夹下面创建mysql文件夹,里面有conf,logs,data,分别挂载到容器mysql中的conf.d,logs,mysql中 volumes: - ./mysql/conf:/etc/mysql/conf.d - ./mysql/logs:/logs - ./mysql/data:/var/lib/mysql # 配置redis服务 redis: # 设置容器对应的镜像 image: redis:5.0 # 设置容器名 container_name: redis # 设置命令,设置redis登陆密码的,root处是密码 command: redis-server --requirepass root # 作为端口映射 ports: - "6379:6379" # 挂载文件夹 volumes: - ./redis:/data # 配置springboot服务 springboot: # 生成镜像,用.它会自动去当前目录下面去找一个Dockerfile的文件,然后根据里面的配置去生成一个镜像 build: . # 指定我们生成的镜像的名字和版本号 image: springboot:v1.0.0 # 指定容器名 container_name: springboot # 做端口映射 ports: - "8080:8080" # 写清楚springboot依赖的服务,springboot会在依赖的服务启动之后在启动。这里的名称是service名, depends_on: - mysql - redis
检查docker-compose.yml的语法是否正确,如果不发生报错,说明语法没有发生错误
docker-compose config
启动docker-compose.yml定义的服务
docker-compose up
版本
对于版本没什么介绍的,就是指定使用的版本;
Services
每个Service代表一个Container,与Docker一样,Container可以是从DockerHub中拉取到的镜像,也可以是本地Dockerfile Build的镜像。
image
标明image的ID,这个image ID可以是本地也可以是远程的,如果本地不存在,Docker Compose会尝试pull下来; image: ubuntu
build
该参数指定Dockerfile文件的路径,Docker Compose会通过Dockerfile构建并生成镜像,然后使用该镜像;
build:
#构建的地址
context: /usr/local/docker-compose-demo
dockerfile: Dockerfile
ports
暴露端口,指定宿主机到容器的端口映射,或者只指定容器的端口,则表示映射到主机上的随机端口,一般采用主机:容器的形式来映射端口;
#暴露端口
ports:
- 8081:8080/tcp
expose
暴露端口,但不需要建立与宿主机的映射,只是会向链接的服务提供;
environment
加入环境变量,可以使用数组或者字典,只有一个key的环境变量可以在运行compose的机器上找到对应的值;
env_file
从一个文件中引入环境变量,该文件可以是一个单独的值或者一个列表,如果同时定义了environment,则environment中的环境变量会重写这些值;
depends_on
定义当前服务启动时,依赖的服务,当前服务会在依赖的服务启动后启动;
depends_on:
- docker-compose-demo02
- docker-compose-demo01
deploy
该配置项在version 3里才引入,用于指定服务部署和运行时相关的参数;
replicas
指定副本数;
version: '3.4'
services:
worker:
image: nginx:latest
deploy:
replicas: 6
restart_policy
指定重启策略;
version: "3.4"
services:
redis:
image: redis:latest
deploy:
restart_policy:
condition: on-failure #重启条件:on-failure, none, any
delay: 5s # 等待多长时间尝试重启
max_attempts: 3 #尝试的次数
window: 120s # 在决定重启是否成功之前等待多长时间
update_config
定义更新服务的方式,常用于滚动更新;
version: '3.4'
services:
vote:
image: docker-compose-demo
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2 # 一次更新2个容器
delay: 10s # 开始下一组更新之前,等待的时间
failure_action:pause # 如果更新失败,执行的动作:continue, rollback, pause,默认为pause
max_failure_ratio: 20 # 在更新过程中容忍的失败率
order: stop-first # 更新时的操作顺序,停止优先(stop-first,先停止旧容器,再启动新容器)还是开始优先(start-first,先启动新容器,再停止旧容器),默认为停止优先,从version 3.4才引入该配置项
resources
限制服务资源;
version: '3.4'
services:
redis:
image: redis:alpine
deploy:
resources:
#限制CPU的使用率为50%内存50M
limits:
cpus: '0.50'
memory: 50M
#始终保持25%的使用率内存20M
reservations:
cpus: '0.25'
memory: 20M
healthcheck
执行健康检查;
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"] # 用于健康检查的指令
interval: 1m30s # 间隔时间
timeout: 10s # 超时时间
retries: 3 # 重试次数
start_period: 40s # 启动多久后开始检查
restart
重启策略;
#默认的重启策略,在任何情况下都不会重启容器
restart: "no"
#容器总是重新启动
restart: always
#退出代码指示失败错误,则该策略会重新启动容器
restart: on-failure
#重新启动容器,除非容器停止
restart: unless-stopped
networks
网络类型,可指定容器运行的网络类型;
#指定对应的网络
networks:
- docker-compose-demo-net
networks:
docker-compose-demo-net:
driver: bridge
ipam:
config:
- subnet: 192.168.1.0/24
gateway: 192.168.1.1
ipv4_address, ipv6_address
加入网络时,为此服务指定容器的静态 IP 地址;
version: "3.9" services: app: image: nginx:alpine networks: app_net: ipv4_address: 172.16.238.10 ipv6_address: 2001:3984:3989::10 networks: app_net: ipam: driver: default config: - subnet: "172.16.238.0/24" - subnet: "2001:3984:3989::/64"
Networks
网络决定了服务之间以及服务和外界之间如何去通信,在执行docker-compose up的时候,docker会默认创建一个默认网络,创建的服务也会默认的使用这个默认网络。服务和服务之间,可以使用服务的名字进行通信,也可以自己创建网络,并将服务加入到这个网络之中,这样服务之间可以相互通信,而外界不能够与这个网络中的服务通信,可以保持隔离性。
Volumes
挂载主机路径或命名卷,指定为服务的子选项。可以将主机路径挂载为单个服务定义的一部分,无需在顶级volume中定义。如果想在多个服务中重用一个卷,则在顶级volumes key 中定义一个命名卷,将命名卷与服务一起使用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。