Docker入门笔记总结
一.Docker概述
docker为什么会出现
一款产品会有开发,测试,上线三种环境,所以要配置不同应用环境和配置,十分麻烦,所以就会出现这个项目在我的电脑能运行但是在其他电脑不能运行的情况,或者是版本更新导致服务不可用了而ducker就能解决这个问题,ducker可以让项目jar包带着java的运行环境jdk,mysql,redis,es…)一起发布,简单说就是项目能带着环境一起发布。
- 传统 : 开发jar,运维来做!
- 现在 : 开发打包部署上线,一套流程做完!
- java – apk --发布(应用商店) ----张三使用apk —安装即可用!
- java .-- jar(环境)----打包项目带上环境(镜像)---- ( Docker仓库:商店)----下载我们发布的镜像—直接运行即可!
Docker给以上的问题,提出了解决方案,就是一种容器化的技术!
二.Docker能做什么
首先需要和虚拟机做一个对比。
虚拟机技术
虚拟机技术缺点∶
- 资源占用十分多
- 冗余步骤多
- 启动很慢!
容器化技术
比较Docker和虚拟机技术的不同:
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
- 每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响。
三.Docker安装
Docker的基本组成
- 镜像( image ) :
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===>run ==> tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。 - 容器( container ) :
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。启动,停止,删除,基本命令!目前就可以把这个容器理解为就是一个简易的linux系统 - 仓库(repository ) :
仓库就是存放镜像的地方!仓库分为公有仓库和私有仓库!
Docker Hub(默认是国外的)
阿里云…都有容器服务器(配置镜像加速!)
安装docker
先用Xshell连接上自己的远程服务器,并输入下列指令。(这个是CentOS8的安装)
1. 下载docker-ce的repo
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
2. 安装依赖
yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm
3. 安装docker-ce
dnf -y install docker-ce docker-ce-cli --nobest
4.启动 docker
systemctl start docker
5.查看 docker 版本信息
docker -v
6.设置开机自动启动
systemctl enable --now docker
CentOS8安装Docker
时间比较长需要等待一会!
四.测试Docker命令
下载hello-world镜像
docker run hello-world
查看本机有的docker镜像
docker images
docker在run完之后做了哪些事情?
docker会先在本机寻找镜像,然后判断本机是否有镜像,如果有这个镜像就使用这个镜像运行,如果没有就会去docker-hub上下载(如果配置了阿里云的镜像加速就回去阿里云的下载),如果在docker-hub仓库上找不到,会返回错误找不到镜像,如果可以找到,就会下载这个镜像到本地并运行。
五.Docker的常用命令
帮助命令
docker version #显示docker的版本信息
docker info #显示docker的系统信息.,包括镜像和容器的数量
docker 命令 --help #万能命令(查看docker的所有命令)
镜像命令
- docker images
查看本机所有镜像
[root@VM-4-7-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 9 months ago 13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
#可选项
docker images -a #列出所有镜像
docker images -q #只显示镜像的id
-
docker search 镜像名称
搜索镜像,例:docker search mysql (搜索mysql的镜像)也可通过收藏数量
来过滤镜像:docker search mysql --filter=STARS=3000 (搜索mysql镜像且收藏数量大于3000) -
docker pull 镜像名称:xx.xx
下载镜像,xx.xx是版本信息,如果不写的话默认就是最新版本 (具体版本可以去官网看)
例:docker pull mysql:5.7 -----> (下载5.7版本的mysql) -
docker rmi -f 镜像id
强制删除镜像(-f是强制的意思), 例: docker rmi -f 镜像id----->(通过镜像id删除) -
docker rmi -f $(docker images -aq)
删除所有的镜像
容器命令
有了镜像才可以创建容器,所以可以从linux上下载一个centos的镜像来测试学习。
- docker pull centos
拉取centos的镜像。(通过镜像创建的容器实际上也是一台小型的服务器,所以他内部也是有自己的端口号的) - docker run 可选参数 image
新建容器并启动
#参数说明
--name="Name" #给容器命名(比如java每个对象都有自己的名称)
-d #以后台方式运行(不挂断)
-it #使用交互方式运行,进入容器查看内容
-p #指定容器的端口(这个是小写的p) -p 8080:8080 (-p 主机端口:容器端口)
-P #随机映射端口(不用写具体端口映射)
#测试,启动并进入容器
[root@VM-4-7-centos ~]# docker run -it centos /bin/bash
[root@09408741e760 /]# ls #查看容器内的cenntos,基础版本很多命令都是不完善的
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@09408741e760 /]# exit #停止运行并退出容器
exit
[root@VM-4-7-centos ~]#
- docker ps
列出当前正在运行的容器 - docker ps -a
列出当前正在运行的容器+历史运行过的容器 - docker ps -aq
列出当前正在运行的容器+历史运行过的容器的id - docker ps -a -n=1
显示最近创建的容器,n=1就表示只显示一个,可变参数 - Ctrl+P+Q
退出容器,但不停止容器运行 - docker rm 容器id
根据容器id删除容器,正在运行的容器是不能删除的,除非rm后边加上-f进行强制删除 - docker rm -f $(docker ps -aq)
通过参数传递方式递归删除所有容器
启动和停止容器的操作
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
常用的其他命令
- docker run -d centos
后台启动容器
[root@VM-4-7-centos ~]# docker run -d centos
2d6d2d2b4a43853268d586aa26ba4961db73f2d6bf78d012a95ecb64b7b1375f
[root@VM-4-7-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
这里会发现一个问题就是明明启动了centos容器但是他却自己停止了(没有正在运行的centos),这是因为docker容器使用后台运行,就必须要有要一个前台进程,docker发现没有应用,就会自动停止。
- docker log -tf tail [n] 容器id
查看日志,[n]表示显示多少条 - docker top 容器id
查看容器内部的进程信息,想杀死容器内进程可通过这个命令查看进程 - docker inspect 容器id
查看容器的元数据(所有数据信息) - docker top 容器id
更常用
- docker exec -it 容器id /bin/bash
进入当前正在运行的容器(方式一)常用 - docker attach 容器id
进入当前正在运行的容器(方式二)
这两种方式的区别:
docker exec #进入容器后开启一个新的终端,可以在里面操作(常用)
docker attach #进入容器正在执行的终端,不会启动新的进程!
拷贝
- docker cp 容器id:容器内路径 目的的主机路径
从容器内拷贝到主机上
[root@VM-4-7-centos home]# docker exec -it cfca0b940c56 /bin/bash #进入容器目录
[root@cfca0b940c56 /]# cd /home #进入容器home目录
[root@cfca0b940c56 home]# ls #home目录下没有文件
[root@cfca0b940c56 home]# touch test.java #创建文件夹
[root@cfca0b940c56 home]# ls
test.java #有文件了
[root@cfca0b940c56 home]# exit
exit #退出并停止运行(但是数据是还在的)
[root@VM-4-7-centos home]# docker ps #查看正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cfca0b940c56 centos "/bin/bash" 53 minutes ago Up 53 minutes stoic_hawking
[root@VM-4-7-centos home]# docker cp cfca0b940c56:/home/test.java /home #拷贝文件
[root@VM-4-7-centos home]# ls #主机查看文件
test.java
六.部署一些应用容器
部署Nginx
- docker run -d --name nginx01 -p 9000:80 nginx
-d: 后台运行
–name: 给容器命名
-p :宿主机端口:容器内部端口
这里需要注意本机的服务器一定要开放9000的这个端口才行,而容器内部实际上也是一个小型的Linux系统默认是80端口的,所以 -p 9000:80 的意思就是将容器的80端口与本机的9000端口进行绑定,我们直接访问本机的9000端口就可以访问容器的80端口了。
[root@VM-4-7-centos ~]# docker pull nginx #下载nginx镜像
[root@VM-4-7-centos ~]# docker images #查看下载的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 55f4b40fe486 27 hours ago 142MB
[root@VM-4-7-centos ~]# docker run -d --name nginx01 -p 9000:80 nginx #启动容器
4762c5c6c302223ad678a472c313c5e03a153990273f6697f1b9dea3139cbad5 #出现这个表示运行成功
[root@VM-4-7-centos ~]# docker ps #查看正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4762c5c6c302 nginx "/docker-entrypoint.…" 6 seconds ago Up 4 seconds 0.0.0.0:9000->80/tcp, :::9000->80/tcp nginx01
[root@VM-4-7-centos ~]# curl localhost:9000 #访问本机9000的端口
[root@VM-4-7-centos ~]# docker exec -it nginx01 /bin/bash #进入容器
root@4762c5c6c302:/# ls #查看容器里的文件
这个时候也可以通过公网ip访问这个端口了。
部署Tomcat
- docker run -it -p 9002:8080 tomcat
下载tomcat镜像并以交互模式启动。(9002是本地端口)
然后重新开启一个终端
[root@VM-4-7-centos ~]# docker ps #查看正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8fb51866aae0 tomcat "catalina.sh run" 19 seconds ago Up 18 seconds 0.0.0.0:9002->8080/tcp, :::9002->8080/tcp gifted_agnesi
[root@VM-4-7-centos ~]# docker exec -it 8fb51866aae0 /bin/bash #进入容器
root@8fb51866aae0:/usr/local/tomcat# cp -r webapps.dist/* webapps #将webapps.dist下的所有文件拷贝到webapps下
#这是因为官方的镜像webapps下是没有东西的所以是打不开tomcat的首页的,所以我们需要将首页文件信息拷贝进去。
通过公网ip访问这个端口。
七.Commit镜像
可以把自己本地的容器制作成一个镜像,这样就每次就可以运行自己想要的镜像版本,思想和git相似。
具体命令:
docker commit -a=“作者名称” -m=“提交的信息” 容器id 形成的镜像名称:形成的版本信息
例:
[root@VM-4-7-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8fb51866aae0 tomcat "catalina.sh run" About an hour ago Up About an hour 0.0.0.0:9002->8080/tcp, :::9002->8080/tcp gifted_agnesi
[root@VM-4-7-centos ~]# docker commit -a="cjy" -m="add webapps app" 8fb51866aae0 tomcat02:1.0
sha256:fb86e87fc9d06292819394594f375cdf801670e01406832ad9d47a9985f5caf0 #成功生成镜像
[root@VM-4-7-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat02 1.0 fb86e87fc9d0 41 seconds ago 485MB #多了的5M就是复制到webapps下的文件
tomcat latest 4813a0e5f815 13 days ago 480MB
八.容器数据卷
每个应用肯定都是有数据的,那数据如果都保存在容器中,那如果容器被删除了数据也就丢失了,显然这是不合理的,所以就有了容器数据卷,使容器与本地之间有一个数据共享的技术,将docker容器中产生的数据,同步到本地!(容器目录挂载到本机目录下),也可以理解为双向绑定,而容器与容器之间也是能进行数据共享的。
1.使用数据卷挂载(方式一)
一.指定本机路径挂载(本质上是匿名挂载)
例:
- docker run -it -v /home/test:/home centos /bin/bash
启动并将容器内/home路径下的文件挂载到本机的/home/test路径下
-v 本机路径:容器路径
挂载完后可以通过命令 :docker inspect 容器id 查看具体情况。(不要在容器里查看,因为容器里没有容器)
这样的话这两个路径之间的文件就会进行同步了,还有另一个很大的好处就是如果我们想要修改容器内的某些文件,我们只需要在本地修改容器内就会自动同步(比如容器内的一些配置文件)。
二.不指定本机路径挂载
这个挂载方式生成的文件会在本机的 /var/lib/docker/volumes/xxxxx(挂载名)/_data 路径下
匿名挂载:
例:
docker run -d -P --name nginx1 -v /ect/nginx nginx
docker run 启动方式 端口映射 --name 容器名称 -v 容器需要挂载的路径 镜像名称
-P 随机端口映射
-v 容器内路径
[root@VM-4-7-centos ~]# docker run -d -P --name nginx1 -v /ect/nginx nginx #启动并进行匿名挂载
29aaf183f267add3d789d7e9afc19453a05ae69a1529ce3e37515bcb8ed4990a
[root@VM-4-7-centos ~]# docker volume ls #查看所有数据卷的情况
DRIVER VOLUME NAME
local 402a6f662feddc6be4442d4ea9dd2e75fdb5aad9dee37c2a7f4749b50776ca73 #后面这串就是具体的名称
具名挂载:
例:
docker run -d -P --name nginx2 -v my-nginx:/etc/nginx nginx
my-nginx就是挂载名
[root@VM-4-7-centos ~]# docker run -d -P --name nginx2 -v my-nginx:/etc/nginx nginx
8a5dea0a9c65b20dc4352c7d71c753d2f5f7e0a9191ad50166cb687a36a13031
[root@VM-4-7-centos ~]# docker volume ls
DRIVER VOLUME NAME
local 402a6f662feddc6be4442d4ea9dd2e75fdb5aad9dee37c2a7f4749b50776ca73
local my-nginx #可以看到挂载名的情况
通过具名挂载方便我们找到一个卷,所以大多数情况下还是使用具名挂载
拓展
给挂载出来的容器里的文件配置权限
ro ---->readonly #容器内文件只读
rw ---->readwrite #容器内文件可读可写(默认)
docker run -d -P --name nginx2 -v my-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx2 -v my-nginx:/etc/nginx:rw nginx
一旦这个了设置了容器权限,容器对我们挂载出来的内容就有限定了!
2.使用数据卷挂载(方式二)
通过Dockerfile构建
Dockerfile就是用来构建docker镜像的构建文件,其实就是一段命令脚本!
通过这个脚本可以生成镜像,镜像是一层一层的就是脚本一个个的命令,每个命令都是一层!我们可以在创建镜像的时候就进行挂载。
制作镜像初体验:
[root@VM-4-7-centos home]# mkdir docker-test-volume #创建docker-test-volume
[root@VM-4-7-centos home]# cd docker-test-volume #进入文件夹
[root@VM-4-7-centos home]# vim dockerfile1 #编辑dockerfile1文件内容(制作脚本)
[root@VM-4-7-centos docker-test-volume]# cat dockerfile1 #查看dockerfile1文件内容
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
[root@VM-4-7-centos docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t cjycentos:1.0 . #通过脚本制作镜像(最后面有个.)
[root@VM-4-7-centos docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cjycentos 1.0 8d8425552ab9 14 minutes ago 231MB
VOLUME [“volume01”,“volume02”]这个命令是匿名挂载的。
启动自己写的镜像
[root@VM-4-7-centos docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cjycentos 1.0 8d8425552ab9 18 minutes ago 231MB
[root@VM-4-7-centos docker-test-volume]# docker run -it 8d8425552ab9 /bin/bash
[root@d1e86e1ca34c /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 360 Jun 27 08:15 dev
drwxr-xr-x 1 root root 4096 Jun 27 08:15 etc
drwxr-xr-x 2 root root 4096 Nov 3 2020 home
lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------ 2 root root 4096 Sep 15 2021 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 2020 media
drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
dr-xr-xr-x 115 root root 0 Jun 27 08:15 proc
dr-xr-x--- 2 root root 4096 Sep 15 2021 root
drwxr-xr-x 11 root root 4096 Sep 15 2021 run
lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
dr-xr-xr-x 13 root root 0 Jun 27 08:15 sys
drwxrwxrwt 7 root root 4096 Sep 15 2021 tmp
drwxr-xr-x 12 root root 4096 Sep 15 2021 usr
drwxr-xr-x 20 root root 4096 Sep 15 2021 var
drwxr-xr-x 2 root root 4096 Jun 27 08:15 volume01 #可以看到刚刚挂载的数据卷在这里
drwxr-xr-x 2 root root 4096 Jun 27 08:15 volume02 #可以看到刚刚挂载的数据卷在这里
而这两个数据卷会对应挂载在本机的 /var/lib/docker/volumes/xxxxx(挂载名)/_data 路径下。(可以使用docker inspect 容器id 来查看对应Mounts下面的挂载路径)
假设我们构建镜像的时候没有挂载卷,就需要手动挂载 -v 卷名:容器内路径 。
九.DockerFile
简介
dockerfile 是用来构建docker镜像的文件,是一个命令参数脚本!
构建步骤:
- 编写一个docker文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push
发布镜像(DockerHub,阿里云镜像仓库)
构建过程
基础知识
- 每个保留关键字(指令)都是必须是大写字母
- 执行从上到下顺序执行
- #表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交 !!!
以后要发布项目就需要自己制作镜像,编写dockerfile文件。
常用指令说明
命令 | 说明 | 示例 |
---|---|---|
FROM | 指定基础镜镜像,一切从这里开始构建 | FROM centos |
MAINTAINER | 镜像是谁写的,通常是姓名+邮箱(过时了) | MAINTAINER [email protected] |
LABEL | 替代MAINTAINER一样不过可以设置多条 | LABEL maintainer=“[email protected]” |
RUN | 镜像构建的时候需要运行的命令 | RUN yum install -y wget |
ADD | 增加文件,会自动解压(mysql,redis,jdk…) | ADD python.tar.gz /usr/local/ |
WORKDIR | 设置当前镜像的工作目录 | WORKDIR /usr/local/python/ |
VOLUME | 挂载的目录(数据卷名称) | VOLUME [“volume01”,“volume02”] |
EXPOSE | 仅暴露容器的端口,在使用docker run的时候仍然需要继续使用-p进行端口映射 | EXPOSE 80 |
CMD | 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 | CMD /bin/bash |
ENTRYPOINT | 指定这个容器启动的时候要运行的命令,可以追加命令 | ENTRYPOINT cd /opt ENTRYPOINT /bin/bash |
ONBUILD | 当构建一个被继承DockerFile,这个时候就会运行ONBUILD的指令 | |
COPY | 类似ADD,将我们文件拷贝到镜像中 | |
ENV | 构建的时候设置环境变量 | ENV JAVA_HOME /usr/local/jdk_1.8/ |
十.制作Tomcat镜像
1.先创建tomcat文件夹,接下来都在这个文件夹里操作。
[root@VM-4-7-centos home]# mkdir tomcat
[root@VM-4-7-centos home]# ls
tomcat
[root@VM-4-7-centos home]# cd tomcat
2.然后通过ftp工具将jdk和tomcat的压缩文件拷贝到这个文件夹
tomcat8和jdk8的压缩包连接
链接:https://pan.baidu.com/s/1IO-_RAlpLHFWA-D1UYuKsA?pwd=yxke
提取码:yxke
[root@VM-4-7-centos tomcat]# ls
apache-tomcat-9.0.64.tar.gz jdk-8-linux-x64.tar.gz
3.编写Dockerfile文件 (官方命名Dockerfile, build 会自动寻找这个文件,就不需要-f指定了)
[root@VM-4-7-centos tomcat]# vim Dockerfile
[root@VM-4-7-centos tomcat]# cat Dockerfile
FROM centos
MAINTAINER cjy<13737xxxxx@qq.com>
ADD jdk-8-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.64.tar.gz /usr/local/
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.64
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.64
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.64/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.64/bin/logs/catalina.out
4.使用该Dockerfile构建镜像
[root@VM-4-7-centos tomcat]# docker build -t diytomcat:1.0 .
5.启动生成的镜像,构建Tomcat容器.
这里设置了数据卷,宿主机的/home/tomcat/test对应该容器的/usr/local/apache-tomcat-9.0.64/webapps/test。这样关于test项目的修复只需要在宿主机上修改就可以了,不需要进入到容器中修改。
docker run -d -p 9003:8080 --name diytomcat -v /home/tomcat/test:/usr/local/apache-tomcat-9.0.64/webapps/test diytomcat:1.0
6.在/home/tomcat/test的目录下,新建index.html 测试Tomcat是否能正常使用。
因为设置了卷挂载所以可以直接在宿主机中进行操作。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>这是个标题</title>
</head>
<body>
<h1>这是一个一个简单的HTML</h1>
<p>Hello World!</p>
</body>
</html>
7.访问测试,浏览器访问查看是否能正常访问
十一.发布镜像到DockerHub
登录到自己的dockerHub
[root@VM-4-7-centos tomcat]# docker login -u yxkcjy
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
然后需要重新生成一个镜像,才能发布,因为push的时候,镜像名前面需要加上用户名(yxkcjy是我的用户名。如果用户名不是当前登录用户则会拒绝push请求),所以需要使用命令 docker tag 镜像名 新的镜像名 复制出一份镜像重新打个Tag。
[root@VM-4-7-centos tomcat]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
diytomcat 1.0 e8a23e9094d7 37 minutes ago 609MB
[root@VM-4-7-centos tomcat]# docker tag e8a23e9094d7 yxkcjy/diytomcat01:1.0
[root@VM-4-7-centos tomcat]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
diytomcat 1.0 e8a23e9094d7 38 minutes ago 609MB
yxkcjy/diytomcat01 1.0 e8a23e9094d7 38 minutes ago 609MB
[root@VM-4-7-centos tomcat]# docker push yxkcjy/diytomcat01:1.0 #发布镜像