您当前的位置: 首页 >  docker

星夜孤帆

暂无认证

  • 4浏览

    0关注

    626博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

一文搞懂Docker

星夜孤帆 发布时间:2020-12-18 10:12:35 ,浏览量:4

一、Docker概述 1.1 Docker为什么出现?

一款产品:开发->上线 生产环境、测试环境,两套环境!应用环境!应用配置!

开发->运维

问题:我在我电脑上可以运行!版本更新,导致服务不可用!

环境配置十分麻烦,每一个机器都要部署环境(如集群Redis、ES、Hadoop...)!费时费力。

发布一个项目(jar + (Redis MySQL jdk ES)),项目能不能都带上环境安装打包!

之前在服务器配置一个应用到环境Redis MySQL JDK ES Hadoop,配置超麻烦,不能跨平台。

Windows,最后发布到Linux!

传统:开发jar,运维来做!

现在:开发打包部署上线,一套流程做完!

java --> apk --> 发布(应用商店) -->用户使用apk-->安装即可用!

java --> jar(环境) --> 带上环境打包项目(镜像) --> Docker仓库(商店) --> 下载我们发布的镜像 -->直接运行即可!

Docker给以上问题,提出了解决方案!

Docker的思想就来自于集装箱

JRE --> 多个应用(端口冲突) --> 原来都是交叉的

隔离:Docker核心思想!打包装箱!每个箱子都是互相隔离的。

比如,水果 生化武器,以前是不可以放在一起的,有了Docker,就会把他们隔离开来,可以放在一起了。

Docker通过隔离机制,可以将服务器利用到极致。

本质:所有的技术都是因为出现了一些问题,我们需要去解决,才去学习。

1.2 Docker的历史

2010年,几个搞IT的年轻人,就在美国成立了一家公司dotCloud

做一些pass的云计算服务! Linux有关的容器技术!

他们将自己的技术(容器化技术)命名就是 Docker !

Docker刚刚诞生的时候,没有引起行业的注意! dotCloud,就活不下去!

开源

开发源代码!

2013年,Docker开源!

Docker越来越多的人发现了docker的优点!火了,Docker每个月都会更新一个版本!

2014年4月9日,Docker1.0发布!

Docker为什么这么火?十分的轻巧!

在容器技术出来之前,我们都是使用虚拟机技术!

虚拟机∶在window中装一个Vmware,通过这个软件我们可以虚拟出来一台或者多台电脑!笨重!

虚拟机也是属于虚拟化技术,Docker容器技术,也是—种虚拟化技术!

vm:linux centos原生镜像(就类似一台电脑!),如果要做隔离,需要开启多个虚拟机!几个G  启动几分钟

docker:隔离,镜像(最核心的环境4m + jdk + mysq1)十分的小巧,运行镜像就可以了!小巧!  几个M 甚至几KB, 秒级启动!

Docker是基于Go语言开发的!开源项目!

官网:http://www.docker.com/

文档地址:https://docs.docker.com/ Docker的文档是超级详细的!

仓库地址:https://hub.docker.com/ git push git pull 

1.3 Docker能干嘛

之前的虚拟机技术

虚拟机技术的缺点:

1.资源占用十分多

2.冗余步骤多

3.启动很多

容器化技术

容器化技术不是模拟的一个完整的操作系统

比较Docker和虚拟机技术的不同:

传统虚拟机,虚拟出一套硬件,运行一个完整的操作系统,然后,在这个系统上安装和运行软件

容器内的应用直接运行在宿主机的内核,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了

每个容器间是互相隔离的,每个容器内都有一个属于自己的文件系统,互不影响。

DevOps(开发、运维)

应用更快速的交付和部署

传统:一堆帮助文档,安装程序

Docker:打包镜像,发布测试,一键运行

更便捷的升级和扩缩容

使用了Docker之后,我们部署应用就和搭积木一样

比如,我们有这些应用,SpringBoot1.5  Redis5  Tomcat8,以前我们升级,需要每一个去升级,现在我们通过Docker把他们打包成一个镜像了,只需要对这个镜像升级即可。

项目打包为一个镜像,假如,服务器A出现问题,我现在要水平扩展,直接在服务器B上运行这个镜像即可。

更简单的系统运维

