Docker 部署 Nacos 注册中心
首先需要部署 Nacos 注册中心,在开发环境中运行 Nacos 单机模式,执行以下 Docker 命令拉取镜像并运行容器:
docker run -d \
--name nacos-server \
-p 8848:8848 \
-p 9848:9848 \
-e MODE=standalone \
nacos/nacos-server:2.0.2
需要注意的是,若在开发环境中使用模拟域名(配置在 /etc/hosts 中)访问 Docker 容器中的 Nacos 服务,当开启了 socks 等代理服务时,可能导致访问失败。若使用了如 clash 等代理服务,可以在配置文件中关闭其 dns 功能,并配置该模拟域名为直连:
dns:
enable: false
...
rules:
- DOMAIN-SUFFIX,live.zjxjwxk.com,🎯 全球直连
若部署成功,可以通过 localhost:8848/nacos/index.html 访问 Nacos 控制台页面。
Maven 插件配置
在需要部署的微服务的 pom.xml 文件中配置如下插件,用于在 Maven 打包的同时构建 Docker 镜像:
<build>
<finalName>${artifactId}-docker</finalName>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.0</version>
<executions>
<!--当mvn执行install操作的时候,执行docker的build-->
<execution>
<id>build</id>
<phase>install</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageTags>
<imageTag>${project.version}</imageTag>
</imageTags>
<imageName>${project.build.finalName}</imageName>
<!--指定Dockerfile文件的位置-->
<dockerDirectory>${project.basedir}/docker</dockerDirectory>
<!--指定jar包路径,这里对应Dockerfile中复制jar包
到docker容器指定目录配置,也可以写到Dockerfile中-->
<resources>
<resource>
<targetPath>/</targetPath>
<!--将下边目录的内容,拷贝到docker镜像中-->
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
编写 Dockerfile 文件
在需要部署的微服务目录下创建 docker 文件夹,并在此文件夹下创建如下 Dockerfile 文件(路径与 pom.xml 中的 ${project.basedir}/docker 一致):
FROM openjdk:17-jdk-alpine
VOLUME /tmp
ADD live-user-provider-docker.jar app.jar
ENV JAVA_OPTS="\
-server \
-Xmx1g \
-Xms1g \
-Xmn256m"
ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar app.jar
构建 Docker 镜像
执行如下命令,在 Maven 打包的同时构建 Docker 镜像:
mvn install
若构建成功,则可以在 docker images 命令中找到构建成功的 Docker 镜像:
❯ docker images ─╯
REPOSITORY TAG IMAGE ID CREATED SIZE
live-user-provider-docker 1.0.0 45a95bb45bd6 2 hours ago 470MB
运行 Docker 容器
- 开发环境中,为了避免本机 IP 变化造成的麻烦,可以在环境变量中(如
~/.zshrc中)定义本机 IP 为 $HOST_IP。如 MacOS 可以定义如下变量,自动获取当前 IP:
export HOST_IP=$(ipconfig getifaddr en0)
由于该服务依赖的所有外部地址均使用模拟域名,并在开发环境中配置了 /etc/hosts 文件用于模拟真实域名,因此在运行 Docker 容器时,需要将域名和宿主机 IP 的映射通过
--add-host作为 host 传入容器内的/etc/hosts文件。由于该 Dubbo 服务需要向 Nacos 注册当前服务 IP,因此需要配置环境变量
-e DUBBO_IP_TO_REGISTRY用于配置向 Nacos 注册的真实 IP(此处为宿主机 IP),而不是容器内的 IP;并通过-p实现端口映射。(可参考:Dubbo 部署到 Docker 环境)
综上,执行以下 Docker 命令运行容器(其中 $HOST_IP 为宿主机 IP, “live.zjxjwxk.com” 为此服务依赖的模拟域名):
docker run --name live-user-provider \
-p "$HOST_IP":9090:9090 \
-e DUBBO_IP_TO_REGISTRY="$HOST_IP" \
--add-host "live.zjxjwxk.com:$HOST_IP" \
-d live-user-provider-docker:latest