关于java:步骤详解Docker一键部署微服务详细教程

Docker部署微服务

场景介绍

咱们应用Docker实现一个微服务的搭建过程

整体架构如下

应用多个微服务进行我的项目部署测试

整体服务阐明

咱们总共波及到三个微服务以及两个中间件

服务名称 形容
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目录下查看编译后的配置文件

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

装置MySQL

MySQL简介

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

查找MySQL镜像

咱们能够应用 docker search 镜像名称,命令来搜寻镜像

docker search mysql

参数解释

搜寻进去的有这么多镜像,怎么抉择呢

  • NAME: 镜像仓库源的名称
  • DESCRIPTION: 镜像的形容
  • OFFICIAL: 是否 docker 官网公布
  • stars: 相似 Github 外面的 star,示意点赞、喜爱的意思。
  • AUTOMATED: 主动构建。

依据参数,咱们个别抉择 官网公布的,并且stars多的。

下载镜像

能够应用docker pull 镜像名称来拉取镜像,咱们抉择了第一个Mysql的镜像,咱们把它给拉取下来

docker pull mysql

注意事项
  • 如果不写版本号默认拉取最新的版本好latest
  • 拉取的时候是多个层一起拉取的,这样可用让其余镜像复用分层
  • 如果拉取的镜像不写仓库地址默认就是docker.io/library/
下载指定版本的镜像

咱们下面下载的镜像不合乎咱们的预期,咱们须要Mysql5.7的镜像

查找指定镜像

能够登录 https://hub.docker.com 地址搜寻镜像

输出须要搜寻的镜像名称,并抉择对应镜像名称

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

找到合乎的版本 的mysql镜像,这里咱们抉择5.7.33

下载指定版本镜像

方才咱们曾经找到了5.7.33版本的Mysql的镜像,咱们应用docker pull命令下载,镜像前面跟的是tag也就是版本名称

docker pull mysql:5.7.34

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

查看镜像

装置完镜像后,咱们须要看一下咱们的本地镜像,应用docker images 可用查看本地镜像

docker images

这里有两个镜像,一个是最新版本的一个是咱们方才下载的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

到这里MySQL曾经后盾运行了

参数解释
  • -d:是指容器后盾运行,如果不加-d,当用户断开客户端时容器会完结运行
  • -p:将容器的3306端口映射到主机的3306端口,用来暴漏端口的
  • -v:这个命令是用来挂载目录的,将本地目录挂载到容器中,这样容器操作的就是本地目录
  • -e:这个命令是配置环境参数的,这里MYSQL_ROOT_PASSWORD=root指的是用root用户运行mysql,能够登录Docker容器通过ENV命令查看
  • –name:这个命令是配置Mysql的容器名称的,如果不配置,默认是随机生成的名字
查看MySQL运行状态

当初并不能确认MySQL的运行状态,咱们须要去看下

查看容器运行状态

应用docker ps能够看到运行中的容器

docker ps

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

查看MySQL运行日志

当初MySQL容器起来了,并不代表MySQL曾经胜利启动,咱们须要应用docker logs命令查看MySQL的日志

docker logs -f mysql

该命令能够查看容器日志-f是追踪打印日志,能够看到MySQL曾经启动了

客户端连贯MySQL

因为咱们曾经暴漏端口了,能够应用客户端工具连贯MySQL

查看配置的大小写参数是否失效

SHOW VARIABLES LIKE '%case_table%';

查看容器挂载的配置文件

能够通过docker exec -ti mysql /bin/bash命令登录容器,查看挂载的配置文件状况

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

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

咱们能够看到咱们批改的配置文件曾经被挂载到了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

咱们看到数据文件曾经写入了

MySQL筹备数据

MySql须要导入一些数据用来操作,咱们用MySQL官网提供的数据库来操作

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

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

间接导入无奈导入,须要编辑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

客户端检查数据

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

装置部署nacos

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

间接运行服务

能够间接用docker 启动服务,镜像不存在会主动拉取

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

运行容器后能够稍等下,期待nacos启动胜利,受环境限度启动可能有些慢

登录页面测试

能够登录服务器测试以下

用户名:nacos 明码:nacos

微服务打包镜像

咱们筹备将一个微服务打包成Docker镜像,在各种服务器中进行运行,改为服务反对进行查问用户信息

提前阐明

