Docker部署微服务

场景介绍

我们使用Docker完成一个微服务的搭建过程

整体架构如下

file

使用多个微服务进行项目部署测试

整体服务说明

我们总共涉及到三个微服务以及两个中间件

服务名称 描述
mysql 数据库服务
nacos 注册中心
learn-docker-gateway 网关服务
learn-docker-web API接口服务
learn-docker-storage 存储服务
配置文件提取

因为我们在开发中需要频繁修改application.yml文件我们将配置项配置到pom文件中打包时自动打到配置文件,这样可以用一个pom文件控制多个不同的服务的配置文件项的修改

pom文件定义属性

我们需要在总pom文件定义全局配置,例如nacosmysql等配置

<properties>
    <mysql.addr>192.168.64.153:3306</mysql.addr>
    <nacos.addr>192.168.64.153:8848</nacos.addr>
</properties>
配置编译选项

在子项目的pom文件的build构建配置中使用 <filtering>true</filtering>配置,这样就可以将我们的总pom中的配置编译进配置文件了

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>
配置文件配置

在子项目的application.yml配置文件中注意使用@xxx@占位符来配置编译占位配置,下面的配置就是用了@@占位符编译后会将pom中的配置编译到配置文件中

server:
  port: @project.server.prot@
spring:
  application:
    name: learn-docker-storage
    ######################### 数据源连接池的配置信息  #################
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://@db.addr@/employees?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: root
    initialSize: 10
    minIdle: 20
    maxActive: 100
    maxWait: 60000
  #### nacos 配置#######
  cloud:
    nacos:
      server-addr: @nacos.addr@
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.heima.module.p
编译测试

配置完后编译项目后,可以进入target目录下查看编译后的配置文件

file

我们看到maven已经帮我们将配置编译进了配置文件中了

安装MySQL

MySQL简介

​ MySQL 是世界上最受欢迎的开源数据库。凭借其可靠性、易用性和性能,MySQL 已成为 Web 应用程序的数据库优先选择。

查找MySQL镜像

我们可以使用 docker search 镜像名称,命令来搜索镜像

docker search mysql

file

参数解释

搜索出来的有这么多镜像,怎么选择呢

根据参数,我们一般选择 官方发布的,并且stars多的。

下载镜像

可以使用docker pull 镜像名称来拉取镜像,我们选择了第一个Mysql的镜像,我们把它给拉取下来

docker pull mysql

file

注意事项
下载指定版本的镜像

我们上面下载的镜像不符合我们的预期,我们需要Mysql5.7的镜像

查找指定镜像

可以登录 https://hub.docker.com 地址搜索镜像

file

输入需要搜索的镜像名称,并选择对应镜像名称

file

选择tag标签,这个就是版本的信息

file

找到符合的版本 的mysql镜像,这里我们选择5.7.33

file

下载指定版本镜像

刚才我们已经找到了5.7.33版本的Mysql的镜像,我们使用docker pull命令下载,镜像后面跟的是tag也就是版本名称

docker pull mysql:5.7.34

file

我们发现,我们的新拉取的mysql镜像共用了 部分分层

查看镜像

安装完镜像后,我们需要看一下我们的本地镜像,使用docker images 可用查看本地镜像

docker images

file

这里有两个镜像,一个是最新版本的一个是我们刚才下载的5.7.33版本的

MySQL配置
配置MySQL忽略大小写

创建MySQL挂载目录,等会会解释什么是挂载路径

# 创建MySQL配置的文件夹
mkdir -p /tmp/etc/mysql
# 编辑my.cnf配置文件
vi /tmp/etc/mysql/my.cnf

配置MySQL忽略大小写,在我们创建的MySQL配置文件挂载点的目录的my.cnf文件加入如下内容

[mysqld]
lower_case_table_names=1
创建MySQL数据目录

因为默认MySQL启动后他的文件是在容器中的,如果我们删除容器,数据也将会消失,我们需要将数据挂载出来。

#创建mysql存储的目录
mkdir -p /tmp/data/mysql
启动MySql

使用docker run启动容器

docker run -d -p 3306:3306 -v /tmp/etc/mysql:/etc/mysql/mysql.conf.d/ -v /tmp/data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql mysql:5.7.34

file

到这里MySQL已经后台运行了

参数解释
检查MySQL运行状态

现在并不能确认MySQL的运行状态,我们需要去看下

查看容器运行状态

使用docker ps可以看到运行中的容器

docker ps

