1、安装docker-compose
- 通过联网机器下载docker-compose离线安装包(参见Downloads部分) https://github.com/docker/compose/releases
- 将下载的文件上传到待安装服务器(推荐工具:FileZilla)
- 重命名 sudo mv <download_filename> docker-compose
- 更改文件目录 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/
2、卸载docker-compose
如果是二进制包方式安装的,删除二进制文件即可。 rm /usr/local/bin/docker-compose
3、已经有镜像,使用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服务已注册。
4、无镜像,使用docker-compose创建镜像并启动
(1)每个微服务的pom中加入打包插件(跟上一篇文章的一样):
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- tag::plugin[] -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>mambo/${project.artifactId}</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<!-- end::plugin[] -->
</plugins>
</build>
(3)在最外层的pom中加入以下编译插件即可在一键执行所有模块的打包插件,使用mvn clean package -DskipTests 命令打jar包(忽略测试代码),这样所有服务的jar包都生成了:
<!--
指定maven插件编译版本
1:maven:since2.0, 默认用jdk1.3来编译,maven 3.x
貌似是默认用jdk 1.5。
2:windows默认使用GBK编码,java项目经常编码为utf8,
也需要在compiler插件中指出,否则中文乱码可能会出现编译错误。
-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF8</encoding>
</configuration>
</plugin>
(4)将打包好的.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
(5)编写用于构建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
(6)执行命令
docker-compose -f docker-compose.yml up
(7)镜像会自动创建并启动容器,页面可以访问各个应用
5、athena-mysql-server镜像的构建:
(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
shell脚本如下:
mysql -uroot -p$MYSQL_ROOT_PASSWORD << EOF
source $WORK_PATH/$FILE_1;
source $WORK_PATH/$FILE_2;
(3)然后就可以使用上面的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