知识点5---如何做一个自己的Docker镜像
Docker的重启是秒级的,比其他大部分虚拟化软件快,它的原因有两点
1、docker有着比虚拟机更少的抽象层。由于docker不需要实现硬件资源虚拟化,运行在docker容器上的程序直接使用实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
2、docker利用的是宿主机的内核,因此新建一个容器时,docker不需要和虚拟机一样,重新加载操作系统内核,从而避免启动时的引寻、加载操作系统内核等等,这类比较费时费资源的过程。而当新建一个虚拟机时,虚拟机软件需要加载GuestOS,返个新建过程是分钟级别的,因此新建一个docker容器只需要几秒钟
镜像(ISO),本身是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,包括系统内核、代码、运行时库、环境变量和配置文件等。但是docker镜像中没有系统内核,用的是UnionFS(联合文件系统),也叫Union文件系统,是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交的方式,把文件系统一层层的叠加,同时将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。正是有它作为Docker镜像的基础,从而使得Docker镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像,下载镜像时同样也是如此
知道了docker镜像的生成原理,再了解一下docker镜像的加载原理。传统系统启动时,第一个加载是bootfs(boot file system),主要包含bootloader和kernel,bootloader目的是引导并加载kernel(内核),当boot加载完成之后整个内核就都在内存中了,并且内存的使用权已由bootfs转交给内核,内核会反过来去卸载bootfs。第二个是rootfs (root file system),在bootfs之上,包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件,说白了rootfs其实就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。当这两个东西都加载完成后,系统也就可以正常操作了
docker镜像,没有系统内核,也就是没有bootfs,当你的物理机或虚拟机(宿主机)开机时,加载 bootfs(引导文件系统),它包含引导加载器和内核,完成内核的启动并常驻内存。Docker 容器直接共享并使用了这个已经在内存中运行的宿主机内核(如 /boot 目录下的 vmlinuz)。通过docker镜像启动容器时,实际发生的是 Docker 会将镜像中的 rootfs 以及之上的所有只读层,与一个可写的容器层进行联合挂载,形成一个完整的文件系统视图。随后,容器内的进程(如应用服务)被启动。当这些进程需要操作系统功能(如读写文件、分配内存)时,它们会通过系统调用直接与宿主机内核通信。简而言之,Docker 镜像提供了运行应用所需的用户空间依赖(rootfs),而容器的启动仅仅是运行这些应用进程,无需加载新内核,因此实现了秒级的启动速度和极低的资源消耗。
全面docker命令知识点中镜像有两个ID,没印象的用 ps 命令看一下,其中 Image ID是在下载每一层时的一个本地ID,最终我们用 ps 命令看到的就是最终层的 Image ID,而 Digest ID是你要下载的这个镜像,完整的ID,这个ID在docker的镜像生态圈里全网唯一
还要知道两个概念词,首先docker的镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层就是我们操作的容器,官方叫“容器层”,下面的都叫“镜像层”
上面我们说了一堆理论,主要是让大家知道镜像的概念,不要学空中楼阁的技术,现在我们说怎么自己做一个镜像,把自己的环境打镜像包。同时介绍-P和-p的用法,-p是自定义指定容器端口映射,-P是容器会把内部的端口随机映射给宿主机的任意端口,以tomcat为基础镜像,没有的先下载一个。
docker pull tomcat
首先要知道一个概念,打包自己的环境镜像原理是把某一个已有的镜像做基础镜像,在其实例化的容器上做修改,并以此为模板打包为镜像。在操作上和git很类似,也是用commit和push命令
第一步我们需要一个tomcat的容器,并且把端口映射到宿主机上,使用的参数为-p 宿主机端口:docker容器端口,如果你需要映射多个端口,你就需要添加多个-p,或者去修改配置文件,配置文件的位置下面会提到,但是一版都是用命令参数
docker run -it -p 8888:8080 tomcat
或者
docker run -it -P tomcat

因为我们是交互式创建了一个容器,所以会保持启动,并开始运行tomcat,此时我们用外部电脑的浏览器访问宿主机的端口,看一下是否能访问tomcat。可以拿到响应结果,而不是访问不到就行,下载的docker镜像通常没有默认的ROOT-webapp