在容器化之后,我们的开发,测试环境都是高度一致的

更高效的计算资源利用

Docker是内核级别的虚拟化,可以在一个物理机上运行很多的容器实例,服务器的性能可以被压榨到极致。

二、Docker安装 2.1 Docker的基本组成

镜像(image):

docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像-->run-->tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。

Person p = new Person(); ->  容器1 =  new 镜像(); 镜像类似于Class对象,容器类似于实例

容器(container):

Docker利用容器技术,独立运行一个或一组应用,通过镜像来创建。

启动,停止,删除,基本命令。

目前,就可以把这个容器理解为一个简易的linux系统。

仓库(repository):

仓库就是存放镜像的地方

仓库分为公有仓库和私有仓库

Docker Hub(默认是国外的)

阿里云...都有容器服务器(配置镜像加速!)

2.2 安装Docker 2.2.1 环境准备

1. 需要会一点点的Linux的基础

2. CentOS 7

3. 我们使用Xshell连接远程服务器进行操作

2.2.2 环境查看
# 系统内核是3.10以上的
# 切换到root账户
su root
[jak@centos7 ~]$ uname -r

3.10.0-862.el7.x86_64
# 系统版本
[jak@centos7 ~]$ cat /etc/os-release

NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
2.2.3 帮助文档

帮助文档

# 1、卸载旧的版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
# 2、安需要的安装包
sudo yum install -y yum-utils

# 3、设置镜像的仓库
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的

sudo yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 推荐使用阿里云镜像

# 4、更新yum软件包索引
yum makecache fast

# 5、安装docker docker-ce社区 ee企业版
sudo yum install docker-ce docker-ce-cli containerd.io

# 6、启动docker
systemctl start docker

# 7、使用docker version查看是否安装成功
docker version

# 8、hello-world
docker run hello-world

# 9、查看一下下载的这个hello-world镜像
docker images

 

# 10、卸载docker
# (1) 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io

# (2) 删除资源
rm -rf /var/lib/docker

# /var/lib/docker docker的默认工作路径
2.2.4 阿里云镜像加速

1、登录阿里云找到容器镜像服务

2. 找到镜像加速地址

 

3.配置使用

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json 3310和容器内的3306映射,这个时候我们就可以连接上了!

在本地测试创建一个数据库,查看一下我们映射的路径是否ok

假设我们将容器删除

发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能。

 5.4 具名和匿名挂载
# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /ect/nginx nginx

# 查看所有的volume的情况
docker volume ls
local     129777352a24e815d1078a6afda8c0fc35dcea775c67d0d3adf63fabce9ddae0

# 这里发现,这种就是匿名挂载,我们在-v只写了容器内路径,没有写容器外的路径

# 具名挂载
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
docker volume ls
DRIVER    VOLUME NAME
local     juming-nginx

# 通过 -v 卷名:容器内路径
# 查看一下这个卷

所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/卷名/_data

我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的具名挂载。

# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径  # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径::容器内路径 # 指定路径挂载

拓展:
# 通过 -v 容器内路径: ro rw 改变读写权限
ro readonly # 只读
rw readwrite #可读可写

# 一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

# ro 只要看到ro就说明,这个路径只能通过宿主机来操作,容器内部是无法操作

5.5 初始Dockerfile

Dockerfile就是用来构建docker镜像的构建文件,命令脚本,先体验一下

通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层。

# 创建一个dockerfile文件,名字可以随机,建议Dockerfile
# 文件中的内容 指令(大写) 参数
FROM centos

