Compose 是一个用户定义和运行多个容器的 Docker 应用程序。在 Compose 中你可以使用 YAML 文件来配置你的应用服务。然后,只需要一个简单的命令,就可以创建并启动你配置的所有服务。
使用 Compose 基本会有如下三步流程:
在 Dockfile 中定义你的应用环境,使其可以在任何地方复制。
在 docker-compose.yml 中定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行。
最后,运行dcoker-compose up
,Compose 将启动并运行整个应用程序。
下面来实战一下spring cloud基于docker-compose创建镜像
通过联网机器下载docker-compose离线安装包(参见Downloads部分) https://github.com/docker/compose/releases
将下载的文件上传到待安装服务器(推荐工具:FileZilla)
重命名 sudo mv
更改文件目录 sudo mv docker-compose /usr/local/bin/docker-compose
修改文件用户名用户组 (或修改访问权限)cd /usr/local/bin/ chmod 755 docker-compose
验证是否安装成功 docker-compose --version
安装成功 docker-compose version 1.12.0, build b31ff33
docker compose在线安装参见 https://docs.docker.com/compose/install/
如果是二进制包方式安装的,删除二进制文件即可。 rm /usr/local/bin/docker-compose
编写docker-compose.yml配置文件:
version: '3'
services:
athena-eureka:
image: athena/athena-eureka
restart: always
ports:
- 8761:8761
athena-gateway:
image: athena/athena-gateway
restart: always
ports:
- 8765:8765
在docker-compose.yml所在目录下,执行命令:docker-compose up -d 创建并后台执行服务。
这样,eureka服务和gateway服务就启动了,在页面上可以访问注册中心,而且可以看到gateway服务已注册。
(1)pom中加入打包插件(跟上一篇文章的一样):
(2)先使用mvn clean package -DskipTests 命令打jar包(忽略测试代码),可以写个sh脚本实现一键打包
(3)将打包好的.jar文件和每个对应模块的Dockerfile整理好,整理好的目录结构如下:
athena_package
├── docker-compose.yml
├── athena-eureka
│ athena-eureka-1.0.jar
| Dockerfile
├── athena-gateway
│ athena-gateway-1.0.jar
| Dockerfile
├── athena-keystone
│ athena-keystone-1.0.jar
| Dockerfile
├── athena-webapp
│ athena-webapp-1.0.jar
| Dockerfile
|----- athena-mysql-server
| | Dockerfile
| |----mysql
init_table.sql
init_data.sql
install_db.sh
(4)编写用于构建docker image的docker-compose.yml配置文件:
version: '3'
services:
athena-eureka:
build: athena-eureka
ports:
- 8761:8761
athena-gateway:
build: athena-gateway
ports:
- 8765:8765
athena-mysql-server:
build: athena-mysql-server
ports:
- 3308:3306
athena-keystone:
build: athena-keystone
ports:
- 8881:8881
athena-webapp:
build: athena-webapp
ports:
- 8883:8883
(5)执行命令
docker-compose -f docker-compose.yml up
(6)镜像会自动创建并启动容器,页面可以访问各个应用
(1)下载mysql官方数据库镜像。
我们需要使用官方镜像融合数据库初始化脚本来制作新的数据库镜像,本文使用mysql:5.7版本的镜像。
(2)编写Dockerfile
mysql官方镜像可以支持在容器启动时自动遍历docker-entrypoint-initdb.d目录下所有的.sh和.sql后缀的文件并执行。但是执行是没有顺序的,不太符合我们的要求。解决方法就是编写一个shell脚本,脚本中定义sql文件执行的顺序。
#依赖的基础镜像
FROM mysql:5.7
#定义工作目录
ENV WORK_PATH /usr/local/work
#定义会被容器自动执行的目录
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d
#定义sql文件名
ENV FILE_1 init_table.sql
ENV FILE_2 init_data.sql
#定义shell文件名
ENV INSTALL_DB_SHELL install_db.sh
#创建文件夹
RUN mkdir -p $WORK_PATH
#把数据库初始化数据的文件复制到工作目录下
COPY .mysql/$FILE_1 $WORK_PATH/
COPY .mysql/$FILE_2 $WORK_PATH/
#把要执行的shell文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个shell
COPY ./$INSTALL_DB_SHELL $AUTO_RUN_DIR/
#给执行文件增加可执行权限
RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DB_SHELL
(3)shell脚本如下:
mysql -uroot -p$MYSQL_ROOT_PASSWORD << EOF
source $WORK_PATH/$FILE_1;
source $WORK_PATH/$FILE_2;
(4)然后就可以使用上面的docker-compose命令来构建镜像、启动容器了,当然也可以使用docker命令:
构建镜像:
docker build -t athena-mysql-server .
运行容器:
docker run --name mysql -p 3308:3306 -e MYSQL_ROOT_PASSWORD=1q2w3e -d athena-mysql-server