执行命令后,我们看到mysql的服务已经起来了

file

查看MySQL运行日志

现在MySQL容器起来了,并不代表MySQL已经成功启动,我们需要使用docker logs命令查看MySQL的日志

docker logs -f mysql

该命令可以查看容器日志-f是追踪打印日志,可以看到MySQL已经启动了

file

客户端连接MySQL

因为我们已经暴漏端口了,可以使用客户端工具连接MySQL

file

检查配置的大小写参数是否生效

SHOW VARIABLES LIKE '%case_table%';

file

查看容器挂载的配置文件

可以通过docker exec -ti mysql /bin/bash命令登录容器,检查挂载的配置文件情况

# 登录容器
docker exec -ti mysql /bin/bash

该命令含义是在mysql容器中以

file

我们可以看到我们修改的配置文件已经被挂载到了docker内部,这里面用到了exec命令,主要是在deocker容器中运行命令,下面我们介绍下

命令格式

主要是在deocker容器中运行命令

docker exec [options] container command [arg...]

命令参数

名称 简写 描述
--detach -d 后台运行模式,在后台执行命令相关命令
--detach-keys 覆盖容器后台运行的一些参数信息
--env -e 设置环境变量
--interactive -i 展示容器输入信息STDIN
--privileged 为命令提供一些扩展权限
--tty -t 命令行交互模式
--user -u 设置用户名(format: <name|uid>[:<group|gid>])
--workdir -w 指定容器内的目录
查看挂载的数据文件

可以看下挂载的数据文件是否存在

cd /tmp/data/mysql/ && ll

file

我们看到数据文件已经写入了

MySQL准备数据

MySql需要导入一些数据用来操作,我们用MySQL官方提供的数据库来操作

下载并导入数据
下载MySQL测试数据库

到测试数据官网 下载数据库文件

file

直接导入无法导入,需要编辑employees.sql文件的一些地方

  1. set storage_engine = InnoDB;修改为: set default_storage_engine = InnoDB;

  2. select CONCAT('storage engine: ', @@storage_engine) as INFO;修改为:select CONCAT('storage engine: ', @@default_storage_engine) as INFO;

  .....
  set default_storage_engine  = InnoDB;
-- set storage_engine = MyISAM;
-- set storage_engine = Falcon;
-- set storage_engine = PBXT;
-- set storage_engine = Maria;
select CONCAT('storage engine: ',@@default_storage_engine) as INFO;
.....
导入测试数据

下载解压后,在本地执行命令导入到mysql服务器

mysql -uroot -h192.168.64.152 -p < employees.sql

file

客户端检查数据

在登陆客户端就能看到数据库以及表了

file

安装部署nacos

​ Nacos是阿里巴巴开源的一款支持服务注册与发现,配置管理以及微服务管理的组件。用来取代以前常用的注册中心(zookeeper , eureka等等),以及配置中心(spring cloud config等等)。Nacos是集成了注册中心和配置中心的功能,做到了二合一。

直接运行服务

可以直接用docker 启动服务,镜像不存在会自动拉取

docker run -d -p 8848:8848 --name nacos --env MODE=standalone nacos/nacos-server

file

运行容器后可以稍等下,等待nacos启动成功,受环境限制启动可能有些慢

登录页面测试

可以登录服务器测试以下

用户名:nacos 密码:nacos

file

微服务打包镜像

我们准备将一个微服务打包成Docker镜像,在各种服务器中进行运行,改为服务支持进行查询用户信息

提前说明

因为我们刚开始进行学习Docker,先从单个微服务开始学习,我们就先部署learn-docker-storage服务,后面随着课程的深入在慢慢增加其他的微服务

file

访问测试

在idea中运行learn-docker-storage

file

我们配置的端口是8003,我们可以直接访问http://localhost:8003/storage/employe/findByID/10001

file

打包上传微服务

learn-docker-storage服务打包后上传到服务器

注意配置项

这里需要检查下maven配置的编译属性是否正确

<mysql.addr>192.168.64.153:3306</mysql.addr>
<nacos.addr>192.168.64.153:8848</nacos.addr>

我们发现是我们容器中启动的地址

上传打包后的微服务

将target目录中打包完成的微服务上传到服务器

file

创建DockerFile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

创建一个Dockerfile文件

vi Dockerfile

具体内容如下

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD learn-docker-storage-1.0-SNAPSHOT.jar app.jar
EXPOSE  8003
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
命令解释
打包镜像