VOLUME ["volume01', "volume02"]

CMD echo "--end--"

CMD /bin/bash

# 这里的每个命令,就是镜像的一层。

# 构建镜像
docker build -f /home/docker-test-volume/dockerfile1 -t jak/centos1.0 .

这个卷和外部一定有一个同步的目录!

查看一下卷挂载的路径 

测试一下刚才的文件是否同步出去了

这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像

假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径.

5.6 数据卷容器

启动三个容器,通过我们刚才自己写的镜像启动

docker run -it --name docker02 --volumes-from docker01 jak/centos1.0

测试:可以删除docker01,查看一下docker02和docker03是否还可以访问这个文件

结果依旧可以访问

多个mysql实现数据共享

docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

结论:

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。

但是,一旦你持久化到了本地,这个时候,本地的数据是不会删除的。

六、DockerFile 6.1 简介

dockerfile是用来构建docker镜像文件的,命令参数脚本

构建步骤:

1.编写一个dockerfile文件

2.docker build构建成为一个镜像

3.docker run 运行镜像

4.docker push发布镜像(DockerHub、阿里云镜像仓库)

查看一下官方是怎么做的

很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!

官方既然可以制作镜像,那我们也可以!

6.2 Dockerfile构建过程 6.2.1 基础知识

1.每个保留关键字(指令)都必须是大写字母

2.执行从上到下顺序执行

3.#表示注释

4.每一个指令都会创建提交一个新的镜像层,并提交

dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!

Docker镜像逐渐成为企业交付的标准,必须要掌握

步骤:开发,部署,运维,缺一不可

  • DockerFile:构建文件,定义了一切的步骤,源代码
  • DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品!
  • Docker容器:容器就是镜像运行起来提供服务器
6.3 DockerFile的指令
FROM   # from 基础镜像,一切从这里开始构建
MAINTAINER # maintainer 镜像是谁写的,姓名+邮箱
RUN     # run 镜像构建的时候需要运行的命令
ADD   # add 步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR # workdir 镜像的工作目录
VOLUME # volume 挂载的目录
EXPOSE  # expose 暴露端口 和-p一个作用
CMD # cmd 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # entrypoint 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # onbuild 当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令,触发指令
COPY # copy 类似ADD,将我们的文件拷贝到镜像中
ENV # env 构建的时候设置环境变量

6.4 创建自己的centos

Docker Hub中99%镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行的构建

6.4.1 编写Dockerfile文件

FROM centos
MAINTAINER jak

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "----end-----"
CMD /bin/bash
        
6.4.2 通过Dockerfile文件构建镜像
# docker build -f dockerfile文件路径 -t 镜像名:[tag] .

docker build -f myDockerFile -t mycentos:0.1 .

 

6.4.3 测试运行

对比:更改之后

6.4.4 列出变更历史

我们可以列出本地进行的变更历史

我们平时拿到一个镜像,可以研究一下它是怎么做的

6.5 CMD和ENTRYPOINT区别
CMD # cmd 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # entrypoint 指定这个容器启动的时候要运行的命令,可以追加命令
6.5.1 测试cmd
# dockerfile文件
FROM centos
CMD ["ls","-a"]

# 构建镜像
docker build -f dockerfile-cmd-test -t cmdtest .

run运行,发现我们的ls -a命令生效

 

6.5.2 测试ENTRYPOINT

Dockerfile中很多命令都十分的相似,我们需要了解它们的区别,我们最好的学习就是对比他们,然后测试效果

6.6 制作Tomcat镜像 6.6.1 准备镜像文件tomcat压缩包,jdk的压缩包

# 解压
tar -zxvf 压缩文件

linux安装jdk

6.6.2 编写dockerfile文件

使用官方命名Dockerfile,build的时候,会自动寻找这个文件,就不需要-f指定了

FROM centos
MAINTAINER jak

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u161-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.10.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_161
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.10
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.10
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATLINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.10/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.10/bin/logs/catalina.out
6.6.3 构建镜像
docker build -t diytomcat .

6.6.4 启动镜像
docker run -d -p 9090:8080 --name jakTomcat -v /home/jak/build/tomcat/test:/usr/local/apache-tomcat-9.0.10/webapps/test -v /home/jak/build/tomcat/tomcatLogs/:/usr/local/apache-tomcat-9.0.10/logs diytomcat

6.6.5 访问测试

6.6.6 发布项目

由于做了卷挂载,我们直接在本地编写项目就可以发布了









hello, jak


Hello World!


 发现:项目部署成功,可以直接访问ok!

我们以后开发的步骤:需要掌握Dockerfile的编写,我们之后的一切都是使用docker镜像来发布运行。

6.7 发布自己的镜像

1. 地址https://hub.docker.com/注册自己的账户

2.确定这个账号可以登录

3.在我们服务器上提交自己的镜像

docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

4.登录完毕后就可以提交镜像了,就是一步docker push

docker login -u jak

# 一定要带版本号
docker push 镜像:1.0

提交的时候也是按照镜像的层级来进行提交的。

6.8 阿里云镜像服务上

1.登录阿里云

2.找到容器镜像服务

3.创建命名空间

4.创建容器镜像

6.9 小结

七、Docker网络 7.1 理解Docker0 7.1.1 查看网卡
docker rm -f $(docker ps -aq)

docker rmi -f $(docker images -aq)

docker images

docker ps

ip addr

 

这么多网络,docker是如何处理容器网络访问的

# 查看容器的内部网络地址 ip addr
ip addr

docker exec -it tomcat01 ip addr

Ctrl+P,然后,Ctrl+Q不停止容器,退出 

思考,linux能不能ping通容器内部

7.1.2 原理

1. 我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0

桥接模式,使用的技术是evth-pair技术

再次测试ip addr

2.再启动一个容器测试,发现又多了一对网卡

我们发现这个容器带来的网卡,都是一对对的

evth-pair就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连,正因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备的

OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术。

3. 我们来测试下tomcat01和tomcat02是否可以ping通

结论:容器和容器之间是可以互相ping通的

绘制一个网络模型图:

结论:tomcat01和tomcat02是公用的一个路由器,docker0。

所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip

7.1.3 小结

Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥docker0

Docker中的所有的网络接口都是虚拟的,虚拟的转发效率高(内网传递文件)

只要容器删除,对应网桥一对就没了

7.2 --link

思考一个场景,我们编写了一个微服务,database url=ip:,项目不重启,数据库ip换掉了,我们希望可以处理这个问题,可以通过名字来进行访问容器。

# 通过--link就可以解决网络连通问题了
 docker run -d -P --name tomcat03 --link tomcat02  tomcat

探究:inspect

其实这个tomcat03就是在本地配置了tomcat02的配置

查看hosts配置,在这里发现

本质探究:

--link就是我们在hosts配置中增加了一个172.17.0.3    tomcat02 942ec82d8ec3

我们现在玩Docker已经不建议使用--link了

自定义网络,不适用docker0

docker0问题:他不支持容器名连接访问。

7.3 自定义网络 7.3.1 查看所有的docker网络

7.3.2 网络模式

bridge:桥接docker(默认,自己创建也使用bridge模式)

none:不配置网络

host:和宿主机共享网络

container:容器网络连通(用的少,局限很大)

7.3.3 测试
# 我们直接启动的命令 --net bridge,而这个就是我们的docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat

# docker0特点:默认,域名不能访问,--link可以打通连接

# 我们可以自定义一个网络
# --driver bridge
# --subnet 192.168.0.0/16 192.168.0.2 192.168.255.255
# --gateway 192.168.0.1

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
ac3c3a640244e91c879f615ffd8fd11aad50575fe968bac9dfa8362faf6119a0

docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
522664bd7aea   bridge    bridge    local
91d57ac7ce20   host      host      local
ac3c3a640244   mynet     bridge    local
ea8d7c2fd4ad   none      null      local
[root@centos7 tomcatLogs]# 

 我们自己的网络就创建好了

 

我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络。

好处:

redis-不同的集群使用不同的网络,保证集群是安全和健康的

mysql-不同的集群使用不同的网络,保证集群是安全和健康的

7.4 网络连通 7.4.1 分析

结论:假设要跨网络操作别人,就需要使用docker network connect连通!

7.5 部署Redis集群 7.5.1 大体架构

7.5.2 shell脚本
# 创建网卡
docker network create redis --subnet 172.38.0.0/16

for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat /mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done


# 启动
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \

docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
-v /mydata/redis/node-5/data:/data \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 进入redis-1,注意是/bin/sh不是/bin/bash
docker exec -it redis-1 /bin/sh
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1

docker搭建redis集群完成

我们使用docker之后,所有的技术都会慢慢变得简单起来

7.6 SpringBoot微服务打包Docker镜像 7.6.1 构建springboot项目

7.6.2 打包应用

7.6.3 编写dockerfile

7.6.4 构建镜像

7.6.5 发布运行

如果有很多镜像?怎么整

 视频教程、gitee源码

关注
打赏
1636984416
查看更多评论
0.1275s