一、docker-compose介绍
Docker Compose是一个用来定义和运行多个复杂应用的Docker编排工具。例如,一个使用Docker容器的微服务项目,通常由多个容器应用组成。那么部署时如何快速启动各个微服务呢,一个个手动启动?假如有上百个微服务呢,显然不现实,那么使用Docker Compose编排工具便可快速启动容器。
Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。
二、docker-compose简介及基础概念
docker-compose项目是docker官方的开源项目, 负责实现对docker容器集群的快速编排。
docker-compose将所管理的容器分为三层, 分别是工程(project),服务(service)以及容器(containner)
docker-compose运行目录下的所有文件(docker-compose.yml文件、extends文件或环境变量等)组成一个工程,如无特殊指定,工程名即为当前目录名。
一个工程当中,可以包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。
一个服务中可以包括多个容器实例,docker-compose并没有解决负载均衡的问题。因此需要借助其他工具实现服务发现及负载均衡,比如consul。
docker-compose的工程配置文件默认为docker-compose.yml。可以通过环境变量COMPOSE_FILE -f 参数自定义配置文件,其自定义多个有依赖关系的服务及每个人服务运行的容器。
三、为什么要使用docker-compose
我们知道,一个单独的容器项目,我们很容易可以使用一个Dockerfile模板文件。在工作中,经常会碰到需要多个容器相互配合的微服务项目来完成某项任务的情况,例如要实现一个web项目,除了web服务容器本身,往往还需要再加上后端的数据库服务容器,负载均衡容器等基础服务,还有多个微服务项目需要启动,单独手动启动肯定会相当繁琐,那么docker-compose就应运而生了。
compose允许用户通过一个单独docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project),然后操作这个项目(project)即可对所有容器进行高效操作了。
docker-compose项目由pypthon编写,调用docker服务提供的API来对容器进行管理,因此, 只要所操作的平台支持docker-API,就可以在其上利用conpose来进行编排管理。
简单来说:就是来管理多个容器的,定义启动顺序的,合理编排,方便管理。
四、安装docker-compose
#下载docker<span class="token operator">-</span>compose文件 curl <span class="token operator">-</span><span class="token constant">L</span> <span class="token literal-property property">https</span><span class="token operator">:</span><span class="token operator">/</span><span class="token operator">/</span>github<span class="token punctuation">.</span>com<span class="token operator">/</span>docker<span class="token operator">/</span>compose<span class="token operator">/</span>releases<span class="token operator">/</span>download<span class="token operator">/</span><span class="token number">1.21</span><span class="token number">.1</span><span class="token operator">/</span>docker<span class="token operator">-</span>compose<span class="token operator">-</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">uname -s</span><span class="token template-punctuation string">`</span></span><span class="token operator">-</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">uname -m</span><span class="token template-punctuation string">`</span></span> <span class="token operator">-</span>o <span class="token operator">/</span>usr<span class="token operator">/</span>local<span class="token operator">/</span>bin<span class="token operator">/</span>docker<span class="token operator">-</span>compose #将文件复制到<span class="token operator">/</span>usr<span class="token operator">/</span>local<span class="token operator">/</span>bin环境变量下面 mv docker<span class="token operator">-</span>compose <span class="token operator">/</span>usr<span class="token operator">/</span>local<span class="token operator">/</span>bin #给他一个执行权限 chmod <span class="token operator">+</span>x <span class="token operator">/</span>usr<span class="token operator">/</span>local<span class="token operator">/</span>bin<span class="token operator">/</span>docker<span class="token operator">-</span>compose #查看是否安装成功 docker<span class="token operator">-</span>compose <span class="token operator">-</span>version#下载docker<span class="token operator">-</span>compose文件 curl <span class="token operator">-</span><span class="token constant">L</span> <span class="token literal-property property">https</span><span class="token operator">:</span><span class="token operator">/</span><span class="token operator">/</span>github<span class="token punctuation">.</span>com<span class="token operator">/</span>docker<span class="token operator">/</span>compose<span class="token operator">/</span>releases<span class="token operator">/</span>download<span class="token operator">/</span><span class="token number">1.21</span><span class="token number">.1</span><span class="token operator">/</span>docker<span class="token operator">-</span>compose<span class="token operator">-</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">uname -s</span><span class="token template-punctuation string">`</span></span><span class="token operator">-</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">uname -m</span><span class="token template-punctuation string">`</span></span> <span class="token operator">-</span>o <span class="token operator">/</span>usr<span class="token operator">/</span>local<span class="token operator">/</span>bin<span class="token operator">/</span>docker<span class="token operator">-</span>compose #将文件复制到<span class="token operator">/</span>usr<span class="token operator">/</span>local<span class="token operator">/</span>bin环境变量下面 mv docker<span class="token operator">-</span>compose <span class="token operator">/</span>usr<span class="token operator">/</span>local<span class="token operator">/</span>bin #给他一个执行权限 chmod <span class="token operator">+</span>x <span class="token operator">/</span>usr<span class="token operator">/</span>local<span class="token operator">/</span>bin<span class="token operator">/</span>docker<span class="token operator">-</span>compose #查看是否安装成功 docker<span class="token operator">-</span>compose <span class="token operator">-</span>version#下载docker-compose文件 curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose #将文件复制到/usr/local/bin环境变量下面 mv docker-compose /usr/local/bin #给他一个执行权限 chmod +x /usr/local/bin/docker-compose #查看是否安装成功 docker-compose -version
# 卸载docker<span class="token operator">-</span>compose rm <span class="token operator">/</span>usr<span class="token operator">/</span>local<span class="token operator">/</span>bin<span class="token operator">/</span>docker<span class="token operator">-</span>compose# 卸载docker<span class="token operator">-</span>compose rm <span class="token operator">/</span>usr<span class="token operator">/</span>local<span class="token operator">/</span>bin<span class="token operator">/</span>docker<span class="token operator">-</span>compose# 卸载docker-compose rm /usr/local/bin/docker-compose
五、使用docker-compose编排springboot项目
mkdir <span class="token operator">~</span><span class="token operator">/</span>docker<span class="token operator">-</span>compose cd <span class="token operator">~</span><span class="token operator">/</span>docker<span class="token operator">-</span>composemkdir <span class="token operator">~</span><span class="token operator">/</span>docker<span class="token operator">-</span>compose cd <span class="token operator">~</span><span class="token operator">/</span>docker<span class="token operator">-</span>composemkdir ~/docker-compose cd ~/docker-compose
<span class="token literal-property property">version</span><span class="token operator">:</span> <span class="token string">"3"</span> <span class="token literal-property property">services</span><span class="token operator">:</span> <span class="token literal-property property">redis</span><span class="token operator">:</span> <span class="token literal-property property">image</span><span class="token operator">:</span> redis<span class="token operator">:</span>alpine <span class="token literal-property property">ports</span><span class="token operator">:</span> <span class="token operator">-</span> <span class="token string">"6379"</span> <span class="token literal-property property">networks</span><span class="token operator">:</span> <span class="token operator">-</span> frontend <span class="token literal-property property">deploy</span><span class="token operator">:</span> <span class="token literal-property property">replicas</span><span class="token operator">:</span> <span class="token number">2</span> <span class="token literal-property property">update_config</span><span class="token operator">:</span> <span class="token literal-property property">parallelism</span><span class="token operator">:</span> <span class="token number">2</span> <span class="token literal-property property">delay</span><span class="token operator">:</span> 10s <span class="token literal-property property">restart_policy</span><span class="token operator">:</span> <span class="token literal-property property">condition</span><span class="token operator">:</span> on<span class="token operator">-</span>failure <span class="token literal-property property">db</span><span class="token operator">:</span> <span class="token literal-property property">image</span><span class="token operator">:</span> postgres<span class="token operator">:</span><span class="token number">9.4</span> <span class="token literal-property property">volumes</span><span class="token operator">:</span> <span class="token operator">-</span> db<span class="token operator">-</span>data<span class="token operator">:</span><span class="token operator">/</span><span class="token keyword">var</span><span class="token operator">/</span>lib<span class="token operator">/</span>postgresql<span class="token operator">/</span>data <span class="token literal-property property">networks</span><span class="token operator">:</span> <span class="token operator">-</span> backend <span class="token literal-property property">deploy</span><span class="token operator">:</span> <span class="token literal-property property">placement</span><span class="token operator">:</span> <span class="token literal-property property">constraints</span><span class="token operator">:</span> <span class="token punctuation">[</span>node<span class="token punctuation">.</span>role <span class="token operator">==</span> manager<span class="token punctuation">]</span> <span class="token literal-property property">vote</span><span class="token operator">:</span> <span class="token literal-property property">image</span><span class="token operator">:</span> dockersamples<span class="token operator">/</span>examplevotingapp_vote<span class="token operator">:</span>before <span class="token literal-property property">ports</span><span class="token operator">:</span> <span class="token operator">-</span> <span class="token number">5000</span><span class="token operator">:</span><span class="token number">80</span> <span class="token literal-property property">networks</span><span class="token operator">:</span> <span class="token operator">-</span> frontend <span class="token literal-property property">depends_on</span><span class="token operator">:</span> <span class="token operator">-</span> redis <span class="token literal-property property">deploy</span><span class="token operator">:</span> <span class="token literal-property property">replicas</span><span class="token operator">:</span> <span class="token number">2</span> <span class="token literal-property property">update_config</span><span class="token operator">:</span> <span class="token literal-property property">parallelism</span><span class="token operator">:</span> <span class="token number">2</span> <span class="token literal-property property">restart_policy</span><span class="token operator">:</span> <span class="token literal-property property">condition</span><span class="token operator">:</span> on<span class="token operator">-</span>failure <span class="token literal-property property">result</span><span class="token operator">:</span> <span class="token literal-property property">image</span><span class="token operator">:</span> dockersamples<span class="token operator">/</span>examplevotingapp_result<span class="token operator">:</span>before <span class="token literal-property property">ports</span><span class="token operator">:</span> <span class="token operator">-</span> <span class="token number">5001</span><span class="token operator">:</span><span class="token number">80</span> <span class="token literal-property property">networks</span><span class="token operator">:</span> <span class="token operator">-</span> backend <span class="token literal-property property">depends_on</span><span class="token operator">:</span> <span class="token operator">-</span> db <span class="token literal-property property">deploy</span><span class="token operator">:</span> <span class="token literal-property property">replicas</span><span class="token operator">:</span> <span class="token number">1</span> <span class="token literal-property property">update_config</span><span class="token operator">:</span> <span class="token literal-property property">parallelism</span><span class="token operator">:</span> <span class="token number">2</span> <span class="token literal-property property">delay</span><span class="token operator">:</span> 10s <span class="token literal-property property">restart_policy</span><span class="token operator">:</span> <span class="token literal-property property">condition</span><span class="token operator">:</span> on<span class="token operator">-</span>failure <span class="token literal-property property">worker</span><span class="token operator">:</span> <span class="token literal-property property">image</span><span class="token operator">:</span> dockersamples<span class="token operator">/</span>examplevotingapp_worker <span class="token literal-property property">networks</span><span class="token operator">:</span> <span class="token operator">-</span> frontend <span class="token operator">-</span> backend <span class="token literal-property property">deploy</span><span class="token operator">:</span> <span class="token literal-property property">mode</span><span class="token operator">:</span> replicated <span class="token literal-property property">replicas</span><span class="token operator">:</span> <span class="token number">1</span> <span class="token literal-property property">labels</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token constant">APP</span><span class="token operator">=</span><span class="token constant">VOTING</span><span class="token punctuation">]</span> <span class="token literal-property property">restart_policy</span><span class="token operator">:</span> <span class="token literal-property property">condition</span><span class="token operator">:</span> on<span class="token operator">-</span>failure <span class="token literal-property property">delay</span><span class="token operator">:</span> 10s <span class="token literal-property property">max_attempts</span><span class="token operator">:</span> <span class="token number">3</span> <span class="token literal-property property">window</span><span class="token operator">:</span> 120s <span class="token literal-property property">placement</span><span class="token operator">:</span> <span class="token literal-property property">constraints</span><span class="token operator">:</span> <span class="token punctuation">[</span>node<span class="token punctuation">.</span>role <span class="token operator">==</span> manager<span class="token punctuation">]</span> <span class="token literal-property property">visualizer</span><span class="token operator">:</span> <span class="token literal-property property">image</span><span class="token operator">:</span> dockersamples<span class="token operator">/</span>visualizer<span class="token operator">:</span>stable <span class="token literal-property property">ports</span><span class="token operator">:</span> <span class="token operator">-</span> <span class="token string">"8080:8080"</span> <span class="token literal-property property">stop_grace_period</span><span class="token operator">:</span> 1m30s <span class="token literal-property property">volumes</span><span class="token operator">:</span> <span class="token operator">-</span> <span class="token string">"/var/run/docker.sock:/var/run/docker.sock"</span> <span class="token literal-property property">deploy</span><span class="token operator">:</span> <span class="token literal-property property">placement</span><span class="token operator">:</span> <span class="token literal-property property">constraints</span><span class="token operator">:</span> <span class="token punctuation">[</span>node<span class="token punctuation">.</span>role <span class="token operator">==</span> manager<span class="token punctuation">]</span> <span class="token literal-property property">networks</span><span class="token operator">:</span> <span class="token literal-property property">frontend</span><span class="token operator">:</span> <span class="token literal-property property">backend</span><span class="token operator">:</span> <span class="token literal-property property">volumes</span><span class="token operator">:</span> db<span class="token operator">-</span>data<span class="token operator">:</span><span class="token literal-property property">version</span><span class="token operator">:</span> <span class="token string">"3"</span> <span class="token literal-property property">services</span><span class="token operator">:</span> <span class="token literal-property property">redis</span><span class="token operator">:</span> <span class="token literal-property property">image</span><span class="token operator">:</span> redis<span class="token operator">:</span>alpine <span class="token literal-property property">ports</span><span class="token operator">:</span> <span class="token operator">-</span> <span class="token string">"6379"</span> <span class="token literal-property property">networks</span><span class="token operator">:</span> <span class="token operator">-</span> frontend <span class="token literal-property property">deploy</span><span class="token operator">:</span> <span class="token literal-property property">replicas</span><span class="token operator">:</span> <span class="token number">2</span> <span class="token literal-property property">update_config</span><span class="token operator">:</span> <span class="token literal-property property">parallelism</span><span class="token operator">:</span> <span class="token number">2</span> <span class="token literal-property property">delay</span><span class="token operator">:</span> 10s <span class="token literal-property property">restart_policy</span><span class="token operator">:</span> <span class="token literal-property property">condition</span><span class="token operator">:</span> on<span class="token operator">-</span>failure <span class="token literal-property property">db</span><span class="token operator">:</span> <span class="token literal-property property">image</span><span class="token operator">:</span> postgres<span class="token operator">:</span><span class="token number">9.4</span> <span class="token literal-property property">volumes</span><span class="token operator">:</span> <span class="token operator">-</span> db<span class="token operator">-</span>data<span class="token operator">:</span><span class="token operator">/</span><span class="token keyword">var</span><span class="token operator">/</span>lib<span class="token operator">/</span>postgresql<span class="token operator">/</span>data <span class="token literal-property property">networks</span><span class="token operator">:</span> <span class="token operator">-</span> backend <span class="token literal-property property">deploy</span><span class="token operator">:</span> <span class="token literal-property property">placement</span><span class="token operator">:</span> <span class="token literal-property property">constraints</span><span class="token operator">:</span> <span class="token punctuation">[</span>node<span class="token punctuation">.</span>role <span class="token operator">==</span> manager<span class="token punctuation">]</span> <span class="token literal-property property">vote</span><span class="token operator">:</span> <span class="token literal-property property">image</span><span class="token operator">:</span> dockersamples<span class="token operator">/</span>examplevotingapp_vote<span class="token operator">:</span>before <span class="token literal-property property">ports</span><span class="token operator">:</span> <span class="token operator">-</span> <span class="token number">5000</span><span class="token operator">:</span><span class="token number">80</span> <span class="token literal-property property">networks</span><span class="token operator">:</span> <span class="token operator">-</span> frontend <span class="token literal-property property">depends_on</span><span class="token operator">:</span> <span class="token operator">-</span> redis <span class="token literal-property property">deploy</span><span class="token operator">:</span> <span class="token literal-property property">replicas</span><span class="token operator">:</span> <span class="token number">2</span> <span class="token literal-property property">update_config</span><span class="token operator">:</span> <span class="token literal-property property">parallelism</span><span class="token operator">:</span> <span class="token number">2</span> <span class="token literal-property property">restart_policy</span><span class="token operator">:</span> <span class="token literal-property property">condition</span><span class="token operator">:</span> on<span class="token operator">-</span>failure <span class="token literal-property property">result</span><span class="token operator">:</span> <span class="token literal-property property">image</span><span class="token operator">:</span> dockersamples<span class="token operator">/</span>examplevotingapp_result<span class="token operator">:</span>before <span class="token literal-property property">ports</span><span class="token operator">:</span> <span class="token operator">-</span> <span class="token number">5001</span><span class="token operator">:</span><span class="token number">80</span> <span class="token literal-property property">networks</span><span class="token operator">:</span> <span class="token operator">-</span> backend <span class="token literal-property property">depends_on</span><span class="token operator">:</span> <span class="token operator">-</span> db <span class="token literal-property property">deploy</span><span class="token operator">:</span> <span class="token literal-property property">replicas</span><span class="token operator">:</span> <span class="token number">1</span> <span class="token literal-property property">update_config</span><span class="token operator">:</span> <span class="token literal-property property">parallelism</span><span class="token operator">:</span> <span class="token number">2</span> <span class="token literal-property property">delay</span><span class="token operator">:</span> 10s <span class="token literal-property property">restart_policy</span><span class="token operator">:</span> <span class="token literal-property property">condition</span><span class="token operator">:</span> on<span class="token operator">-</span>failure <span class="token literal-property property">worker</span><span class="token operator">:</span> <span class="token literal-property property">image</span><span class="token operator">:</span> dockersamples<span class="token operator">/</span>examplevotingapp_worker <span class="token literal-property property">networks</span><span class="token operator">:</span> <span class="token operator">-</span> frontend <span class="token operator">-</span> backend <span class="token literal-property property">deploy</span><span class="token operator">:</span> <span class="token literal-property property">mode</span><span class="token operator">:</span> replicated <span class="token literal-property property">replicas</span><span class="token operator">:</span> <span class="token number">1</span> <span class="token literal-property property">labels</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token constant">APP</span><span class="token operator">=</span><span class="token constant">VOTING</span><span class="token punctuation">]</span> <span class="token literal-property property">restart_policy</span><span class="token operator">:</span> <span class="token literal-property property">condition</span><span class="token operator">:</span> on<span class="token operator">-</span>failure <span class="token literal-property property">delay</span><span class="token operator">:</span> 10s <span class="token literal-property property">max_attempts</span><span class="token operator">:</span> <span class="token number">3</span> <span class="token literal-property property">window</span><span class="token operator">:</span> 120s <span class="token literal-property property">placement</span><span class="token operator">:</span> <span class="token literal-property property">constraints</span><span class="token operator">:</span> <span class="token punctuation">[</span>node<span class="token punctuation">.</span>role <span class="token operator">==</span> manager<span class="token punctuation">]</span> <span class="token literal-property property">visualizer</span><span class="token operator">:</span> <span class="token literal-property property">image</span><span class="token operator">:</span> dockersamples<span class="token operator">/</span>visualizer<span class="token operator">:</span>stable <span class="token literal-property property">ports</span><span class="token operator">:</span> <span class="token operator">-</span> <span class="token string">"8080:8080"</span> <span class="token literal-property property">stop_grace_period</span><span class="token operator">:</span> 1m30s <span class="token literal-property property">volumes</span><span class="token operator">:</span> <span class="token operator">-</span> <span class="token string">"/var/run/docker.sock:/var/run/docker.sock"</span> <span class="token literal-property property">deploy</span><span class="token operator">:</span> <span class="token literal-property property">placement</span><span class="token operator">:</span> <span class="token literal-property property">constraints</span><span class="token operator">:</span> <span class="token punctuation">[</span>node<span class="token punctuation">.</span>role <span class="token operator">==</span> manager<span class="token punctuation">]</span> <span class="token literal-property property">networks</span><span class="token operator">:</span> <span class="token literal-property property">frontend</span><span class="token operator">:</span> <span class="token literal-property property">backend</span><span class="token operator">:</span> <span class="token literal-property property">volumes</span><span class="token operator">:</span> db<span class="token operator">-</span>data<span class="token operator">:</span>version: "3" services: redis: image: redis:alpine ports: - "6379" networks: - frontend deploy: replicas: 2 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure db: image: postgres:9.4 volumes: - db-data:/var/lib/postgresql/data networks: - backend deploy: placement: constraints: [node.role == manager] vote: image: dockersamples/examplevotingapp_vote:before ports: - 5000:80 networks: - frontend depends_on: - redis deploy: replicas: 2 update_config: parallelism: 2 restart_policy: condition: on-failure result: image: dockersamples/examplevotingapp_result:before ports: - 5001:80 networks: - backend depends_on: - db deploy: replicas: 1 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure worker: image: dockersamples/examplevotingapp_worker networks: - frontend - backend deploy: mode: replicated replicas: 1 labels: [APP=VOTING] restart_policy: condition: on-failure delay: 10s max_attempts: 3 window: 120s placement: constraints: [node.role == manager] visualizer: image: dockersamples/visualizer:stable ports: - "8080:8080" stop_grace_period: 1m30s volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: placement: constraints: [node.role == manager] networks: frontend: backend: volumes: db-data:
可以看到,在docker-compose.yml文件中我们可以在services目录下定义多个容器服务,当启动我们的docker-compose时,services下的服务会依次启动。
docker<span class="token operator">-</span>compose <span class="token operator">-</span>f docker<span class="token operator">-</span>compose<span class="token punctuation">.</span>yaml up <span class="token operator">-</span>ddocker<span class="token operator">-</span>compose <span class="token operator">-</span>f docker<span class="token operator">-</span>compose<span class="token punctuation">.</span>yaml up <span class="token operator">-</span>ddocker-compose -f docker-compose.yaml up -d
六、docker-compose.yml文件配置常用字段及说明
七、Docker-compose常用命令
运行这些命令需要结合docker-compose一起使用。
且必须要在含有docker-compose.yml文件的目录中才可以使用,不然报错。
原文链接:https://blog.csdn.net/m0_37899908/article/details/131268835?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171836840916800185858249%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=171836840916800185858249&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-20-131268835-null-null.nonecase&utm_term=docker%E3%80%81%E5%A5%BD%E7%94%A8