在实际开发中,Docker 已经成为了不可或缺的工具之一。而 Dockerfile 和 Docker Compose 的结合使用,则更是提高了容器化部署的效率和便利性。本文将介绍如何结合使用 Dockerfile 和 Docker Compose,并分享一些实践和注意事项。
1. 修改项目指向的地址
在容器化部署中,我们不能再使用 localhost
了,因为 Docker 会为每一个容器动态分配一个随机的 IP 地址。例如,当访问 nacos:8999
时,实际上是访问了 Docker 网络中对应 nacos
容器的地址。你可以通过以下命令查看当前 Docker 网络:
docker network ls
2. 将项目打包为 app.jar
为了与后续的 Dockerfile 对应,我们需要将项目打包为 app.jar
。在 Maven 的 pom.xml
中,配置 finalName
为 app.jar
:
<build>
<finalName>app</finalName>
</build>
3. 编写 Dockerfile 文件
编写 Dockerfile 主要包括以下步骤:
- 使用合适的基础镜像,例如
openjdk:8-jre-alpine
,它是一个轻量级的包含了 Java 8 运行时环境的 Alpine Linux 镜像。 - 将本地的
app.jar
文件复制到 Docker 镜像中。 - 定义容器启动时执行的命令,通常是通过
java -jar
运行app.jar
。
以下是一个示例 Dockerfile:
FROM openjdk:8-jre-alpine
COPY ./app.jar /tmp/app.jar
ENTRYPOINT java -jar /tmp/app.jar
4. 编写 Docker Compose 文件
实现思路:
-
使用maven打包工具,将项目中的每个微服务都打包为app.jar
-
将打包好的app.jar拷贝到cloud-demo中的每一个对应的子目录中
-
将cloud-demo上传至虚拟机,利用 docker-compose up -d 来部署
目录结构
mysql中的目录结构对应着后续在宿主机中的虚拟卷位置
Docker Compose 可以帮助我们定义和管理多个 Docker 容器的部署。以下是一个简单的 Docker Compose 文件示例,用于部署 Nacos、MySQL、用户服务、订单服务和网关服务:
version: "3.2"
services:
nacos:
image: nacos/nacos-server
environment:
MODE: standalone
ports:
- "8848:8848"
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "$PWD/mysql/data:/var/lib/mysql"
- "$PWD/mysql/conf:/etc/mysql/conf.d/"
userservice:
build: ./user-service
orderservice:
build: ./order-service
gateway:
build: ./gateway
ports:
- "10010:10010"
在这个 Docker Compose 文件中,我们定义了 Nacos、MySQL、用户服务、订单服务和网关服务的容器配置。其中,build
指定了需要构建镜像的目录,volumes
指定了挂载的数据卷路径。
最后将cloud-demo上传至虚拟机,利用 docker-compose up -d 来部署