因为咱们刚开始进行学习Docker,先从单个微服务开始学习,咱们就先部署learn-docker-storage服务,前面随着课程的深刻在缓缓减少其余的微服务

拜访测试

在idea中运行learn-docker-storage

咱们配置的端口是8003,咱们能够间接拜访http://localhost:8003/storage/employe/findByID/10001

打包上传微服务

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

留神配置项

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

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

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

上传打包后的微服务

将target目录中打包实现的微服务上传到服务器

创立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"]
命令解释
  • FORM:定制的镜像都是基于 FROM 的镜像,这里的 openjdk 就是定制须要的根底镜像,后续操作都是基于openjdk
  • VOLUME:挂载一个数据卷,这里因为没有名称,所以是一个默认的数据卷(前面具体解释)
  • ADD:增加一层镜像到以后镜像,这里就是增加SpringBootTest镜像到以后层,并改名app.jar
  • EXPOSE:暴漏端口,因为咱们的本人的端口是8080,所以咱们暴漏8080
  • ENTRYPOINT:设定容器启动时第一个运行的命令及其参数,这里就是容器以启动就执行 java -jar /app.jar
打包镜像

写好DockerFile后就须要用docker build命令来构建咱们的镜像了,这样就能够将咱们的微服务打包成一个镜像了

构建命令格局

构建一个镜像须要应用以下命令

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

参数解释

  • -t: 镜像的名字及标签,个别命名规定是 仓库名/镜像名:tag,

    • 仓库名:个别是私服或者dockerhub等地址,如果疏忽默认就是dockerhub的地址docker.io.library/
    • 镜像名称:就是咱们的本人的服务名称,能够随便命名
    • tag:就是咱们的版本号
  • .:这个 . 示意当前目录,这实际上是在指定上下文的目录是当前目录,docker build 命令会将该目录下的内容打包交给 Docker 引擎以帮忙构建镜像。
实战操作

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

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

当前目录的构造如下

构建镜像

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

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

构建实现如果呈现Successfully阐明曾经构建胜利了,

查看咱们构建的镜像

应用docker images命令查看咱们构建实现的镜像

docker images

咱们能够看到咱们的镜像就在第一个地位

运行镜像

方才曾经打包实现了镜像,当初咱们运行咱们本人的镜像

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

参数最初的learn-docker-storage:0.0.1是镜像的名称,如果启动容器能够应用镜像名称或者镜像ID

参数解释
  • -d:后盾运行
  • -p:映射端口,将宿主机的8080端口映射到docker外部的8080端口上
查看启动日志

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

docker logs -f 74c239792266

尝试拜访服务

通过curl 命令来拜访服务

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

咱们发现服务调用胜利了,咱们根本实现了微服务革新为docker形式并运行

删除容器

要删除一个容器首先须要将一个容器进行掉

进行容器

咱们要把方才运行的容器进行掉,应用docker stop 容器ID 进行一个容器

docker stop 3752f7088a04

进行容器后,咱们在通过过程查看是看不到容器的,然而容器还是存在咱们的服务中的

查看全副容器

通过docker ps 只能看到运行中的容器,然而咱们进行的容器是看不到的,能够加上-a 查看所有的容器

docker ps -a

咱们能够看到 加上-a参数能够看到方才曾经进行掉的容器

启动进行的容器

想要启动一个进行的容器能够应用docker start 容器ID

docker start 3752f7088a04

这样就把方才曾经进行的容器启动了

删除容器

曾经进行的容器能够应用docker rm 容器ID删除容器,然而对于运行中的容器能够加上-f参数强制删除

docker rm -f 3752f7088a04

这样能够将一个运行的容器强制删除,如果进行的容器能够通过通过docker rm 删除

docker rm 3752f7088a04

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

日志挂载优化

存储卷优化
什么是存储卷

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

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

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

存储卷优化写入速度

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

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

为了防止这种状况,构建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

运行容器

通过run命令运行容器

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

查看存储卷

通过docker volume ls能够看到存储卷

docker volume ls

查看容器信息

咱们发现都是匿名的存储卷,如何来确定都是那个呢,能够通过docker inspect 容器ID来查看存储陈腐

 docker inspect 2041965c3e87|grep Mounts -A20

通过这个命令能够看到数据卷的名称以及宿主机的存储门路,咱们能够间接到宿主机打印日志

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

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

验证存储卷

