是什么
解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
虚拟机技术
缺点:
- 资源占用多
- 冗余步骤多
- 启动慢
容器虚拟化技术
开发自运维(DevOps)
好处:
- 更快速的应用交付和部署。
- 更便捷的升级和扩缩容。
- 更简单的系统运维。
- 更高效的计算资源利用。
Docker
架构图:
Docker的基本组成
- 镜像(image)
镜像如同java中的类。
镜像是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建很多容器。
- 容器(container)
容器如同java中的对象。
Docker利用容器独立运行的一个或一组应用。容器是用镜像创建的运行实例。
它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的 Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
- 仓库(repository)
仓库是中存放能像文件的场所。
仓库( Repository)和仓库注册服务器( Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库( Public)和私有仓库( Private)两种形式。
总结
Docker本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎 image镜像文件。只有通过这个镜像文件才能生成 Docker容器。 Image文件可以看作是容器的模板。Docker根据 Image文件生成容器的实例。同一个 Image文件,可以生成多个同时运行的容器实例。
- Image文件生成的容器实例,本身也是一个文件,称为镜像文件。
- 一个容器运行一种服务,当我们需要的时候,就可以通过 docke客户端创建一个对应的运行实例,也就是我们的容器。
- 至于仓库,就是放了一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候从仓库中拉下来就可以了。
Docker的安装
centos版本必须是6.5以上,学习时使用的是centos7.7。
centos版docker官方的安装步骤:https://docs.docker.com/engine/install/centos/
具体操作步骤:
yum install -y yum-utils
如果不是root用户,就在前面加上sudo。
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
docker仓库是国外的,所以这里我们用阿里云的,速度快。
yum makecache fast
然后更新一下yum软件包索引,下载速度会快一些。
sudo yum install docker-ce docker-ce-cli containerd.io
这是下载最新版,下载其他版本的点击上面的链接查看步骤。
cd /etc/docker
vim daemon.json
在/etc/docker下新建daemon.json文件。
{
"registry-mirrors": ["xxxx"]
}
xxxx为阿里云的镜像加速网站,登录阿里云免费获得。
https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fcr.console.aliyun.com%2Fcn-hangzhou%2Finstances%2Fsource
然后保存退出
systemctl daemon-reload
systemctl restart docker
启动docker。
docker version
查看docker版本。
docker run hello-world
运行hello-world。
docker的卸载
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /etc/docker
docker命令
1. 帮助命令
docker version
查看docker版本docker info
查看docker的详细详细docker --help
查看docker的命令
2. 镜像命令
docker images [OPTIONS]
列出本地主机上的镜像。
OPTIONS:
-a:列出本地所有镜像(含中间映像层)
-q:只显示镜像ID
–digests:显示镜像的摘要信息
–no-trunc:显示完整的镜像信息
REPOSITORY | 镜像的仓库源 |
---|---|
TAG | 镜像的标签(latest代表最新) |
IMAGE ID | 镜像的ID |
CREATED | 镜像创建的时间 |
SIZE | 镜像的大小 |
-
docker tag 镜像名:当前版本号 镜像名:新的版本号
制作新的镜像版本,id相同。 -
docker search 镜像名字
列出从dockerhub上查到的镜像
OPTIONS:
–no-trunc:显示完整的镜像描述
–filter=stars=xx
:列出收藏数不小于指定值的镜像
–filter=is-automated=true:只列出automated build类型的镜像
如果出现这个错误:
此出自己电脑的DNS。
然后vim /etc/resolv.conf
写入DNS。
nameserver x.x.x.x
nameserver x.x.x.x
最后重启下systemctl restart network
。
-
docker pull 镜像名字[:TAG]
下载镜像。([:TAG]为选择下载的版本号,不写默认最新(:latest)) -
docker rmi 镜像名
删除镜像。
删除单个:docker rmi -f 镜像名[:TAG](或镜像ID)
(-f为强制删除)
删除多个:docker rmi -f 镜像名1[:TAG] 镜像名2[:TAG]
删除全部:docker rmi -f $(docker images -qa)
3. 容器命令
有镜像才能创建容器! 这里
docker pull centos
下载一个centos用于练习命令。
-
docker run [OPTIONS] image [COMMAND] [ARG...]
新建并启动容器
run的执行步骤:
先在本地找运行的镜像,如果没有,就下载镜像再运行。
例:docker run -it 470671670cac(镜像ID,也可写镜像名)
//新建并运行一个centos容器,一运行就进入新建的centos中。
OPTIONS:
–name=“容器新名字”:为容器指定一个名称
-d:后台运行容器,并返回容器ID,即启动守护式容器
-i:以交互模式运行容器,通常与-t同时使用
-t:为容器重新分配一个伪输入终端,通常与-i同时使用
-v:容器数据卷
-P:随机端口映射
-p:指定端口映射,有4种:
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort -
docker ps [OPTIONS]
列出当前所有正在运行的容器
OPTIONS:
-a:列出当前所有正在运行的容器+历史上运行过的
-l:显示最近创建的容器
-nxx
:显示最近n个创建的容器
-q:静默模式,只显示容器编号
–no-trunc:不截断输出 -
exit
容器停止退出(或ctrl+P+Q 容器不停止退出) -
docker start 容器ID(或容器名)
启动容器 -
docker restart 容器ID(或容器名)
重启容器 -
docker stop 容器ID(或容器名)
停止容器 -
docker kill 容器ID(或容器名)
强制停止容器 -
docker rm 容器ID(或容器名)
删除已停止的容器
删除所有已停止的容器:docker container prune
删除全部容器:docker rm -f $(docker ps -qa)
重要
-
docker run -it 容器名
启动交互式容器(前台) -
docker run -d 容器名
启动守护式容器(后台) -
docker logs [OPTIONS] 容器ID
查看容器日志
OPTIONS:
-t:显示每条日志的时间
-f:不停的追加
–tailxx
:只列出末尾n条的日志 -
docker top 容器ID
查看容器内运行的进程 -
docker inspect 容器ID
查看容器内部细节 -
进入正在运行的容器并以命令行交互
docker exec -it 容器ID bashShell
直接让容器运行命令,不进入容器
docker exec -it 容器ID /bin/bash
可进入容器
docker attach 容器ID
重新进入容器
-
docker cp 容器ID:容器内路径 目的主机路径
将容器内的文件拷贝到主机上
Docker的镜像
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容包括代码、运行时、库、环境变量和配置文件。
1. UnionFS(联合文件系统)
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
2. Docker镜像加载原理
镜像的特点:Docker镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作“容器层”,容器层”之下的都叫“镜像层”。
镜像的commit操作
docker commit
提交容器副本,使其成为一个新的镜像。
docker commit -a "作者名" -m "镜像的描述信息" 容器ID 新建的镜像名:版本号 "
练习commit操作的小案例:
新建一个tomcat的容器,把容器的tomcat主页Documentation对应的网页删了,然后做成一个镜像。
-
docker run -it -p 8888:8080 tomcat
运行tomcat。(-p是指定端口,8888是对外暴露的端口,对应docker里tomcat的8080端口,可以任意)(-P是随机端口,例docker run -it -P tomcat
,然后需要docker ps查看随机生成的端口) -
然后在虚拟机的centos中打开浏览器,输入localhost:8888。(或者在自己电脑输入虚拟机centos的ip加端口号)
-
如果出现404错误,ctrl+P+Q不停止退出tomcat,然后输入
docker exec -it tomcat容器的ID /bin/bash
进入tomcat。(容器ID用docker ps
查)
-
ls -l
查看,发现有webapps和webapps.dist。
-
分别进入这两个目录,发现webapps是空的,而webapps.dist里面的东西本是webapps的。
-
rmdir webapps
删除webapps,mv webapps.dist webapps
把webapps.dist改名为webapps。(先不退出tomcat,然后需要进tomcat) -
然后重新输入网址就可以访问了。
-
在tomcat里面,我们要实现案例,把tomcat的文档页面删了,
cd webapps
进入webapps目录,然后rm -rf docs
删除tomcat的文档目录。 -
然后刷新页面,点击tomcat主页的Documentation,显示404,实现了我们案例的要求。(如果之前已经点击了Documentation,不是显示404,请先清理缓存)
-
我们接下来要把这个tomcat做成一个镜像。打开一个新的终端,输入
docker commit -a "angenin" -m "tomcat without docs" 容器ID angenin/mytomcat:1.1"
。(angenin/tomcat为新建的镜像名,冒号后面:1.1为版本号,可任意,-a "xxx"是加作者,-m "xxx"是镜像介绍,) -
docker images
本地就有了我们自己建的镜像。
-
先删除所有容器
docker rm -f $(docker ps -qa)
,然后新建我们的tomcat镜像容器docker run -it -p 7777:8080 angenin/mytomcat:1.1
。(因为版本号不是latest,所以需要加上版本号,端口改为7777和前面的做区别) -
先清理缓存,然后在浏览器输入网站后,点击Documentation,显示404。
Docker容器的数据卷(如同共享文件夹)
容器的持久化、容器间继承+数据共享
数据卷在容器内添加的做法:
1. 命令添加:
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
数据卷,宿主机和容器都可读写。(-v如果没有此目录,此命令会新建目录,如果宿主机上有此目录,文件会和容器共同使用,而如果容器有此目录,会删掉原来的目录然后再新建,原本里面的内容会被清空,而宿主机不会)
例:docker run -it -v /myDataVolume:/dataVoluContainer 镜像名
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
数据卷,宿主机可读写,容器可读不可写。
例:docker run -it -v /myDataVolume:/dataVoluContainer:ro 镜像名
2. DockerFile添加:
在宿主机根目录上新建一个mydocker目录,在目录里新建一个Dockerfile文件并写入:
# volume test
FROM centos
VOLUME ["dataVolumeContainer1","dataVolumeContainer2"]
CMD echo "finished, ==========success1"
CMD /bin/bash
然后build后生成镜像docker build -f /mydocker/Dockerfile -t angenin/centos .
(最后的.表示当前目录下,如果此时所在目录的Dockerfile文件名为Dockerfile,-f /mydocker/Dockerfile 可省略不写)
新建新镜像容器后,容器根目录多出两个dataVolumeContainer目录的数据卷(可读写)。
docker inspect 容器ID
查看宿主机对应的目录,直接复制然后cd进入。
数据卷容器
容器间的配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
docker run -it --name dc01 angenin/centos
创建父容器dc01
docker run -it --name dc02 --volumes-from dc01 angenin/centos
创建子容器dc02和dc03挂载到父容器dc01上。
- 宿主机的/var/lib/docker/volumes目录里,没有子容器的目录,只有父容器的目录,子容器共用父容器的目录,子容器继承父容器,同时父子数据共享。
- 删除dc01,dc02修改后dc03可以访问。
- 删除dc02后dc03可以访问。
- 新建dc04继承dc03后再删除dc03,dc04可以访问。
Dockerfile
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
Dockerfile内容基础知识
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
Docker执行Dockerfile的大致流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似 docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 执行dockerfile中的下一条指令直到所有指令都执行完成
Dockerfile、Docker镜像和Docker容器之间的关系
保留字指令
FROM
:基础镜像,当前镜像是基于哪个镜像的MAINTAINER
:镜像维护者的姓名和邮箱RUN
:容器构建时需要运行的命令EXPOSE
:当前容器对外暴露的端口号WORKDIR
:指定在创建容器后,终端默认登陆进来的工作目录,一个落脚点ENV
:用来在构建镜像过程中设置环境变量ADD
:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包COPY
:类似ADD,拷贝文件和目录到镜像中,将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置VOLUME
:容器数据卷,用于数据的保存和持久化工作CMD
:指定一个容器启动时要运行的命令,Dockerfile中可以有多个CMD命令,但只有最后一个生效,CMD会被docker run之后的参数替换ENTRYPOINT
:指定一个容器启动时要运行的命令,ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数,不同的是CMD会被覆盖,而ENTRYPOINT是追加ONBUILD
:当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
案例一:
自定义mycentos镜像,使其具备:
登陆后的默认路径为:/usr/local
支持vim编辑
支持ifconfig命令
- 在根目录下的mydocker目录里新建Dockerfile2文件并写入
FROM centos
MAINTAINER angenin<angenin@xxx.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "success------------ok"
CMD /bin/bash
2.build成镜像docker build -f /mydocker/Dockerfile -t mycentos:1.2 .
出现这东西不要慌,继续等。
build镜像成功
- 运行mycentos1.2
docker run -it mycentos:1.2
,需要的功能已实现。
docker history 镜像id
列出镜像的变更历史
案例二(综合案例):
制作自定义tomcat8,然后在宿主机上用数据卷将测试的web服务test发布。
-
创建目录
mkdir -p /angenin/mydockerfile/tomcat8
并在此目录下新建Dockerfile和c.txt文件。 -
将jdk和tomcat安装的压缩包拷贝进tomcat8目录(jdk-8u251-linux-x64.tar.gz和apache-tomcat-8.5.54.tar.gz)
链接:https://pan.baidu.com/s/1T59z6BEecZRj004TIIi0Kg 密码:71sm
-
在Dockerfile中写入
FROM centos
MAINTAINER angenin<angenin@xxx.com>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local路径下
COPY c.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u251-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.54.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $SMYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_251
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.54
ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.54
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行 tomcat
#第一种写法
# ENTRYPOINT ["/usr/local/apache-tomcat-8.5.54/bin/startup.sh"]
#第二种写法
# CMD ["/usr/local/apache-tomcat-8.5.54/bin/catalina. sh","run"]
#第三种写法
CMD /usr/local/apache-tomcat-8.5.54/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.54/bin/logs/catalina.out
-
docker build -t angenintomcat8 .
(所在目录下有Dockerfile文件,省略-f Dockerfile)
中途出现这个错误:
或
解决办法:
CentOS7请输入:wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
-
然后输入:
docker run -d -p 9080:8080 --name myt8 -v /angenin/mydockerfile/tomcat8/test:/usr/local/apache-tomcat-8.5.54/webapps/test -v /angenin/mydockerfile/tomcat8/tomcat8logs:/usr/local/apache-tomcat-8.5.54/logs --privileged=true angenintomcat8
-d为后台运行,-p为指定端口,-v设置两个数据卷, --privileged=true赋予扩展权限 -
然后输入网站加端口号
(tomcat8没两个webapps目录,所以不用像tomcat9一样要先删除一个才能运行)
-
进入宿主机的tomcat8/test目录,然后创建WEB-INF目录并在里面新建web.xml。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<display-name>Tomcat Manager Application</display-name>
</web-app><?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<display-name>Tomcat Manager Application</display-name>
</web-app>
- 返回test目录,新建a.jsp文件。
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
-----------welcome-----------
<%="i am in docker tomcat self"%>
<br>
<br>
<%System.out.println("=========docker tomcat self");%>
</body>
</html>
- 重启容器
docker restart 容器id
,访问a.jsp页面。(重启是因为写了配置文件web.xml,如果只改页面不用重启,直接刷新页面即可)
- 在进入宿主机的tomcat8/tomcat8logs目录,
cat catalina.out
查看tomcat8容器的日志。
总结
在centos7里用docker安装mysql
-
安装mysql8:
docker pull mysql:8.0.18
安装mysql5.6:docker pull mysql:5.6
-
运行mysql5.6容器:
docker run -p 12345:3306 --name mysql -v /angenin/mysql/conf:/etc/mysql/conf.d -v /angenin/mysql/logs:/logs -v /angenin/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
-p为设置端口,–name为容器命名,-e MYSQL_ROOT_PASSWORD=123456为设置密码,-v设置数据卷,-d后台运行 -
进入mysql5.6容器:
docker exec -it 容器id /bin/bash
-
进入mysql:
mysql -uroot -p123456
-
插入数据,用于测试
show databases;
create database db01;
use db01;
create table t_book(
id int not null primary key,
bookName varchar(20));
show tables;
insert into t_book values(1, 'java');
select * from t_book;
- 让macOS连接centos7里的docker内的mysql容器。
centos如果没开防火墙或开开启端口,需要先开启。(CentOS7 关闭和开启防火墙)
打开Navicat Premium,点击连接,选MySQL。
点击SSH,需要先连接到centos。
不点确定,点回常规,写入数据库对应的信息。
- 在本地写入数据,然后在容器中查看。
- 在centos上备份mysql容器里的数据
docker exec mysql容器id sh -c 'exec mysqldump --all-databases -uroot -p"123456"' > /angenin/all_databases.sql
在centos7里用docker安装redis
-
安装redis5.0.5:
docker pull redis:5.0.5
-
因为我们想让redis-server运行我们的redis.conf文件,所以我们需要新建目录
mkdir -p /angenin/myredis/conf
,并在此目录下添加一个redis.conf文件。(链接:redis.conf下载 密码:wurx) -
修改redis.conf文件
把bind 127.0.0.1注释掉
-
运行redis容器:
docker run -p 6379:6379 --name redis -v /angenin/myredis/data:/data -v /angenin/myredis/conf:/usr/local/redis/conf -d redis:5.0.5 redis-server /usr/local/redis/conf/redis.conf --appendonly yes
redis-server启动redis,–appendonly yes 开启AOF -
进入redis:
docker exec -it 已运行的redis容器id redis-cli
-
查看宿主机下容器生成的持久化文件:
cd /angenin/myredis/data
在centos7里用docker安装nginx
- 安装nginx1.16.1:
docker pull nginx:1.16.1
- 在/angenin下新建mynginx目录,然后在下载链接里的conf和html目录,把下载好的两个目录放到mynginx目录下。(因为直接挂载容器本身就有的目录,容器的目录会被清空,所以需要在宿主机准备容器的配置文件和页面文件)
(链接:https://pan.baidu.com/s/1V5cv6-lIz2SAzYpI2237Hw 密码:n2r0) - 运行nginx:
docker run -d -p 80:80 --name nginx -v /angenin/mynginx/conf:/etc/nginx -v /angenin/mynginx/logs:/var/log/nginx -v /angenin/mynginx/pid:/var/run -v /angenin/mynginx/html:/usr/share/nginx/html nginx:1.16.1
宿主机mynginx目录里conf中的nginx.conf和conf.d目录下的default.conf是nginx的配置文件,logs是nginx的日志文件,pid是pid文件,html是nginx的页面文件 - 在浏览器输入centos的ip(可加上冒号80,不加也一样)。
- 在宿主机的html目录下修改nginx容器的主页面。
- nginx简单的实现反向代理到tomcat。运行一个tomcat容器
docker run -d --name tomcat8 -p 8080:8080 -d tomcat:8.5.54
- 在浏览器上输入centos的ip加冒号8080
- 如果出现404错误,是因为tomcat容器里有两个webapps和webapps.dist目录,进入tomcat容器
docker exec -it tomcat容器id /bin/bash
,删除webapps目录,把webapps.dist目录改名为webapps。刷新页面。
- 进入mynginx/conf/conf.d, 修改default.conf文件。
proxy_pass http://10.211.55.17:8080;
(10.211.55.17为centos宿主机的ip)
docker restart nginx
重启nginx容器,然后在浏览器输入centos的ip。
- 查看nginx容器生成的日志和pid文件
docker本地镜像push发布到阿里云镜像仓库的步骤
镜像生成的两种办法:
- 写完Dockerfile之后build生成镜像。
docker build -f Dockerfile文件路径 -t 镜像id .
- 从容器创建一个新的镜像
docker commit -a "作者名" -m "镜像的描述信息" 容器ID 新建的镜像名:版本号 "
生成一个镜像用于上传,这里我们有上面练习的自定义tomcat8镜像来上传。
-
新建镜像仓库
搜索上传的镜像
学习视频:B站尚硅谷阳哥的Docker视频
https://www.bilibili.com/video/BV1Ls411n7mx
转载:https://blog.csdn.net/qq_36903261/article/details/105870268