写好DockerFile后就需要用docker build命令来构建我们的镜像了,这样就可以将我们的微服务打包成一个镜像了

构建命令格式

构建一个镜像需要使用以下命令

docker bulid -t 仓库名/镜像名:tag .

参数解释

实战操作

​ 一般来说,应该会将 Dockerfile 置于一个空目录下,或者项目根目录下,如果该目录下没有所需文件,那么应该把所需文件复制一份过来。

​ 一般大家习惯性的会使用默认的文件名 Dockerfile,以及会将其置于镜像构建上下文目录中。

当前目录的结构如下

file

构建镜像

进入Dockerfile的目录,通过如下命令构建镜像

 docker build -t learn-docker-storage:0.0.1 .

构建完成如果出现Successfully说明已经构建成功了,

file

查看我们构建的镜像

使用docker images命令查看我们构建完成的镜像

docker images

我们可以看到我们的镜像就在第一个位置

file

运行镜像

刚才已经打包完成了镜像,现在我们运行我们自己的镜像

# 运行容器
docker run -d -p 8003:8003 learn-docker-storage:0.0.1
# 查看运行中的容器
docker ps

file

参数最后的learn-docker-storage:0.0.1是镜像的名称,如果启动容器可以使用镜像名称或者镜像ID

参数解释
查看启动日志

使用docker logs 容器ID来查看启动日志

docker logs -f 74c239792266

file

尝试访问服务

通过curl 命令来访问服务

curl http://192.168.64.153:8003/storage/employe/findByID/10001 | python -m json.tool

file

我们发现服务调用成功了,我们基本实现了微服务改造为docker方式并运行

删除容器

要删除一个容器首先需要将一个容器停止掉

停止容器

我们要把刚才运行的容器停止掉,使用docker stop 容器ID 停止一个容器

docker stop 3752f7088a04

file

停止容器后,我们在通过进程查看是看不到容器的,但是容器还是存在我们的服务中的

查看全部容器

通过docker ps 只能看到运行中的容器,但是我们停止的容器是看不到的,可以加上-a 查看所有的容器

docker ps -a

file

我们可以看到 加上-a参数可以看到刚才已经停止掉的容器

启动停止的容器

想要启动一个停止的容器可以使用docker start 容器ID

docker start 3752f7088a04

file

这样就把刚才已经停止的容器启动了

删除容器

已经停止的容器可以使用docker rm 容器ID删除容器,但是对于运行中的容器可以加上-f参数强制删除

docker rm -f 3752f7088a04

file

这样可以将一个运行的容器强制删除,如果停止的容器可以通过通过docker rm 删除

docker rm 3752f7088a04

这个时候就把容器给删除掉了

日志挂载优化

存储卷优化
什么是存储卷

“卷”是容器上的一个或多个“目录”,此类目录可绕过联合文件系统与宿主机上的某个目录“绑定(关联)”;

file

​ 在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中。

​ Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式

存储卷优化写入速度

Docker镜像由多个只读层叠加而成,启动容器时,docker会加载只读镜像层并在镜像栈顶部加一个读写层;

file

​ 如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件版本仍然存在,只是已经被读写层中该文件的副本所隐藏,此即“写时复制(COW)”机制

file

为了避免这种情况,构建Dockerfile的时候应该加入一个存储卷

Dockerfile增加存储卷
增加存储卷

编写Dockerfile增加存储卷,增加日志存储卷/logs,这会是一个匿名存储卷

FROM openjdk:8-jdk-alpine
VOLUME /tmp /logs
ADD learn-docker-storage-1.0-SNAPSHOT.jar app.jar
EXPOSE  8003
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
构建镜像

因为我们原来已经构建了镜像,这次使用版本号是 0.0.2

#构建镜像
docker build -t learn-docker-storage:0.0.2 .
# 查看镜像列表
docker images

file

运行容器

通过run命令运行容器

# 运行容器
docker run -d -p 8003:8003 learn-docker-storage:0.0.2
# 查看运行中的容器
docker ps

file

查看存储卷

通过docker volume ls可以看到存储卷

docker volume ls

file

查看容器信息

我们发现都是匿名的存储卷,如何来确定都是那个呢,可以通过docker inspect 容器ID来查看存储新鲜

 docker inspect 2041965c3e87|grep Mounts -A20

file

通过这个命令可以看到数据卷的名称以及宿主机的存储路径,我们可以直接到宿主机打印日志

 # 进入文件挂载目录