如果你用的是老版本docker很可能映射没有效果,问题出在docke在创建容器的时候,容器的网卡用的docker自己的默认模式,也叫Bridge模式,老版本该模式下不会自己去向宿主机申请ip并生成虚拟网卡,而是直接跳过这个过程,只创建一块lo的回环网卡,这就导致在宿主机上能够知道有该容器的存在,但是其他终端访问容器时就找不到这个容器了
解决老版本这个问题的方法有三个,如果你是正在学习docker,建议你暂时用方法二,在后期使用升至工作中通常用的是方法三
方法一:对于已有的容器,先关闭容器,去你的本地docker root路径里找containers文件夹,在这个文件夹下找到对于容器下的网络配置文件,通常是containers/容器id/hostconfig.json,修改容器的网络模式为host。最后一定要重启docker服务。新版本这个文件位置也没有变
修改网络模式:
"NetworkMode":"host"
如果你后期需要修改容器的端口映射,也可以在该配置文件中找到如下配置
"PortBindings":{
"3306/tcp": [{ //内部端口
"HostIp": "",
"HostPort": "3309" //外部访问端口
}]
}
方法二:通过修改docker的配置文件,可以使得在创建容器的时候,给一个网络IP配置。但要注意docker容器的ip分配默认情况下可选网段是一个定死172.17.X.X/255.255.0.0网段,这是默认的网络策略,由docker服务自身配置决定,由于一般来说容器属于即用即销的东西,所以ip对于一版用户来说意义不大,所以也很少有人去改其他的网段,如果真想改的话也可以,这个后面会提到
宿主机修改docker的配置文件,声明容器可以自动占有的ip资源
{
"bip": "172.17.0.1/16"
}
注意:如果你用的是docker-compose,那就用下面这个配置
{
"default-address-pools": [
{
"base": "172.17.0.1/16",
"size": "255.255.0.0" //显示的写子网掩码
}
]
}
修改完配置后运行下面的三条命令
systemctl restart docker
#所有宿主机删除不再使用的网络 ,不然重建网络后ip不变
docker network prune
#宿主机添加一条linux系统的静态路由ip策略,意思是告诉当前宿主机所处网络内(包括它自己),要想访问docker容器所在某个网段,需要通过谁去转发,192.168.1.200就是使用172.17.0.0/16网络策略的docker容器所在的宿主机
ip route add 172.17.0.0/16 via 192.168.1.200
这里解释一下,为什么后续使用中甚至工作中不使用方法二。在网络中有两个常见的能力防火墙、静态路由。防火墙管谁能访问你,静态路由管你发出的访问下一步到哪里,通俗的讲静态路径的生效权重高于主机所在网络环境的ip跳转策略。且我上面注释也说了,使用静态路由,要所有服务器之间都一起动,这个运维成本是非常大的。而且用静态路径本身也不是专门用来解决老版本这个问题的,只是刚好能解决默认容器没有ip,docker自然也没有告诉服务器如何发现容器而已,新版本这些问题已经解决了就没必要纠结
方法三:自定义docker网络配置,并在创建容器时使用,这个方法本文这里先不讲,留在下一章知识点容器直连里面
随后我们要进入这个容器,进入的时候注意必须使用exec,我前面在介绍容器命令的时候,关于如何进入一个已启动容器的命令,我介绍了两个,exec和attach,也提到它们两个的区别,在本例中,容器中运行着前台tomcat,如果你使用attach则进入之后你会发现没有任何输出,其实不是没有任何输出,只是连接到了本身有的前台tomcat会话,只是你不访问所以现在这个会话进程没有INFO那些输出,所以你需要用exec 以一个全新的会话登录进去
下图就是本文专程新建了另一个容器,用attach进去的结果,没有任何的输出,只是保持tomcat的会话,ctrl+c强制退出,看输出可以证实前面知识点说的容器本身的进程会被关闭退出
抛开进入命令不说,我们接着案例走,查询容器,确定IP映射没有问题,并进入容器
[root@hdp3 containers] docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0fff686e8de0 tomcat "catalina.sh run" 10 seconds ago Up 9 seconds 0.0.0.0:8888->8080/tcp, :::8888->8080/tcp wizardly_payne
[root@hdp3 containers] docker exec -it 0fff686e8de0 /bin/bash
root@0fff686e8de0:/usr/local/tomcat#
现在删除tomcat中的webapps,确保没有任何东西。这里注意类比你自己实操的时候,进入容器后,就应该做你自己的开发环境了,只是在此本文案例的目的就是做一个没有任何webapp且端口不一样的tomcat镜像
root@0fff686e8de0:/usr/local/tomcat/webapps# pwd
/usr/local/tomcat/webapps
root@0fff686e8de0:/usr/local/tomcat/webapps# ls -l
total 0
接着重点来了,用快捷键Ctrl+P+Q退出,并使用commit生成一个我们自己的镜像,atguigu/是命名空间,工作中随着项目走
[root@hdp3 containers]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0fff686e8de0 tomcat "catalina.sh run" 34 minutes ago Up 34 minutes 0.0.0.0:8888->8080/tcp, :::8888->8080/tcp wizardly_payne
[root@hdp3 containers] docker commit -a="wy" -m="我自己的tomcat" 0fff686e8de0 atguigu/mytomcat:1.2
sha256:4f6fc450f49cbcb4be69d29904104f265d57627c823bbd9381e01c24233aa011
[root@hdp3 containers] docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
atguigu/mytomcat 1.2 4f6fc450f49c 14 seconds ago 680MB
tomcat latest fb5657adc892 11 months ago 680MB
centos latest 5d0da3dc9764 14 months ago 231MB
最后使用自己的镜像,实例化一个容器,确保commit成功,但是你用自己的镜像实例化容器要注意,标签一定要写,因为你不写则定死latest,就会出现下面的问题
[root@hdp3 containers] docker run -it atguigu/mytomcat
Unable to find image 'atguigu/mytomcat:latest' locally
docker: Error response from daemon: pull access denied for atguigu/mytomcat, repository does not exist or may require 'docker login': denied: requested access to the resource is denied.
See 'docker run --help'.
所以如果你的镜像标签不是latest,就要带上,不要以为是随着最新版本变的
这个时候你可以去浏览器访问tomcat了,但是问题有来了我们访问那个端口?8080?8888?

你会发现都访问不到。这是由于commit,不会受容器运行数据的影响!它任然遵守着容器中承载着的服务本身配置,因此你在实例化容器的时候任然需要运行如下命令
docker run -it -p 8888:8080 atguigu/mytomcat:1.2
此时你再去访问就可以了
当然交互式启动,在日后的使用中是不合适的,应该用守护进程,且由于tomcat有前端启动持久化服务的命令,所以不需要我们手动给中断或持久化命令
[root@hdp3 ~] docker run -d -p 8889:8080 atguigu/mytomcat:1.2
d0d498fffdb783741cd9ae95eecf7a25ca5cda7aeac418c3c2cd4022b1fe64b0
[root@hdp3 ~] docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d0d498fffdb7 atguigu/mytomcat:1.2 "catalina.sh run" About a minute ago Up About a minute 0.0.0.0:8889->8080/tcp, :::8889->8080/tcp nervous_driscoll
83579336d8a2 atguigu/mytomcat:1.2 "catalina.sh run" 12 minutes ago Up 12 minutes 0.0.0.0:8888->8080/tcp, :::8888->8080/tcp hardcore_satoshi