删除容器查看存储卷开释隐没

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

咱们看到容器曾经被删除了,查看咱们的存储卷

docker volume ls

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

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

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

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

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

# 查看存储卷列表
docker volume ls

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

 docker inspect 2041965c3e87|grep Mounts -A20

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

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容器的名称,咱们操作容器就能够应用名称进行操作了

而后应用docker inspect命令来查看容器详情

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

咱们发现挂载日志的挂载形式曾经变了,由原来的volume变为了bind,并且挂载门路变为了咱们本人定义的门路,进入目录查看

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

验证共享存储

咱们也依照下面步骤验证下bind形式挂载的存储,先删除容器,查看日志文件是否存在

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

咱们发现容器被删除然而日志文件还存在本地

启动一个新的容器

# 运行容器,指定挂载门路 
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

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

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

volume和bind的区别

对于多个容器须要共享拜访同一数据目录,或者须要长久化容器内数据(如数据库)时,咱们都是采纳挂载目录模式(bind mounts),将宿主机的某一目录挂载到容器内的指定目录,这种形式能解决问题,但这种形式也始终有一些毛病

  • 容器在不同的服务器部署须要依据理论磁盘挂载目录批改门路
  • 不同操作系统的文件和目录权限会搞得你昏头转向,火冒三丈 ?

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

清理volume挂载

volume挂载形式,会生成很多匿名的目录,咱们能够找到对应的没有应用的volume进行删除

docker volume ls

通过查看咱们发现外面,有很多的volume,咱们能够找到没有用的删除

 docker volume rm volume_name

还能够通过命令将没有援用的全副volume革除掉,然而这个命令很危险

docker volume prune

这样就将咱们服务器上有效的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模式如下图所示

container模式

​ 这个模式指定新创建的容器和曾经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创立本人的网卡,配置本人的 IP,而是和一个指定的容器共享 IP、端口范畴等。同样,两个容器除了网络方面,其余的如文件系统、过程列表等还是隔离的。两个容器的过程能够通过 lo 网卡设施通信。

Container模式示意图

none模式

​ 应用none模式,Docker容器领有本人的Network Namespace,然而,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。须要咱们本人为Docker容器增加网卡、配置IP等。

​ 这种网络模式下容器只有lo回环网络,没有其余网卡。none模式能够在容器创立时通过–network=none来指定。这种类型的网络没有方法联网,关闭的网络能很好的保障容器的安全性。

None模式示意图

overlay模式

​ 容器在两个跨主机进行通信的时候,是应用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模式如下图所示

咱们的网络结构

下图是咱们本人的网络结构,咱们是通过宿主机拜访Mysql容器的,方才咱们学过,默认Docker曾经接入了一个名字叫bridge的桥接网络

咱们能够让咱们的网络间接接入桥接网络,例如下图

创立网络
查看网络列表

能够通过 docker network ls命令查看网络列表

# 查看网络列表
docker network ls

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

创立一个桥接网络

默认容器启动会主动默认接入bridge的桥接网络,为了辨别咱们的服务也避免各种网络问题,咱们创立一个专用网络,能够通过docker network create 网络名称来创立一个默认的桥接网络

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

服务接入网络
进行并删除原有容器

进行和删除咱们的微服务以及mysql服务

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

创立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

这样咱们就把咱们的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

查看网络详情

能够通过docker network inspect 网络名称能够查看以后的网络的详细信息

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

批改微服务配置

因为须要应用自定义网络拜访mysql容器以及nacos容器,须要批改微服务数据库连贯地址,

​ docker 网络拜访 能够通过IP或者通过服务名称都是能够的,这里咱们通过服务名称拜访,因为咱们应用了maven打包的形式,咱们只须要将pom文件批改就能够

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

批改实现后进行编译我的项目

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

从新打包服务

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

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

创立微服务

上面就循序渐进的创立微服务就能够,只是留神须要退出网络,这里这个端口须要映射外网拜访

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

测试微服务

到当初微服务曾经启动,咱们尝试拜访以下

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

拜访测试数据没有问题,到当初咱们服务曾经搭建实现,并且应用网络进行了优化

本文由传智教育博学谷 – 狂野架构师教研团队公布,转载请注明出处!

如果本文对您有帮忙,欢送关注和点赞;如果您有任何倡议也可留言评论或私信,您的反对是我保持创作的能源

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理