前面我们通过单个容器进行管理,可以实现系统的部署,但是如果系统依赖的东西比较多时,在一个新的机器中,我们又需要将这些容器部署起来,你也许会说我们可以通过shell脚本来实现,但docker提供了更快、更简便的方式:docker compose,通俗点说就是组合多个容器并进行管理,类似maven jar管理。
docker compose的核心是docker-compose.yml文件,通过该文件来管理service,为了使用compose
1、我们需要执行
docker swarm init
初始化一个swarm管理器
2、编写docker-compose.yml文件
version: "3"
services:
mysql:
image: mysql
restart: always
volumes:
- ./mysql/data/:/var/lib/mysql/
- ./mysql/conf/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=123456
command: --default-authentication-plugin=mysql_native_password
gs_om_ms:
restart: always
image: gs-om-ms-compose:1.0
volumes:
- ./logs/:/data/log/om/omms/
ports:
- 8988:8988
links:
- mysql:m1
因为我们已经有了mysql、gs-om-ms-compose:1.0这两个镜像,所以这里通过image的方式进行引入,还可以通过build的方式(构建指定路径下的Dockerfile文件)
下面简单讲解下docker-compose.yml的含义
version: 版本号,固定为3就行,版本3支持docker stack,版本2不支持docker stack,版本2和3的都支持docker compose,这样说明docker stack是后续的主流
services: 服务列表
mysql: 定义一个服务名称为mysql的服务,具体服务名会加上指定的前缀
image: 指定服务使用的镜像,如果镜像在本地不存在,Compose 将会尝试拉取这个镜像
restart: 重启方式
volumes: 挂载一个目录或者一个已存在的数据卷容器,这很有必要,如果不这样,当容器停止或移除后数据就找不回来了
- ./mysql/data/:/var/lib/mysql/ // 将当前目录下的mysql/data挂载到/var/lib/mysql
- ./mysql/conf/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf // 将当前目录下的mysql/conf/mysqld.cnf挂载到/etc/mysql/mysql.conf.d/mysqld.cnf
ports: 映射端口的标签。使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端口。
- "3306:3306" 宿主3306映射到容器端口3306
environment: 容器变量
- MYSQL_ROOT_PASSWORD=123456 // 设置mysql root用户密码为123456
command: --default-authentication-plugin=mysql_native_password // 执行命令,这里使用的mysql版本为8.0.15,所以执行授权的插件
links: 连接其它服务中的容器
- mysql:m1 // 连接数据库服务中的容器,因为系统需要连接数据库
除了上述使用的一些关键字外:还有一些也比较常用,例如
depends_on 依赖的容器,解决容器启动顺序问题
build:指定路径,使用指定路径下的Dockerfile文件构建服务
3、部署应用
docker stack deploy -c docker-compose.yml 应用名称(也是服务前缀)
注:这里使用docker stack deploy实现了类似docker-compose的功能,但两者还是有所不同的。
Docker stack会忽略了“构建”指令。 您无法使用stack命令构建新镜像。 它是需要镜像是预先已经构建好的。 所以docker-compose更适合于开发场景。
查看服务
docker service ls
这里的应用名称为gs-compose,可以看到已经有了两个服务了
同时可以看到有两个容器已经在运行了
访问系统,可以正常访问,说明系统已经部署好了
4、其它命令
(1)删除应用(正在运行的容器也会删除掉)
docker stack rm 应用名称
(2)进入容器内部并执行命令
docker exec -it 容器名称 命令
例docker exec -it gs-compose_mysql.1.c0diy1ycaixyu81x7x6avnc2j bash
进入mysql容器中并执行bash命令
(3)查询指定父镜像ID的子镜像
docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=父镜像ID)
(4)docker-compose运行命令
docker-compose -f docker-compose.yml -p gs-compose up -d
-d 表示在后台运行,其它命令使用docker-compose --help
注:连接mysql需要以ip地址的形式进行连接,否则会出现errorCode 0, state 08S01
除了依赖已有的镜像,我们还可以通过build选项构建镜像,例jdk的构建,后台管理系统的构建
version: "3"
services:
jdk:
build: ./jdk
mysql:
image: mysql
restart: always
volumes:
- ./mysql/data/:/var/lib/mysql/
- ./mysql/conf/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=nDLkMs7giw11~
command: --default-authentication-plugin=mysql_native_password
gs_om_ms:
restart: always
build: .
volumes:
- ./logs/:/data/log/om/omms/
ports:
- 8988:8988
depends_on:
- jdk
links:
- mysql:m1
目录结构:
jdk目录下也有一个Dockerfile文件
gs_om_ms的Dockerfile内容如下:
FROM gs-compose_jdk
MAINTAINER youpanpan "youpp@gswlgf.com"
ADD gs-om-ms.jar gs-om-ms.jar
EXPOSE 8988
ENTRYPOINT java -jar gs-om-ms.jar --spring.profiles.active=test
这里依赖的是gs-compose_jdk,即通过docker-compose构建的镜像,不过最好还是先将jdk构建出来,后台系统镜像基于jdk镜像进行构建
构建出了两个镜像:
本人开发的一个网站:编程之道,欢迎来踩!!!