使用现有的docker进行部署存在问题
我们之前在Docker容器中安装了nginx、mysql、es、redis等等一些容器,然后每次我需要先启动redis、mysql、es、nginx之后才能启动我们的项目,因为容器之间可能存在某种依赖,需要按一定的顺序启动,比如Kibana容器依赖于es容器,es容器需要先启动。当容器启动完毕我们才能运行起来项目。如果容器数量特别多的话启动更加麻烦。
假如需要将这些服务部署到另一个服务器,但是不知道到底用到了Docker里面具体的哪一些容器,没有办法只能把容器全部复制过去,没法对一个项目的容器进行管理。
Docker-Compose简介
Compose项目是Docker官方的开源项目。负责实现对Docker容器集群的快速编排,对多个容器进行编排,将一组相关联的容器放在一起,可以理解为它将你项目用到的所有容器按照你指定的启动顺序设置成一个文件,然后一次就可以启动。
与Dockerfile不同的是,Dockerfile模版文件是让用户定义一个单独运行的容器,而Compose是多个容器相互配合完成某一个任务的情况。比如要实现一个Web项目,里面除了Web容器本身之外还有数据库、负载均衡容器等等。
定义方式
允许用户通过一个单独的docker-compose.yml模版文件来定义一组相关联的应用容器为一个项目。
里面有两个重要概念:
- 项目:一组相关联的应用容器组成的一个完整的业务单元。可以理解为你项目中的多个容器组成了一个项目
- 服务:一个应用容器里面可以包含若干运行相同镜像的容器实例。可以理解项目中的每一个容器都称之为服务,多个容器就是多个服务,只是这里面的叫法名称变了而已。
只要操作平台支持Docker就可以用Compose来进行编排管理。
安装卸载
1、登入官方地址下载指定版本,官方地址为:https://github.com/docker/compose/releases
下载完之后上传到服务器的/usr/local/bin目录下
给它一个执行权限
sudo chmod +x /usr/local/bin/docker-compose
2、直接从服务器下载
curl -L https://github.com/docker/compose/releases/download/2.2.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
后续步骤同上
docker-compose -v #查看是否安装成功
案例
1、创建一个目录
mkdir ems
2、在ems目录创建一个docker-compose.yml 模版文件
3、编写docker-compose.yml
#docker-compose项目版本号 version: "3.8" services: centos01: #自定义的服务的名称 image: tomcat:latest #代表使用哪一个镜像 latest表示版本号 ports: #代表主机和容器中的端口映射 - 8082:8080
version:docker-compose和docker版本对应,先查看docker版本
docker版本20.10.+,所以对应docker-compose的3.8版本
4、启动docker-compose一组服务
docker-compose up
表示启动成功
5、还可以在里面继续增加容器redis,指定
#docker-compose项目版本号 version: "3.8" services: centos01: #自定义的服务的名称 image: tomcat:latest #代表使用哪一个镜像 ports: #代表主机和容器中的端口映射 - 8082:8080 redis01: image: redis:latest #指定了redis的镜像 ports: - 6379:6379
两个都启动成功
更多配置
environment:代表给当前容器启动指定环境,类似于docker run -e MYSQL_ROOT_PASSWORD=root
Volumes:代表给当前容器和主机指定数据卷,类似于 docker run -v 注意 这里数据卷的路径必须先创建
#docker-compose项目版本号 version: "3.8" services: centos01: #自定义的服务的名称 image: tomcat:latest #代表使用哪一个镜像 ports: #代表主机和容器中的端口映射 - 8082:8080 redis01: image: redis:latest ports: - 6379:6379 mysql01: image: mysql:latest ports: - 3306:3306 environment: - "MYSQL_ROOT_PASSWORD=root" volumes: - /root/mysqldata:/var/lib/mysql
启动之后服务运行状态
这里的Names是自动取的别名,可以在里面增加container_name给容器指定别名
以及mysql挂载的数据卷都有显示