此时本文案例到此,问一个问题?后续使用甚至工作中难道都要如此繁琐?拉基础镜像-》实例化容器-》手动处理环境-》commit-》push远程仓库?NO!Docker有一种以描述文件的方式构造镜像的方式叫做DockerFile Build。像上面这种繁琐的手动通常只会出现在开发工程中做测试或者否个特殊的环境需要,其他的一律使用DockerFile Build
首先建议你去github上找一个有DockerFile的项目看看有什么,看不懂没关系,主要是有个映像,这里考虑到有的朋友github慢出天际,或者不知道到哪里找,我就随便找了一个让大家直接看一下。当然我找了一个简洁的,对于DockerFile整体来说肯定不全,但只要知道DockerFile啥样子就行。同样的有时间一定要多看官方的DockerFile,官方仓库地址是https://github.com/dockerfile,这样做的核心意义在于,当你要基于某一个别人的镜像为基础镜像时,dockerfile中可以给你提供很多关键的细节问题,最直接的一个例子就比方说你选择了一个别人开发的webapp,你觉得别开发的不完美,你开发了一个补丁,这个时候问题就来了,你不知道人家怎么启动的,你就要去dockerfile中找
#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
FROM eclipse-temurin:11-jre-jammy
ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME
# let "Tomcat Native" live somewhere isolated
ENV TOMCAT_NATIVE_LIBDIR $CATALINA_HOME/native-jni-lib
ENV LD_LIBRARY_PATH ${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$TOMCAT_NATIVE_LIBDIR
# see https://www.apache.org/dist/tomcat/tomcat-11/KEYS
# see also "versions.sh" (https://github.com/docker-library/tomcat/blob/master/versions.sh)
ENV GPG_KEYS A9C5DF4D22E99998D9875A5110C01C5A2F6059E7
ENV TOMCAT_MAJOR 11
ENV TOMCAT_VERSION 11.0.0-M1
ENV TOMCAT_SHA512 c2d02f2ac1b11122293af7d5ef3cf4dbc1932f19806ba89ea0cd36efcca7701304eef2f3cc03a496fd3a107080a582d3ca3faee207f0bce8b98c266f0a73edc7
COPY --from=tomcat:11.0.0-M1-jdk11-temurin-jammy $CATALINA_HOME $CATALINA_HOME
RUN set -eux; \
apt-get update; \
xargs -rt apt-get install -y --no-install-recommends < "$TOMCAT_NATIVE_LIBDIR/.dependencies.txt"; \
rm -rf /var/lib/apt/lists/*
# verify Tomcat Native is working properly
RUN set -eux; \
nativeLines="$(catalina.sh configtest 2>&1)"; \
nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')"; \
nativeLines="$(echo "$nativeLines" | sort -u)"; \
if ! echo "$nativeLines" | grep -E 'INFO: Loaded( APR based)? Apache Tomcat Native library' >&2; then \
echo >&2 "$nativeLines"; \
exit 1; \
fi
EXPOSE 8080
CMD ["catalina.sh", "run"]
首先要说一下DockerFile的基础知识:
1、每条指令关键字本身都必须大写且一旦使用指令至少要跟随一个参数,就是说不允许存在其他脚本语言那样的不起实际作用的代码
2、整个DockerFile从上到下顺序执行
3、 #表示注释
4、 每条指令都意味着会生成一个新的镜像层
还要知道,一个DockerFile在被用来构建镜像的时候,都发生了什么
1、docker从基础镜像运行一个容器
2、执行一条指令并对容器作出一次修改
3、执行类似docker commit的操作提交一个新的镜像层
4、docker基于刚提交的镜像运行一个新容器,重复第二步
5、依次执行dockerfile中的下一条指令直到所有指令都执行完成,形成最终镜像
现在再来看,DockerFile中的指令有什么用,随便说一下,它官方叫“保留字指令”

FROM:你要生成的镜像,它的基础镜像是谁。MAINTAINER:镜像的作者信息。RUN:针对你生成的镜像需要运行某个命令时使用,值的格式支持shell格式和数组格式(此格式下0位是命令,其他位是参数)。EXPOSE:声明镜像向外暴露的端口。WORKDIR:指定该镜像下所有容器的入口路径,就是连接容器后所在的默认路径。ENV:给镜像设置环境变量。ADD:在构建镜像的时候,将某个包打进镜像中,同时把该包解压。COPY:在构建镜像的时候,将某个包打进镜像中,不会解压,值的格式有shell格式和数组格式两种。VOLUME:设置数据卷默认接口路径,值的格式有shell格式和数组格式两种。CMD 、ENTRYPOINT:设置容器启动后要执行的命令,这两个有各自的用处下面会说ONBUILD:当前你生成的镜像,被作为基础镜像的时候,触发执行。USER:用处不大,基本用不到,作用是限制谁能使用这个DockerFile,但在工作中都是谁写的谁用,不会给其他人。.dockerignore:同样是基本用不到,它是用来设置构建镜像的时候忽略什么东西。
如果大家有兴趣看官方或者其他git上的DockerFile会常常发现,99%的镜像是基于scratch,这个镜像的地位就和Java的Objeck类似,它是一个公认的接近裸内核的Base镜像,但是你想基于它构建镜像,就意味着你要自己准备其他运行所需的所有文件,比如你去看centos的官方DockerFile,你会发现它就是基于scratch镜像,ADD了一个centos-7-docker.tar.xz的包。国内我不推荐你这样用,因为很多tar包国内找不到资源,就算有也要钱的,比较恶心,尽量是找一个接近你目标的基础镜像就行了
上面所属DockerFile的东西就没什么了,下面主要是给大家提供一下案例,更好的理解DockerFile的使用
案例一:构建一个自己的CentOS
FROM centos:7.8.2003
ENV mypath /tmp
WORKDIR $mypath
RUN yum -y install vim net-tools
EXPOSE 80 8080
CMD echo "OK!!!!"
CMD /bin/bash
随后运行 build 命令 ,开始构建
# docker build 构造命令
# -f 是dockerfile的路口 -t 是结果镜像的名称和标签
# 命令最后的 . 意思是基于当前路径作为上下文基础路径,作用是你在dockerfile中写的 COPY 等涉及路径的指令,如果用的是相对路径则都将参考当前路径
[root@hdp3 wy] docker build -f ./mycentos -t mycentos:1.1 .
Sending build context to Docker daemon 36.28MB
Step 1/7 : FROM centos:7.8.2003
7.8.2003: Pulling from library/centos
9b4ebb48de8d: Pull complete
Digest: sha256:8540a199ad51c6b7b51492fa9fee27549fd11b3bb913e888ab2ccf77cbb72cc1
Status: Downloaded newer image for centos:7.8.2003
---> afb6fca791e0
Step 2/7 : ENV mypath /tmp
---> Running in 7e5d5710bc0e
Removing intermediate container 7e5d5710bc0e
---> df69ee9ad5b0
Step 3/7 : WORKDIR $mypath
---> Running in 8f1e4f62c53d
Removing intermediate container 8f1e4f62c53d
---> 58ee7f5e3d8b
Step 4/7 : RUN yum -y install vim net-tools
---> Running in 3082e1dbed8c
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
* base: mirrors.bupt.edu.cn
* extras: mirrors.bupt.edu.cn
* updates: mirrors.bupt.edu.cn
Resolving Dependencies
--> Running transaction check
---> Package net-tools.x86_64 0:2.0-0.25.20131004git.el7 will be installed
---> Package vim-enhanced.x86_64 2:7.4.629-8.el7_9 will be installed
--> Processing Dependency: vim-common = 2:7.4.629-8.el7_9 for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Processing Dependency: which for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Processing Dependency: perl(:MODULE_COMPAT_5.16.3) for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Processing Dependency: libperl.so()(64bit) for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Processing Dependency: libgpm.so.2()(64bit) for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Running transaction check
---> Package gpm-libs.x86_64 0:1.20.7-6.el7 will be installed
---> Package perl.x86_64 4:5.16.3-299.el7_9 will be installed
--> Processing Dependency: perl(Socket) >= 1.3 for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Scalar::Util) >= 1.10 for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl-macros for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(threads::shared) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(threads) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(constant) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Time::Local) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Time::HiRes) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Storable) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Socket) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Scalar::Util) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Pod::Simple::XHTML) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Pod::Simple::Search) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Getopt::Long) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Filter::Util::Call) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Temp) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Spec::Unix) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Spec::Functions) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Spec) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Path) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Exporter) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Cwd) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Carp) for package: 4:perl-5.16.3-299.el7_9.x86_64
---> Package perl-libs.x86_64 4:5.16.3-299.el7_9 will be installed
---> Package vim-common.x86_64 2:7.4.629-8.el7_9 will be installed
--> Processing Dependency: vim-filesystem for package: 2:vim-common-7.4.629-8.el7_9.x86_64
---> Package which.x86_64 0:2.20-7.el7 will be installed
--> Running transaction check
---> Package perl-Carp.noarch 0:1.26-244.el7 will be installed
---> Package perl-Exporter.noarch 0:5.68-3.el7 will be installed
---> Package perl-File-Path.noarch 0:2.09-2.el7 will be installed
---> Package perl-File-Temp.noarch 0:0.23.01-3.el7 will be installed
---> Package perl-Filter.x86_64 0:1.49-3.el7 will be installed
---> Package perl-Getopt-Long.noarch 0:2.40-3.el7 will be installed
--> Processing Dependency: perl(Pod::Usage) >= 1.14 for package: perl-Getopt-Long-2.40-3.el7.noarch
--> Processing Dependency: perl(Text::ParseWords) for package: perl-Getopt-Long-2.40-3.el7.noarch
---> Package perl-PathTools.x86_64 0:3.40-5.el7 will be installed
---> Package perl-Pod-Simple.noarch 1:3.28-4.el7 will be installed
--> Processing Dependency: perl(Pod::Escapes) >= 1.04 for package: 1:perl-Pod-Simple-3.28-4.el7.noarch
--> Processing Dependency: perl(Encode) for package: 1:perl-Pod-Simple-3.28-4.el7.noarch
---> Package perl-Scalar-List-Utils.x86_64 0:1.27-248.el7 will be installed
---> Package perl-Socket.x86_64 0:2.010-5.el7 will be installed
---> Package perl-Storable.x86_64 0:2.45-3.el7 will be installed
---> Package perl-Time-HiRes.x86_64 4:1.9725-3.el7 will be installed
---> Package perl-Time-Local.noarch 0:1.2300-2.el7 will be installed
---> Package perl-constant.noarch 0:1.27-2.el7 will be installed
---> Package perl-macros.x86_64 4:5.16.3-299.el7_9 will be installed
---> Package perl-threads.x86_64 0:1.87-4.el7 will be installed
---> Package perl-threads-shared.x86_64 0:1.43-6.el7 will be installed
---> Package vim-filesystem.x86_64 2:7.4.629-8.el7_9 will be installed
--> Running transaction check
---> Package perl-Encode.x86_64 0:2.51-7.el7 will be installed
---> Package perl-Pod-Escapes.noarch 1:1.04-299.el7_9 will be installed
---> Package perl-Pod-Usage.noarch 0:1.63-3.el7 will be installed
--> Processing Dependency: perl(Pod::Text) >= 3.15 for package: perl-Pod-Usage-1.63-3.el7.noarch
--> Processing Dependency: perl-Pod-Perldoc for package: perl-Pod-Usage-1.63-3.el7.noarch
---> Package perl-Text-ParseWords.noarch 0:3.29-4.el7 will be installed
--> Running transaction check
---> Package perl-Pod-Perldoc.noarch 0:3.20-4.el7 will be installed
--> Processing Dependency: perl(parent) for package: perl-Pod-Perldoc-3.20-4.el7.noarch
--> Processing Dependency: perl(HTTP::Tiny) for package: perl-Pod-Perldoc-3.20-4.el7.noarch
--> Processing Dependency: groff-base for package: perl-Pod-Perldoc-3.20-4.el7.noarch
---> Package perl-podlators.noarch 0:2.5.1-3.el7 will be installed
--> Running transaction check
---> Package groff-base.x86_64 0:1.22.2-8.el7 will be installed
---> Package perl-HTTP-Tiny.noarch 0:0.033-3.el7 will be installed
---> Package perl-parent.noarch 1:0.225-244.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository
Size
================================================================================
Installing:
net-tools x86_64 2.0-0.25.20131004git.el7 base 306 k
vim-enhanced x86_64 2:7.4.629-8.el7_9 updates 1.1 M
Installing for dependencies:
gpm-libs x86_64 1.20.7-6.el7 base 32 k
groff-base x86_64 1.22.2-8.el7 base 942 k
perl x86_64 4:5.16.3-299.el7_9 updates 8.0 M
perl-Carp noarch 1.26-244.el7 base 19 k
perl-Encode x86_64 2.51-7.el7 base 1.5 M
perl-Exporter noarch 5.68-3.el7 base 28 k
perl-File-Path noarch 2.09-2.el7 base 26 k
perl-File-Temp noarch 0.23.01-3.el7 base 56 k
perl-Filter x86_64 1.49-3.el7 base 76 k
perl-Getopt-Long noarch 2.40-3.el7 base 56 k
perl-HTTP-Tiny noarch 0.033-3.el7 base 38 k
perl-PathTools x86_64 3.40-5.el7 base 82 k
perl-Pod-Escapes noarch 1:1.04-299.el7_9 updates 52 k
perl-Pod-Perldoc noarch 3.20-4.el7 base 87 k
perl-Pod-Simple noarch 1:3.28-4.el7 base 216 k
perl-Pod-Usage noarch 1.63-3.el7 base 27 k
perl-Scalar-List-Utils x86_64 1.27-248.el7 base 36 k
perl-Socket x86_64 2.010-5.el7 base 49 k
perl-Storable x86_64 2.45-3.el7 base 77 k
perl-Text-ParseWords noarch 3.29-4.el7 base 14 k
perl-Time-HiRes x86_64 4:1.9725-3.el7 base 45 k
perl-Time-Local noarch 1.2300-2.el7 base 24 k
perl-constant noarch 1.27-2.el7 base 19 k
perl-libs x86_64 4:5.16.3-299.el7_9 updates 690 k
perl-macros x86_64 4:5.16.3-299.el7_9 updates 44 k
perl-parent noarch 1:0.225-244.el7 base 12 k
perl-podlators noarch 2.5.1-3.el7 base 112 k
perl-threads x86_64 1.87-4.el7 base 49 k
perl-threads-shared x86_64 1.43-6.el7 base 39 k
vim-common x86_64 2:7.4.629-8.el7_9 updates 5.9 M
vim-filesystem x86_64 2:7.4.629-8.el7_9 updates 11 k
which x86_64 2.20-7.el7 base 41 k
Transaction Summary
================================================================================
Install 2 Packages (+32 Dependent packages)
Total download size: 20 M
Installed size: 64 M
Downloading packages:
warning: /var/cache/yum/x86_64/7/base/packages/gpm-libs-1.20.7-6.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for gpm-libs-1.20.7-6.el7.x86_64.rpm is not installed
Public key for perl-Pod-Escapes-1.04-299.el7_9.noarch.rpm is not installed
--------------------------------------------------------------------------------
Total 9.4 MB/s | 20 MB 00:02
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
Userid : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
Package : centos-release-7-8.2003.0.el7.centos.x86_64 (@CentOS)
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : gpm-libs-1.20.7-6.el7.x86_64 1/34
Installing : 2:vim-filesystem-7.4.629-8.el7_9.x86_64 2/34
Installing : 2:vim-common-7.4.629-8.el7_9.x86_64 3/34
Installing : which-2.20-7.el7.x86_64 4/34
install-info: No such file or directory for /usr/share/info/which.info.gz
Installing : groff-base-1.22.2-8.el7.x86_64 5/34
Installing : 1:perl-parent-0.225-244.el7.noarch 6/34
Installing : perl-HTTP-Tiny-0.033-3.el7.noarch 7/34
Installing : perl-podlators-2.5.1-3.el7.noarch 8/34
Installing : perl-Pod-Perldoc-3.20-4.el7.noarch 9/34
Installing : 1:perl-Pod-Escapes-1.04-299.el7_9.noarch 10/34
Installing : perl-Encode-2.51-7.el7.x86_64 11/34
Installing : perl-Text-ParseWords-3.29-4.el7.noarch 12/34
Installing : perl-Pod-Usage-1.63-3.el7.noarch 13/34
Installing : 4:perl-macros-5.16.3-299.el7_9.x86_64 14/34
Installing : perl-Storable-2.45-3.el7.x86_64 15/34
Installing : perl-Exporter-5.68-3.el7.noarch 16/34
Installing : perl-constant-1.27-2.el7.noarch 17/34
Installing : perl-Socket-2.010-5.el7.x86_64 18/34
Installing : perl-Time-Local-1.2300-2.el7.noarch 19/34
Installing : perl-Carp-1.26-244.el7.noarch 20/34
Installing : perl-PathTools-3.40-5.el7.x86_64 21/34
Installing : perl-Scalar-List-Utils-1.27-248.el7.x86_64 22/34
Installing : 1:perl-Pod-Simple-3.28-4.el7.noarch 23/34
Installing : perl-File-Temp-0.23.01-3.el7.noarch 24/34
Installing : perl-File-Path-2.09-2.el7.noarch 25/34
Installing : perl-threads-shared-1.43-6.el7.x86_64 26/34
Installing : perl-threads-1.87-4.el7.x86_64 27/34
Installing : 4:perl-Time-HiRes-1.9725-3.el7.x86_64 28/34
Installing : perl-Filter-1.49-3.el7.x86_64 29/34
Installing : 4:perl-libs-5.16.3-299.el7_9.x86_64 30/34
Installing : perl-Getopt-Long-2.40-3.el7.noarch 31/34
Installing : 4:perl-5.16.3-299.el7_9.x86_64 32/34
Installing : 2:vim-enhanced-7.4.629-8.el7_9.x86_64 33/34
Installing : net-tools-2.0-0.25.20131004git.el7.x86_64 34/34
Verifying : perl-HTTP-Tiny-0.033-3.el7.noarch 1/34
Verifying : perl-threads-shared-1.43-6.el7.x86_64 2/34
Verifying : perl-Storable-2.45-3.el7.x86_64 3/34
Verifying : groff-base-1.22.2-8.el7.x86_64 4/34
Verifying : perl-Exporter-5.68-3.el7.noarch 5/34
Verifying : perl-constant-1.27-2.el7.noarch 6/34
Verifying : perl-PathTools-3.40-5.el7.x86_64 7/34
Verifying : 4:perl-macros-5.16.3-299.el7_9.x86_64 8/34
Verifying : 2:vim-enhanced-7.4.629-8.el7_9.x86_64 9/34
Verifying : 1:perl-parent-0.225-244.el7.noarch 10/34
Verifying : perl-Socket-2.010-5.el7.x86_64 11/34
Verifying : which-2.20-7.el7.x86_64 12/34
Verifying : 2:vim-filesystem-7.4.629-8.el7_9.x86_64 13/34
Verifying : perl-File-Temp-0.23.01-3.el7.noarch 14/34
Verifying : net-tools-2.0-0.25.20131004git.el7.x86_64 15/34
Verifying : 1:perl-Pod-Simple-3.28-4.el7.noarch 16/34
Verifying : perl-Time-Local-1.2300-2.el7.noarch 17/34
Verifying : 1:perl-Pod-Escapes-1.04-299.el7_9.noarch 18/34
Verifying : perl-Carp-1.26-244.el7.noarch 19/34
Verifying : 2:vim-common-7.4.629-8.el7_9.x86_64 20/34
Verifying : perl-Scalar-List-Utils-1.27-248.el7.x86_64 21/34
Verifying : perl-Pod-Usage-1.63-3.el7.noarch 22/34
Verifying : perl-Encode-2.51-7.el7.x86_64 23/34
Verifying : perl-Pod-Perldoc-3.20-4.el7.noarch 24/34
Verifying : perl-podlators-2.5.1-3.el7.noarch 25/34
Verifying : 4:perl-5.16.3-299.el7_9.x86_64 26/34
Verifying : perl-File-Path-2.09-2.el7.noarch 27/34
Verifying : perl-threads-1.87-4.el7.x86_64 28/34
Verifying : 4:perl-Time-HiRes-1.9725-3.el7.x86_64 29/34
Verifying : gpm-libs-1.20.7-6.el7.x86_64 30/34
Verifying : perl-Filter-1.49-3.el7.x86_64 31/34
Verifying : perl-Getopt-Long-2.40-3.el7.noarch 32/34
Verifying : perl-Text-ParseWords-3.29-4.el7.noarch 33/34
Verifying : 4:perl-libs-5.16.3-299.el7_9.x86_64 34/34
Installed:
net-tools.x86_64 0:2.0-0.25.20131004git.el7
vim-enhanced.x86_64 2:7.4.629-8.el7_9
Dependency Installed:
gpm-libs.x86_64 0:1.20.7-6.el7
groff-base.x86_64 0:1.22.2-8.el7
perl.x86_64 4:5.16.3-299.el7_9
perl-Carp.noarch 0:1.26-244.el7
perl-Encode.x86_64 0:2.51-7.el7
perl-Exporter.noarch 0:5.68-3.el7
perl-File-Path.noarch 0:2.09-2.el7
perl-File-Temp.noarch 0:0.23.01-3.el7
perl-Filter.x86_64 0:1.49-3.el7
perl-Getopt-Long.noarch 0:2.40-3.el7
perl-HTTP-Tiny.noarch 0:0.033-3.el7
perl-PathTools.x86_64 0:3.40-5.el7
perl-Pod-Escapes.noarch 1:1.04-299.el7_9
perl-Pod-Perldoc.noarch 0:3.20-4.el7
perl-Pod-Simple.noarch 1:3.28-4.el7
perl-Pod-Usage.noarch 0:1.63-3.el7
perl-Scalar-List-Utils.x86_64 0:1.27-248.el7
perl-Socket.x86_64 0:2.010-5.el7
perl-Storable.x86_64 0:2.45-3.el7
perl-Text-ParseWords.noarch 0:3.29-4.el7
perl-Time-HiRes.x86_64 4:1.9725-3.el7
perl-Time-Local.noarch 0:1.2300-2.el7
perl-constant.noarch 0:1.27-2.el7
perl-libs.x86_64 4:5.16.3-299.el7_9
perl-macros.x86_64 4:5.16.3-299.el7_9
perl-parent.noarch 1:0.225-244.el7
perl-podlators.noarch 0:2.5.1-3.el7
perl-threads.x86_64 0:1.87-4.el7
perl-threads-shared.x86_64 0:1.43-6.el7
vim-common.x86_64 2:7.4.629-8.el7_9
vim-filesystem.x86_64 2:7.4.629-8.el7_9
which.x86_64 0:2.20-7.el7
Complete!
Removing intermediate container 3082e1dbed8c
---> 3fa06ced902a
Step 5/7 : EXPOSE 80 8080
---> Running in feddd97d4cf1
Removing intermediate container feddd97d4cf1
---> 30e6aaba5cc8
Step 6/7 : CMD echo "OK!!!!"
---> Running in 3e8aa0c7b50c
Removing intermediate container 3e8aa0c7b50c
---> 287222d0c6d5
Step 7/7 : CMD /bin/bash
---> Running in 01af15ed4714
Removing intermediate container 01af15ed4714
---> e33020478f31
Successfully built e33020478f31
Successfully tagged mycentos:1.1
#构建好后用自己的镜像实例化一个容器
[root@hdp3 wy] docker run -it mycentos
[root@d95fa13e13c4 tmp] ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 6 bytes 508 (508.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
案例二:启动命令关键字的控制
上面说了CMD和ENTRYPOINT都是容器开启时需要运行的命令,定义格式常见是字符串或数组,一般情况下使用那个随着镜像目的而变化,比如一个基本的linuxos镜像,需要运行/bin/bash,目的是打开为终端时用bash解析器调起一个shell会话,而如果是tomcat,则可以直接运行tomcat启动命令。需要重点说明的是,在写dockerfile时,它们各自都可以有多个,但当容器启动时永远只生效最后一个,所以尽量不要无意义的写多个,不生效,且还会生成中间层,写的多了,意味着最终镜像大小也会不一样
以基于 centos 7 做镜像为例
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/centos:centos7.9.2009
当两者共存时,CMD的值将作为ENTRYPOINT的参数拼接在后面,且后续使用该镜像创建容器时,ENTRYPOINT 的命令是始终不变的基础命令,即使动态传入了命令或者参数,都会以 ENTRYPOINT 命令的参数跟在后面
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/centos:centos7.9.2009
ENTRYPOINT ["echo", "Hello"]
CMD ["World"]
[root@node1 wy]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f4a271d0cfd myos:1 "echo Hello World" 12 seconds ago Exited (0) 10 seconds ago peaceful_chatterjee
[root@node1 wy]# docker run -itd myos:1 /bin/bash
2017e2fc946743402787b94a23aa67d898890817e7cc3f17d3601210369fb4bd
[root@node1 wy]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2017e2fc9467 myos:1 "echo Hello /bin/bash" 8 seconds ago Exited (0) 7 seconds ago suspicious_elbakyan
[root@node1 wy]# docker run -itd myos:1 /bin/bash -c echo 123
1b4ec0eba3de13645981b342772783a83cd6e9c71464e7dafd920f25412fe3a0
[root@node1 wy]# docker inspect 1b4ec0eba3de
[
{
"Id": "1b4ec0eba3de13645981b342772783a83cd6e9c71464e7dafd920f25412fe3a0",
"Created": "2026-04-30T03:29:05.538778059Z",
"Path": "echo",
"Args": [
"Hello",
"/bin/bash",
"-c",
"echo",
"123"
],
"State": {
"Status": "exited",
"Running": false,
。。。。。下面的输出省略
当它们单独存在时,ENTRYPOINT 任然是不变的启动基础命令,和共存时没有区别,你可以同时理解为CMD是每次run容器时节省手写命令的作用
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/centos:centos7.9.2009
ENTRYPOINT ["echo", "Hello"]
[root@node1 wy]# docker run -itd myos:2
557b11071a20da7186c058a23dadafa706f7e622adab48e5629197dc38e309ce
[root@node1 wy]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
557b11071a20 myos:2 "echo Hello" 6 seconds ago Exited (0) 5 seconds ago reverent_meitner
[root@node1 wy]# docker run -itd myos:2 /bash --123
3d6a7a0796aabfe2d10756eef42d689c9723e49a437eb6325729653a10f94931
[root@node1 wy]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d6a7a0796aa myos:2 "echo Hello /bash --…" 3 seconds ago Exited (0) 2 seconds ago beautiful_bhaskara
当 CMD 单独存在时,它自身就是完整的命令,而不再是谁的参数列表,一旦你run容器时传入动态命令,则必须是一个完整的命令
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/centos:centos7.9.2009
CMD ["echo", "Hello"]
[root@node1 wy]# docker run -itd myos:3 /bin/bash
0a898e648ba561cf65839cd1cafccff5f03f001f03b8b47ed3553603ed21cc5e
[root@node1 wy]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0a898e648ba5 myos:3 "/bin/bash" 4 seconds ago Up 3 seconds silly_lewin
# 会报错 因为 启动命令残缺
[root@node1 wy]# docker run -itd myos:3 --123
96d5d33c463caa76651a6566a4d289084f04c8909c2fe188078d4f499ee2ba5d
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "--123": executable file not found in $PATH: unknown.
案例三:用ONBUILD 加一些私货
在别人继承我们的镜像时输出一句话
FROM mycurl:2.1
ONBUILD RUN echo "作者真帅"
通过构建日志可以发现并没有特别
[root@hdp3 wy]# docker build -f ./mycurl -t mycurl:3.1 .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM mycurl:2.1
---> ca77d4a27ff0
Step 2/2 : ONBUILD RUN echo "作者真帅"
---> Running in 8473ecef9d28
Removing intermediate container 8473ecef9d28
---> 72a85803bd8c
Successfully built 72a85803bd8c
Successfully tagged mycurl:3.1
但是此时我们在构建一个4.1版本,继承3.1,看一下会发生什么
FROM mycurl:3.1
什么不干就只继承,可以发现会触发基础镜像的ONBUILD
[root@hdp3 wy] docker build -f ./mycurl -t mycurl:4.1 .
Sending build context to Docker daemon 2.048kB
Step 1/1 : FROM mycurl:3.1
# Executing 1 build trigger
---> Running in bc935c5b944c
作者真帅
Removing intermediate container bc935c5b944c
---> a3eb036e1993
Successfully built a3eb036e1993
Successfully tagged mycurl:4.1
案例四:完整的串一遍
FROM centos:7.8.2003
MAINTAINER wy<123456@163.com>
COPY /opt/test.txt /opt
ADD /opt/jdk-8u171-linux-x64.tar.gz /opt
RUN yum install -y vim
ENV MYPATH /opt
WORKDIR $MYPATH
ENV JAVA_HOME /opt/jdk1.8.0_171
NEV CLASSPATH ${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
ENV PATH ${PATH}:${JAVA_HOME}/bin
EXPOSE 8080
CMD source /etc/profile && java -version
案例五:用from分隔多个构建阶段,最终的镜像只包含最后一个form阶段,以及它包含的资源
# 阶段1:构建,命名为 builder
FROM eclipse-temurin:17-jdk AS builder
WORKDIR /app
COPY . .
RUN ./mvnw package -DskipTests
# 阶段2:运行,是一个全新的 FROM,持有jre和上一阶段编译好的jar
FROM eclipse-temurin:17-jre
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
本文到此,省下最后一个关键知识点,Docker本身起到打包环境的核心作用,但你要知道你打包完之后,怎么给别人使用?除了团队内部save、load外,最关键的是把你的镜像发到一个远程的仓库里,给别人下载,并起到一个远程保存的作用。一般情况下远程仓库大多是阿里云,因为除了大厂有docker仓库运维工程师,其他的公司都没有这个人力,所以大多都会发在阿里云上,这也导致你搜索一个镜像的时候,可能会出现很多相似名的镜像。注意,再次强调,这里演示使用阿里云的docker镜像服务,是为了方便日后工作中遇到有个类比的流程,如果你是个人,前面的知识点提到过,非阿里云产品不能正常使用docker镜像加速服务了,甚至你现在上传上去,用阿里云上的公网地址你都搜不到自己的镜像仓库
推送前你先要确保你的镜像已经做好了,这里为了演示我就先做一个
[root@node1 opt]# docker commit -a wy -m "测试推送" 1482581648cb testpush:1.1
sha256:962fc150c7aa4b282ea8d6d05e90edf5bacb2736bb3daec7f1cc9a5f2ed30669
进入阿里云的容器镜像服务控制台:https://cr.console.aliyun.com/cn-hangzhou/instances,随后在阿里云上创建docker仓库,个人用阿里云docker仓库创建个人版的镜像托管服务就行。至于如何配置对应的docker加速器这些,进入平台后有说明,后期你需要找这个管理的话,在阿里云的解决方案里面可能不太好找,在社区和文档里面搜索Docker镜像服务的发布就能在前提条件里面找到这个后台的链接

当你有了个人版镜像托管服务以后,在里面创建仓库


代码源选择本地仓库
然后点击创建
随后在操作指南里面就告诉你怎么做了,国产平台都有完整提示的,整个的操作没啥技术可研
[root@hdp3 wy] docker commit -a wy -m "test push" 47eea52c6b3f testpush:1.1
sha256:ec11fb6e6364187d622866376d5c2306c4727bdc46b9407a0fae4809e5e7e483
[root@hdp3 wy] docker login --username=aliyun8712470109 registry.cn-hangzhou.aliyuncs.com
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
[root@hdp3 wy] docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
testpush 1.1 ec11fb6e6364 35 minutes ago 203MB
tomcat latest fb5657adc892 11 months ago 680MB
centos 7.8.2003 afb6fca791e0 2 years ago 203MB
[root@hdp3 wy] docker tag ec11fb6e6364 registry.cn-hangzhou.aliyuncs.com/wy156/testpush:1.1
[root@hdp3 wy] docker push registry.cn-hangzhou.aliyuncs.com/wy156/testpush:1.1
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/wy156/testpush]
2196ba60ffc6: Pushed
fb82b029bea0: Pushed
1.1: digest: sha256:7acd1f5c65ef4718c5e1a4c92c22ad9761ea34370a9cabd42e0b3405c0a7b126 size: 736
随后你就能在阿里云上看到你的镜像了
同时你本地会多出一个远程镜像
[root@hdp3 wy]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
testpush 1.1 ec11fb6e6364 About an hour ago 203MB
registry.cn-hangzhou.aliyuncs.com/wy156/testpush 1.1 ec11fb6e6364 About an hour ago 203MB
tomcat latest fb5657adc892 11 months ago 680MB
centos 7.8.2003 afb6fca791e0 2 years ago 203MB
在工作中,除了公网服务,也有一定大量的公司选择私有化部署Docker镜像仓库服务。这个后面的知识点会讲
本文的最后,对于版本号要说一点,拉取镜像时默认是最新版本,但操作到现在肯定已经发现,latest它本质就是一个普通的字符串,不是一个你写了就自动转换成最新版的特殊关键字,在工作中大多数远程docker镜像仓库服务都有自动打包的功能,比如阿里云。极少需要你自己去做什么,当然如果真的需要,git内置了ci工具,网上搜一下怎么用就行,只需要一个配置文件即可
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)