一、Docker Compose
1、前言
我们知道使⽤⼀个 Dockerfile 模板⽂件,可以让⽤户很⽅便的定义⼀个单独的应⽤容器。然⽽,在⽇常⼯作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。
例如要实现⼀个 Web 项⽬,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚⾄还包括负载均衡容器等,我们只能一个一个`写dockerfile文件,然后bulid构建,run手动操作单个容器`
Compose 恰好满⾜了这样的需求。它允许⽤户通过⼀个单独的 docker-compose.yml 模板⽂件(YAML 格式)
来定义⼀组相关联的应⽤容器为⼀个项⽬(project).
微服务。 100个微服务!依赖关系。
# Compose 项⽬是 Docker 官⽅的开源项⽬,负责实现对 Docker 容器集群的快速编排。
2、官方介绍
Docker Compose来轻松高效的管理容器,定义运行多个容器。
1、Compose 中有两个重要的概念
# 1、服务 ( service ):
⼀个应⽤的容器,实际上可以包括若⼲运⾏相同镜像的容器实例(web、redis、mysql ...)。
# 2、项⽬ ( project ):
由⼀组关联的应⽤容器组成的⼀个完整业务单元,在 docker-compose.yml ⽂件中定义(博客、web、mysql)。
# 启动docker-compose up 可以启动多个服务
2、三步骤
1、Dockerfile 保证我们的项目可以在任何地方运行。
2、定义组成您的应用程序的服务,docker-compose.yml 以便它们可以在隔离的环境中一起运行。
# services 什么是服务
# docker-compose.ym 这个文件如何写
3、运行docker compose up和码头工人组成命令启动并运行你的整个应用程序。
也可以docker-compose up使用 docker-compose 二进制文件运行。 # 启动项目
3、Compose是Docker官方的开源项目,需要安装!
dockerfile # 让程序在任何地方运行。 web服务、redis、mysql、nginx ... d 多个服务 启动
4、Compose:重要的概念
1、YAML file配置文件。
2、single command。 命令有哪里
3、Compose 适用于所有环境:生产、登台、开发、测试以及 CI 工作流。
4、Compose 的默认管理对象是项⽬,通过⼦命令对项⽬中的⼀组容器进⾏便捷地⽣命周期管理。
5、Compose 项⽬由 Python 编写,实现上调⽤了 Docker 服务提供的 API 来对容器进⾏管理。因此,只要所操作的平
台⽀持 Docker API,就可以在其上利⽤ Compose 来进⾏编排管理。
# Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。
二、docker compose 安装
# 官网安装: https://docs.docker.com/compose/install/
1、下载
方式一:
# 1、官网安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
方式二:
# 2、国内
curl -L "https://get.daocloud.io/docker/compose/releases/download/1.25.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@docter bin]# ll
total 12440
-rw-r--r-- 1 root root 12737304 Jul 14 20:19 docker-compose
2、bash命令补全
curl -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
3、卸载(没有安装不需要执行)
如果是⼆进制包⽅式安装的,删除⼆进制⽂件即可。
sudo rm /usr/local/bin/docker-compose
4、授权
[root@docter bin]# sudo chmod +x /usr/local/bin/docker-compose
5、检测版本
[root@docter bin]# docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
三、docker compose使⽤
1、相关概念
# 1、服务 ( service ):
⼀个应⽤容器,实际上可以运⾏多个相同镜像的实例。
# 2、项⽬ ( project ):
由⼀组关联的应⽤容器组成的⼀个完整业务单元。∂⼀个项⽬可以由多个服务(容器)关联⽽成, Compose ⾯向项⽬进⾏管理。
2、场景
最常⻅的项⽬是 web ⽹站,该项⽬应该包含 web 应⽤和缓存。
1、Django应⽤
2、mysql服务
3、redis服务
4、elasticsearch服务
.......
3.docker-compose模板
# 1、编写docker-cmpsoe文件
[root@docter docker-compose]#vim docker-compose.yaml
version: "3.0"
services:
mysqldb:
image: mysql:5.7.19
container_name: mysql
ports:
- "3306:3306"
volumes:
- /root/mysql/conf:/etc/mysql/conf.d
- /root/mysql/logs:/logs
- /root/mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
networks:
- ems
depends_on:
- redis
redis:
image: redis:4.0.14
container_name: redis
ports:
- "6379:6379"
networks:
- ems
volumes:
- /root/redis/data:/data
command: redis-server
networks:
ems:
# 2、启动docker-compose
[root@docter docker-compose]# docker-compose up -d
Creating network "docker-compose_ems" with the default driver
Creating redis ... done
Creating mysql ... done
# 3、查看容器
方式一:
[root@docter docker-compose]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
15d11b1c45de mysql:5.7.19 "docker-entrypoint.s…" 24 seconds ago Up 24 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp mysql
5bf22e44ff81 redis:4.0.14 "docker-entrypoint.s…" 24 seconds ago Up 24 seconds 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis
方式二:# (推荐)docker-compose.yaml 必须在当前目录
[root@docter docker-compose]# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------
mysql docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp,:::3306->3306/tcp
redis docker-entrypoint.sh redis ... Up 0.0.0.0:6379->6379/tcp,:::6379->6379/tcp
4、启动
[root@docter ~]# docker-compose up //前台启动⼀组服务
[root@docter ~]# docker-compose up -d //守护进程启动⼀组服务
5、docker-compose 模板⽂件
1、模板⽂件是使⽤ Compose 的核⼼
2、默认的模板⽂件名称为 docker-compose.yml ,格式为 YAML 格式。
version: "3"
services:
webapp:
image: examples/web
ports:
- "80:80"
volumes:
- "/data"
1、build
⾃动构建这个镜像
格式:
build: ./dir
# 1、准备文件
[root@docter jave]# ll
total 4
-rw-r--r-- 1 root root 62 Jul 30 20:35 docker-compose.yaml
drwxr-xr-x 5 root root 122 Jul 30 19:15 springboot-master
# 2、编写docker-compose.yaml文件
[root@docter jave]# vim docker-compose.yaml
version: '3'
services:
jave:
build: ./springboot-master
ports:
- "8080:8080"
# 3、启动docker-compose
[root@docter jave]# docker-compose up -d
Creating network "jave_default" with the default driver
Creating jave_jave_1 ... done
# 4、查看docker-compose是否启动
方式一: 推荐 #docker-compose必须在当前目录,否则启动不了
[root@docter jave]# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------
jave_jave_1 /bin/sh -c java -jar GitLa ... Up 0.0.0.0:8080->8080/tcp,:::8080->8080/tcp
方式二:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fa6682dbba66 jave_jave "/bin/sh -c 'java -j…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp jave_jave_1
2、command
覆盖容器启动后默认执⾏的命令
格式:
command: echo "hello world"
# 1、编写docker-compose.yaml文件
[root@docter jave]# cat docker-compose.yaml
version: '3'
services:
jave:
build: ./springboot-master
command: echo "hello world"
ports:
- "8080:8080"
# 2、启动docker-compose
[root@docter jave]# docker-compose up -d
Recreating jave_jave_1 ... done
# 3、查看容器
[root@docter jave]# docker-compose ps
Name Command State Ports
-----------------------------------------------
jave_jave_1 echo hello world Exit 0 #显示 hello world
3、container_name
指定容器名称,默认将会使⽤ 项⽬名称_服务名称_序号 这样的格式
格式:
container_name: docker-web-jave
# 1、编写docker-compose.yaml文件
[root@docter jave]# vim docker-compose.yaml
version: '3'
services:
jave:
build: ./springboot-master
container_name: docker-web-jave
# 2、启动docker-compose
[root@docter jave]# docker-compose up -d
Creating network "jave_default" with the default driver
Creating docker-web-jave ... done
# 3、查看docker-compose
[root@docter jave]# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------
docker-web-jave /bin/sh -c java -jar GitLa ... Up 8080/tcp # 显示名称docker-web-jave
# 注意: 指定容器名称后,该服务将⽆法进⾏扩展(scale),因为 Docker 不允许多个容器具有相同的名称。
5、depends_on
解决容器的依赖、启动先后的问题
格式:
depends_on:
- php
- nginx
php:
image: php
nginx:
image: nginx
# 1、准备文件
[root@docter lnmp]# ll
total 4
-rw-r--r-- 1 root root 138 Jul 30 21:08 docker-compose.yaml
drwxr-xr-x 2 root root 80 Jul 30 20:04 nginx
drwxr-xr-x 2 root root