Docker进阶(二)Dockerfile——镜像构建发布
Dockerfile的组成
-
编写一个dockerfile文件
-
docker build 构建成一个镜像
-
docker run运行镜像
-
docker push发布镜像至DockerHub或阿里云镜像仓库
FROM scratch ADD centos-7-x86_64-docker.tar.xz / LABEL \ org.label-schema.schema-version="1.0" \ org.label-schema.name="CentOS Base Image" \ org.label-schema.vendor="CentOS" \ org.label-schema.license="GPLv2" \ org.label-schema.build-date="20201113" \ org.opencontainers.image.title="CentOS Base Image" \ org.opencontainers.image.vendor="CentOS" \ org.opencontainers.image.licenses="GPL-2.0-only" \ org.opencontainers.image.created="2020-11-13 00:00:00+00:00" CMD ["/bin/bash"]
-
指令是大写字母
-
执行顺序从上至下,每个指令都会创建提交一个新的镜像层

Docker指令
FROM #基础镜像,一切从这里开始构建 MAINTAINER #镜像的署名和联系方式 RUN #镜像构建时需要运行的命令 ADD #添加内容,源文件可以是相对路径,可以是url,特可以是tar.gz文件(会自动解压) WORKDIR #镜像的工作目录 VOLUME #挂载的目录 EXPOSE #保留端口配置,开启后外部无需使用-p CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令 ONBUILD #当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令 ,触发指令 COPY #类似ADD,将文件拷贝至镜像中,格式:COPY 源目标 目的目标。多个命令使用&&拼接 ENV #构建的时候设置环境变量

当一个镜像使用ENTRYPOINT指定容器启动后运行的命令时,在外部启动容器时可以追加命令,拿上面的例子说,如果构建时使用ENTRYPOINT ['ls', '-a'],外部启动时额外加了-l,则这里的-l会和镜像自带的ls -a 合并成完整命令ls -al

配置带vim 和ifconfig的CentOS
手动配置镜像,一般从scratch 开始(dockerhub中99%的镜像从这个基础镜像过来的)。手动配置之前,可以用docker history命令查看其他镜像的构建步骤:

编辑Dockerfie文件
[root@VM-0-7-centos dockerfile]# vim centos-yz #这里的centos-yz如果写成Dockerfile,则编译时无需-f寻找编译文件,会自动寻找 FROM centos MAINTAINER zhouyinlin<1909423593@qq.com> ENV MYPATH /root/ WORKDIR $MYPATH #构建时运行的命令 RUN yum -y install vim RUN yum -y install net-tools #打开端口 EXPOSE 80 CMD $PATH CMD echo "------------------end-------------------" CMD /bin/bash [root@VM-0-7-centos dockerfile]# docker build -f centos-yz -t centos-yz:1.0 . #开始构建
[root@VM-0-7-centos dockerfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos-yz 1.0 a2f9e606e2c5 15 seconds ago 322MB [root@VM-0-7-centos dockerfile]# docker run -it centos-yz:1.0 [root@4103126b11ae ~]# vim [root@4103126b11ae ~]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.18.0.2 netmask 255.255.0.0 broadcast 172.18.255.255 ether 02:42:ac:12:00:02 txqueuelen 0 (Ethernet) RX packets 8 bytes 656 (656.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 1000 (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 [root@4103126b11ae ~]#
配置自带Tomcat的镜像,且允许从外部部署项目
编辑Dockerfile文件
FROM centos MAINTAINER ZHOUYINGLIN<1909423593@QQ.COM> COPY readme.txt /usr/local/readme.txt #阅读文档 #将压缩包和jdk添加到镜像 ADD apache-tomcat-9.0.22.tar.gz /usr/local ADD jdk-8u151-linux-x64.tar.gz /usr/local RUN yum -y install vim #配置工作目录和路径 ENV MYPATH /usr/local WORKDIR $MYPATH #配置相关的环境变量 ENV JAVA_HOME /usr/local/jdk1.8.0_151 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin #开放端口 EXPOSE 8080 #镜像运行时,就启动tomcat,并写入日志 CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/logs/catalina.out
构建镜像并启动容器
docker build -tdiytomcat . #这里由于dockerfile名叫:Dockerfile,因此无需再加-f 但注意后面的点,表示是当前目录的 #开放宿主机的9090端口映射至容器的8080端口,挂载两个目录:1.项目目录 2.日志存放目录
#宿主机的tomcat/project映射到webapps下的test目录,test项目下所有文件都可以从外部部署进去 docker run -d -p 9090:8080 --name newtomcat -v /root/dockerfile/tomcat/project:/usr/local/apache-tomcat-9.0.22/webapps/test -v /root/dockerfile/tomcat/logs:/usr/local/apache-tomcat-9.0.22/logs diytomcat
目前为止,就可以正常的在宿主机或者外部网络访问到tomcat的主页啦。项目就弄一个简单的网页就好了,再以IP:port/项目名就可以访问项目主页了
新建项目
在宿主机的project下新建WEB-INF等目录、文件,层级如下: project WEB-INFO web.xml index.jsp
文件描述
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_4_0.xsd" version="4.0" metadata-complete="true"> </web-app>
发布镜像至DockerHub
发布镜像到dockerHub上,首先要做的事应该是登录。如果没有登录过,那么需要先注册账号:https://hub.docker.com/ 。登录好之后才可以提交镜像,docker中的登录的帮助文档长这样:
[root@VM-0-7-centos project]# 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
[root@VM-0-7-centos ~]# docker push diytomcat Using default tag: latest The push refers to repository [docker.io/library/diytomcat] ffb151e67a73: Preparing 23127db07fa3: Preparing 1e438b048a4f: Preparing 328e77a13569: Preparing 74ddd0ec08fa: Preparing denied: requested access to the resource is denied #提示拒绝
这里有一个提示错误,因为是我们的push格式有错误。所以不会上去的。正确的命令格式应该是先将做好的镜像使用tag命令规范命名
#格式:用户名/镜像名:版本号。创建完后会出现一个一样的镜像 [root@VM-0-7-centos ~]# docker tag diytomcat zhouyinglin/diytomcat:v1 [root@VM-0-7-centos ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE diytomcat latest 50316eed1aeb 5 hours ago 695MB zhouyinglin/diytomcat v1 50316eed1aeb 5 hours ago 695MB
接着我们就可以正常使用push命令了。云服务器的小水管虽然慢,但毕竟是阿里的网,也是能够上传完的,本地网络的话就有可能传不上去,毕竟DockerHub是国外的
[root@VM-0-7-centos ~]# docker push zhouyinglin/diytomcat:v1 The push refers to repository [docker.io/zhouyinglin/diytomcat] ffb151e67a73: Pushing [=====================> ] 26.99MB/64MB 23127db07fa3: Pushing [=> ] 10.98MB/384.4MB 1e438b048a4f: Pushing [==================================================>] 15.41MB/15.41MB 328e77a13569: Pushing [==================================================>] 3.072kB 74ddd0ec08fa: Pushing [=====> ] 23.48MB/231.3MB
发布镜像至阿里云镜像仓库
创建命名空间

创建容器镜像

查看仓库面板
仓库地址:

官方push流程

[root@VM-0-7-centos ~]# docker tag 50316eed1aeb registry.cn-hangzhou.aliyuncs.com/yz-zhouyinglin/resp:v1 [root@VM-0-7-centos ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE diytomcat latest 50316eed1aeb 6 hours ago 695MB registry.cn-hangzhou.aliyuncs.com/yz-zhouyinglin/resp v1 50316eed1aeb 6 hours ago 695MB
[root@VM-0-7-centos ~]# docker push registry.cn-hangzhou.aliyuncs.com/yz-zhouyinglin/resp:v1 The push refers to repository [registry.cn-hangzhou.aliyuncs.com/yz-zhouyinglin/resp] ffb151e67a73: Pushing [===========================================> ] 55.78MB/64MB 23127db07fa3: Pushing [========> ] 64.83MB/384.4MB ffb151e67a73: Pushed 23127db07fa3: Pushing [==========> ] 77.64MB/384.4MB 74ddd0ec08fa: Pushing [=================> ] 78.85MB/231.3MB 74ddd0ec08fa: Pushing [===================> ] 90.89MB/231.3MB
push结束
[root@VM-0-7-centos ~]# docker push registry.cn-hangzhou.aliyuncs.com/yz-zhouyinglin/resp:v1 The push refers to repository [registry.cn-hangzhou.aliyuncs.com/yz-zhouyinglin/resp] ffb151e67a73: Pushing [===========================================> ] 55.78MB/64MB 23127db07fa3: Pushing [========> ] 64.83MB/384.4MB ffb151e67a73: Pushed 23127db07fa3: Pushing [==================================================>] 385.7MB 1e438b048a4f: Pushed 23127db07fa3: Pushed v1: digest: sha256:a08b7a9ba95cb7cc624975f07d2fb4b686f316d1ae319cc557f2ce71291c7c26 size: 1373
在阿里云的版本页面可以看到push 上来的镜像

-------------------------------------------------------Docker入门结束-------------------------------------------------------------------

本文来自博客园,作者:我永远喜欢石原里美,转载请注明原文链接:https://www.cnblogs.com/yuan-zhou/p/15676852.html

浙公网安备 33010602011771号