cd /var/lib/docker/volumes/d35de1b7e4631908b05635db4c1f114ab3aafbdf25a9843c068696e66a779c75/_data
# 输出日志
tail -f learn-docker-storage.log

file

这样就看到了我们的日志文件

验证存储卷

删除容器检查存储卷释放消失

# 查看运行的容器列表
docker ps
#删除容器
docker rm -f 2041965c3e87
#查看所有的容器列表(运行+停止)
docker ps -a

file

我们看到容器已经被删除了,检查我们的存储卷

docker volume ls

file

发现存储卷还存在,数据还是存在的,并且数据也存在

# 查看存储卷列表
docker volume ls
# 查看存储卷详情
docker inspect 296ccc64d919e86bb8329bf6b08447c2ea6a118458d3fcb86d5c7c9a3177dfe0

file

重新运行镜像启动一个新的容器

# 运行容器
docker run -d -p 8080:8080 e1222496c69f
# 查看运行中的容器
docker ps

file

启动容器后查看存储卷列表

# 查看存储卷列表
docker volume ls

file

我们发现有创建了两个存储卷,查看容器详情

 docker inspect 2041965c3e87|grep Mounts -A20

file

我们发现新启动的容器新开了一个匿名存储卷

bind挂载共享存储
什么是bind

​ Bind mounts模式和Volumes非常相似,不同点在于Bind mounts模式是将宿主机上的任意文件或文件夹挂载到容器,而Volumes本质上是将Docker服务管理的一块区域(默认是/var/lib/docker/volumes下的文件夹)挂载到容器。

共享存储

经过上面的测试,我们发现每一个容器都是单独用一个存储卷,用于临时文件没有问题的,但是如果要让容器都用同一个存储路径怎么办呢,这个时候就用到了 bind挂载了,可以使用-v进行挂载挂载刚才的存储卷。

# 级联创建文件夹
mkdir -p /tmp/data/logs
# 运行容器,指定挂载路径 
docker run -d -v /tmp/data/logs:/logs \
-p 8003:8003 --name learn-docker-storage \
learn-docker-storage:0.0.2

这里面--name是指定docker容器的名称,我们操作容器就可以使用名称进行操作了

file

然后使用docker inspect命令来检查容器详情

docker inspect learn-docker-storage|grep Mounts -A20

file

我们发现挂载日志的挂载方式已经变了,由原来的volume变为了bind,并且挂载路径变为了我们自己定义的路径,进入目录查看

# 进入目录并浏览目录文件
cd /tmp/data/logs/&&ll
# 打印日志详情
tail -f learn-docker-storage.log

file

验证共享存储

我们也按照上面步骤验证下bind方式挂载的存储,先删除容器,检查日志文件是否存在

# 停止并删除容器
docker rm -f learn-docker-storage
# 查看容器已经被删除了
docker ps -a
# 进入日志挂载路径查看日志是否村咋
cd /tmp/data/logs/&&ll

我们发现容器被删除但是日志文件还存在本地

file

启动一个新的容器

# 运行容器,指定挂载路径
docker run -d -v /tmp/data/logs:/logs \
-p 8003:8003 --name learn-docker-storage \
learn-docker-storage:0.0.2
# 查看日志文件
cat learn-docker-storage.log

我们发现新的容器的日志文件追加进来了

file

我们发现日志已经追加,我们让不同的容器挂载同一个目录了

volume和bind的区别

对于多个容器需要共享访问同一数据目录,或者需要持久化容器内数据(如数据库)时,我们都是采用挂载目录形式(bind mounts),将宿主机的某一目录挂载到容器内的指定目录,这种方式能解决问题,但这种方式也一直有一些缺点

​ bind mount和volume其实都是利用宿主机的文件系统,不同之处在于volume是docker自身管理的目录中的子目录,所以不存在权限引发的挂载的问题,并且目录路径是docker自身管理的,所以也不需要在不同的服务器上指定不同的路径,你不需要关心路径。

file

清理volume挂载

volume挂载方式,会生成很多匿名的目录,我们可以找到对应的没有使用的volume进行删除

docker volume ls

file

通过查看我们发现里面,有很多的volume,我们可以找到没有用的删除

 docker volume rm volume_name

file

还可以通过命令将没有引用的全部volume清除掉,但是这个命令很危险

docker volume prune

file

这样就将我们服务器上无效的volume清除掉了

网络优化

Docker网络原理

​ Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

​ Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。

