docker-compose
官网地址
https://docs.docker.com/compose/compose-file/
概述
docker-compose(docker容器编排技术)
在实际生产环境中,一个应用往往由许多服务构成,而 docker 的最佳实践是一个容器只运行一个进程,因此运行多个微服务就要运行多个容器。多个容器协同工作需要一个有效的工具来管理他们,定义这些容器如何相互关联。compose 应运而生。
compose 是用来定义和运行一个或多个容器(通常都是多个)运行和应用的工具。使用 compose 可以简化容器镜像的构建以及容器的运行。
compose 使用 YAML 文件来定义多容器之间的关系。一个 docker-compose up 就可以把完整的应用跑起来。 本质上, compose 把 YAML 文件解析成 docker 命令的参数,然后调用相应的 docker 命令行接口,从而将应用以容器化的方式管理起来。它通过解析容器间的依赖关系顺序地启动容器。而容器间的依赖关系由 YAML 文件中的 links 标记指定。
什么是docker-compose?
compose、machine 和 swarm 是docker 原生提供的三大编排工具。简称docker三剑客.
Docker Compose能够在docker节点上,以单引擎模式(single-Engine Mode) 进行多容器应用的部署和管理。多数的现代应用通过多个更小的微服务相互协同来组成一个完整可用的应用。比如一个简单的实例可能由如下四个微服务组成。
- web前端
- 订单管理
- 品类管理
- 后台数据库
将以上服务组织在一起就是一个可用的服务。
部署和管理繁多的服务是困难的。而这正是 Docker Compose 要解决的问题。Docker Compose 并不是通过脚本和各种冗长的 docker 命令来将应用组件组织起来,而是通过一个声明式的配置文件描述整个应用,从而使用一条命令完成部署。应用部署成功后,还可以通过一系列简单的命令实现对其完整声明周期的管理。甚至,配置文件还可以置于版本控制系统中进行存储和管理。
背景
Docker Compose 的前身是 Fig。Fig 是一个由 Orchard 公司开发的强有力的工具,在当时是进行多容器管理的最佳方案。
Fig 是一个基于 Docker 的 Python工具,允许用户基于一个 YAML 文件定义多容器应用,从而可以使用fig 命令行工具进行应用的部署。
Fig 还可以对应用的全生命周期进行管理。内部实现上,Fig 会解析 YAML 文件,并通过 Docker API 进行应用的部署和管理。
在 2014 年,Docker 公司收购了 Orchard 公司,并将 Fig 更名为 Docker Compose。命令行工具也从 fig 更名为 docker-compose,并自此成为绑定在 Docker 引擎之上的外部工具。
虽然它从未完全集成到 Docker 引擎中,但是仍然受到广泛关注并得到普遍使用。
直至今日,Docker Compose 仍然是一个需要在 Docker 主机上进行安装的外部 Python 工具。
使用它时,首先编写定义多容器(多服务)应用的 YAML 文件,然后将其交由 docker-compose 命令处理,Docker Compose 就会基于 Docker 引擎 API 完成应用的部署。
官网地址
https://docs.docker.com/compose/reference/build/
docker compose安装
下载
https://github.com/docker/compose
下载最新版本:1.27.4
授权
mv /data/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
#开发环境可以授予最高权限
chmod 777 /usr/local/bin/docker-compose
检查安装情况及版本
docker-compose -v
docker-compose --version
docker-compose version
卸载docker-compose
docker compose 卸载只需要删除二进制文件就可以了
rm -rf /usr/local/bin/docker-compose
reboot
yml配置文件及常用命令
Docker Compose 使用 YAML 文件来定义多服务的应用。YAML 是 JSON 的一个子集,因此也可以使用JSON。
Docker Compose 默认使用文件名 docker-compose.yml。当然,也可以使用 -f 参数指定具体文件。
Docker Compose 的 YAML 文件包含 4 个一级 key:version、services、networks、volumes
- version 是必须指定的,而且总是位于文件的第一行。它定义了 Compose 文件格式(主要是API)的版本。注意,version 并非定义 Docker Compose 或 Docker 引擎的版本号。
- services 用于定义不同的应用服务。上边的例子定义了两个服务:一个名为 lagou-mysql数据库服务以及一个名为lagou-eureka的微服。Docker Compose 会将每个服务部署在各自的容器中。
- networks 用于指引 Docker 创建新的网络。默认情况下,Docker Compose 会创建 bridge 网络。这是一种单主机网络,只能够实现同一主机上容器的连接。当然,也可以使用 driver 属性来指定不同的网络类型。
- volumes 用于指引 Docker 来创建新的卷。
version: '3'
services:
lagou-mysql:
build:
context: ./mysql
environment:
MYSQL_ROOT_PASSWORD: admin
restart: always
container_name: lagou-mysql
volumes:
- /data/edu-bom/mysql/lagou:/var/lib/mysql
image: lagou/mysql:5.7
ports:
- 3306:3306
networks:
lagou-net:
lagou-eureka:
build:
context: ./edu-eureka-boot
restart: always
ports:
- 8761:8761
container_name: edu-eureka-boot
hostname: edu-eureka-boot
image: lagou/edu-eureka-boot:1.0
depends_on:
- lagou-mysql
networks:
lagou-net:
networks:
lagou-net:
volumes:
lagou-vol:
反向代理案例
#拉取基础镜像
docker pull nginx:1.19.3-alpine
docker pull tomcat:9.0.20-jre8-alpine
#试运行镜像
docker run -itd --name nginx -p 80:80 nginx:1.19.3-alpine
docker run -itd --name tomcat -p 8080:8080 tomcat:9.0.20-jre8-alpine
#在本地创建两个文件夹
mkdir -p /data/tomcat1 tomcat2
#将容器中的数据拷贝到本地
docker cp nginx:/etc/nginx/ /data
docker cp tomcat:/usr/local/tomcat/webapps/ /data/tomcat1/webapps
docker cp tomcat:/usr/local/tomcat/webapps/ /data/tomcat2/webapps
#向两个文件中添加数据
echo "tomcat1" > /data/tomcat1/webapps/ROOT/index.jsp
echo "tomcat2" > /data/tomcat2/webapps/ROOT/index.jsp
#移除俩个镜像
docker rm -f nginx tomcat
反向代理配置
mkdir /data/nginx/vhost
cd /data/nginx/vhost
vi myNginx.conf
#把下边的内容添加到myNginx.conf中
upstream myNginxurl{
server 192.168.198.100:8081;
server 192.168.198.100:8082;
}
server{
listen 80;
server_name 192.168.198.100;
autoindex on;
index index.html index.htm index.jsp;
location / {
proxy_pass http://myNginxurl;
add_header Access-Control-Allow-Origin *;
}
}
#修改nginx.conf文件,把myNginx.conf文件引入到nginx.conf文件中
vi nginx.conf
#把下边命令加入到nginx.conf文件中(加到http{}下)
include vhost/*.conf;
编写docker-compose文档
version: '3'
services:
lagou-nginx:
restart: always
container_name: lagou-nginx
volumes:
- /data/nginx:/etc/nginx/
image: nginx:1.19.3-alpine
ports:
- 80:80
lagou-tomcat1:
restart: always
container_name: lagou-tomcat1
volumes:
- /data/tomcat1/webapps:/usr/local/tomcat/webapps
image: tomcat:9.0.20-jre8-alpine
ports:
- 8081:8080
depends_on:
- lagou-nginx
lagou-tomcat2:
restart: always
container_name: lagou-tomcat2
volumes:
- /data/tomcat2/webapps:/usr/local/tomcat/webapps
image: tomcat:9.0.20-jre8-alpine
ports:
- 8082:8080
depends_on:
- lagou-nginx
启动服务
docker-compose up
docker-compose up -d
访问地址测试
tomcat1: http:/192.168.198.100:8081
tomcat2: http:/192.168.198.100:8082
nginx地址: http:/192.168.198.100:80
常用命令汇总
#启动服务
docker-compose up -d
#停止服务
docker-compose down
#列出所有容器
docker-compose ps
#查看服务日志
docker-compose logs
#构建或者重新构建服务
docker-compose build
#启动服务
docker-compose start
#停止服务
docker-compose stop
#重启服务
docker-compose restart