Docker网络模式
Docker网络模式 配置 说明
host模式 –net=host 容器和宿主机共享Network namespace。
container模式 –net=container:NAME_or_ID 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。
none模式 –net=none 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。
overlay模式 -- driver overlay Docker跨主机通信模式,使用分布式计算机架构后需要使用overlay网络模式
bridge模式 –net=bridge (默认为该模式)
host模式

​ 如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

​ 使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。

Host模式如下图所示

file

container模式

​ 这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

Container模式示意图

file

none模式

​ 使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

​ 这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过--network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

None模式示意图

file

overlay模式

file

​ 容器在两个跨主机进行通信的时候,是使用overlay network这个网络模式进行通信,如果使用host也可以实现跨主机进行通信,直接使用这个物理的ip地址就可以进行通信。overlay它会虚拟出一个网络比如10.0.9.3这个ip地址,在这个overlay网络模式里面,有一个类似于服务网关的地址,然后把这个包转发到物理服务器这个地址,最终通过路由和交换,到达另一个服务器的ip地址。

bridge模式

​ 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

​ 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。

​ bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。

bridge模式如下图所示

file

我们的网络结构

下图是我们自己的网络结构,我们是通过宿主机访问Mysql容器的,刚才我们学过,默认Docker已经接入了一个名字叫bridge的桥接网络

file

我们可以让我们的网络直接接入桥接网络,例如下图

file

创建网络
查看网络列表

可以通过 docker network ls命令查看网络列表

# 查看网络列表
docker network ls

file

上面就是容器默认几种网络

创建一个桥接网络

默认容器启动会自动默认接入bridge的桥接网络,为了区分我们的服务也防止各种网络问题,我们创建一个专用网络,可以通过docker network create 网络名称来创建一个默认的桥接网络

# 创建一个桥接网络
docker network create learn-docker-network
# 查看网络列表
docker network ls

file

服务接入网络
停止并删除原有容器

停止和删除我们的微服务以及mysql服务

# 删除当前运行中的容器
docker rm -f learn-docker-storage nacos mysql

file

创建MySQL

因为我们的微服务依赖MySQL先启动MySQL并接入网络,因为MySQL不需要通过宿主机访问,所有也不需要映射端口了,--network 是配置接入哪一个网络

docker run -d \
-v /tmp/etc/mysql:/etc/mysql/mysql.conf.d/ \
-v /tmp/data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
--name mysql --network=learn-docker-network \
mysql:5.7.34

file

这样我们就把我们的MySQL服务启动起来了并且加入了learn-docker-network的网络

创建Nacos

我们的nacos是需要暴漏端口的,因为我们需要外部能够看到nacos页面,但是我们也需要我们的nacos连接到当前网络

docker run -d -p 8848:8848 \
--network=learn-docker-network \
--name nacos --env MODE=standalone \
nacos/nacos-server

file

查看网络详情

可以通过docker network inspect 网络名称可以查看当前的网络的详细信息

docker network inspect learn-docker-network|grep Containers -A 20

file

修改微服务配置

因为需要使用自定义网络访问mysql容器以及nacos容器,需要修改微服务数据库连接地址,

​ docker 网络访问 可以通过IP或者通过服务名称都是可以的,这里我们通过服务名称访问,因为我们使用了maven打包的方式,我们只需要将pom文件修改就可以

<properties>
    <mysql.addr>mysql:3306</mysql.addr>
    <nacos.addr>nacos:8848</nacos.addr>
</properties>

修改完成后进行编译项目

file

这里将数据库连接地址改为mysql容器的服务名称mysql,nacos的连接地址变为了nacos

重新打包服务

将打包的文件上传服务器后按照上面步骤同上面打包,打包版本为 0.0.3

docker build -t learn-docker-storage:0.0.3 .

file

创建微服务

下面就按部就班的创建微服务就可以,只是注意需要加入网络,这里这个端口需要映射外网访问

docker run -d \
-v /tmp/data/logs:/logs \
-p 8003:8003 \
--name learn-docker-storage \
--network=learn-docker-network \
learn-docker-storage:0.0.3

file

测试微服务

到现在微服务已经启动,我们尝试访问以下

 curl http://192.168.64.153:8003/storage/employe/findByID/10001 | python -m json.tool

file

访问测试数据没有问题,到现在我们服务已经搭建完成,并且使用网络进行了优化

本文由传智教育博学谷 - 狂野架构师教研团队发布
如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力
转载请注明出处!

发表回复