-
dockerFile介绍
dockerFile是用来构建docker镜像的文件!命令参数脚本!
步骤:
- 编写dockerFile文件
- docker build构建成为一个镜像
- docker run运行镜像
- docker push发布镜像(DockerHub,阿里云镜像仓库)
查看官方制作的dockerFile
-
在hub.docker上搜索centos
-
选择某个版本的centos,随后跳转到github上
-
FROM scratch #最底层 ADD centos-8-x86_64.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="20200809" CMD ["/bin/bash"]
dockerFile与dockerImages,docker容器的关系:
- dockerFile用于构建生成镜像,也就是最终发布和运行的产品
- docker容器是docker镜像实际运行的一个个独立的服务
基础知识:
- 每个保留关键字(指令)都必须是大写字母
- 执行从上到下顺序执行
#
表示注释- 每一个指令都会创建提交一个新的镜像层
-
dockerFIle指令
FROM # 基础镜像 MAINTAINER # 维护者信息(姓名+邮箱) RUN # 镜像构建时的命令 ADD # 需要添加的其它环境,如:tomcat压缩包,会自动解压 WORKDIR # 镜像的工作目录(如一开始就进入的目录) VOLUME # 需要挂载的目录 EXPOSE # 暴露端口(可以替代-p) CMD # 指定容器启动的时候要运行的命令,只有最后一个会生效,可被替代(即从外部调用docker run指令且携带参数时,参数会替代dockerFile中的指令) ENTRYPOINT # 指定容器启动的时候要运行的命令,可以追加命令(与上面的不同,不会被替代,而是追加) ONBUILD # 当构建一个被继承DockerFile的时候,会运行ONBUILD的指令 COPY # 类似ADD,当我们文件拷贝到镜像中 ENV # 构建的时候设置环境变量
测试:
#1,编写dockerFile文件 FROM centos #基于centos构建 MAINTAINER arno<1143037783@qq.com> ENV MYPATH /user/local #设置环境变量 WORKDIR $PATH #设置工作目录 RUN yum -y install vim #RUN命令应该是在镜像构建的时候运行的,添加了一些新功能 RUN yum -y install net-tools EXPOSE 80 #暴露的端口 CMD echo $MYPATH CMD echo "---end---" CMD /bin/bash #2.构建镜像 [root@iZwz908j8pbqd86doyrez5Z test]# docker build -f mydockerfile -t newcentos . #3.查看镜像 [root@iZwz908j8pbqd86doyrez5Z test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE newcentos latest ded9efb6e766 3 minutes ago 295MB #4.运行镜像 [root@iZwz908j8pbqd86doyrez5Z test]# docker run -P -d -it newcentos [root@iZwz908j8pbqd86doyrez5Z test]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4ce4eebf72f9 newcentos "/bin/sh -c /bin/bash" 7 seconds ago Up 7 seconds 0.0.0.0:32773->80/tcp sad_ride #可以看到运行的是80端口 [root@iZwz908j8pbqd86doyrez5Z test]# docker attach 4ce4eebf72f9 [root@4ce4eebf72f9 local]# #可以看到进入的是/usr/local这一工作目录 [root@4ce4eebf72f9 local]# ifconfig #成功在基础的centos上添加了一些新功能(RUN) eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.10 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:ac:11:00:0a txqueuelen 0 (Ethernet) 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 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 #5.查看镜像固构建的历史 [root@iZwz908j8pbqd86doyrez5Z test]# docker history newcentos IMAGE CREATED CREATED BY SIZE COMMENT ded9efb6e766 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B 345196631c6a 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B 86451430c08f 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B 11948d022259 12 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B 99c8922d054b 12 minutes ago /bin/sh -c yum -y install net-tools 22.8MB b43f395d0d9e 12 minutes ago /bin/sh -c yum -y install vim 57.2MB c973079ba70d 13 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B ff143e3cb146 13 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B eee54c129432 13 minutes ago /bin/sh -c #(nop) MAINTAINER arno<114303778… 0B 0d120b6ccaa8 4 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 4 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 4 weeks ago /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d… 215MB
docker history:查看镜像的变更历史(构建过程,配置参数)
-
CMD命令与ENTRYPOINT区别
比较思路,cmd中的“ls -a”可以列出所有的目录,"ls -al"可以列出所有目录的详细信息.我们分别用CMD和ENTRYPOINT命令构建镜像,然后在运行容器时尝试添加"-l参数",查看运行结果
(1).CMD
#1.编写dockerfile文件 FROM centos CMD ["ls","-a"] #复杂命令用[]包裹 #2.构建镜像 [root@iZwz908j8pbqd86doyrez5Z test]# docker build -f dockerfiletest1 -t dockerfiletest1 . #3.运行容器 [root@iZwz908j8pbqd86doyrez5Z test]# docker run dockerfiletest1 . .. ... #4.尝试添加参数运行——失败,因为没有"ls -l"指令 [root@iZwz908j8pbqd86doyrez5Z test]# docker run -l dockerfiletest1 "docker run" requires at least 1 argument.
(2).ENTRYPOINT
#1.编写dockerfile文件 FROM centos ENTRYPOINT ["ls","-a"] #复杂命令用[]包裹 #2.构建镜像 [root@iZwz908j8pbqd86doyrez5Z test]# docker build -f dockerfiletest2 -t dockerfiletest1 . #3.运行容器 [root@iZwz908j8pbqd86doyrez5Z test]# docker run dockerfiletest2 . .. ... #4.尝试添加参数运行 [root@iZwz908j8pbqd86doyrez5Z test]# docker run dockerfiletest2 -l total 56 drwxr-xr-x 1 root root 4096 Sep 13 01:17 . ...
区别:
- docker run的命令的参数是覆盖CMD指令的参数
- docker run的命令的参数是追加ENTRYPOINT指令的参数后
-
使用duockerfile制作Tomcat镜像(最难的一部分)
准备工作:tomcat压缩包,jdk压缩包
#1.编写Dockerfile文件 FROM centos MAINTAINER arno<1143037783@qq.com> COPY readme.txt /usr/local/readme.txt #添加readme目录 ADD jdk-8u261-linux-x64.tar.gz /usr/local/ #添加安装包,会自动解压 ADD apache-tomcat-9.0.37.tar.gz /usr/local/ #这里路径最后应该有"/" RUN yum -y install vim ENV MYPATH /usr/local #工作目录(用户一开始进入的目录) WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_261 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37 #centos环境变量 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.37 #绝对路径 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.37/logs/catalina.out #启动apache,同时输出日志文件 #2.构建镜像 docker build -t arno-tomcat . #因为dockerfile文件名为Dockerfile,所以省略了-f #3.运行容器 docker run -d -it -p 9090:8080 -v /usr/arno/tomcat/test:/usr/local/apache-tomcat-9.0.37/webapps/ROOT -v /usr/arno/tomcat/log:/usr/local/apache-tomcat-9.0.37/logs arno-tomcat #挂载tomcat的对外展示页面以及日志的目录 #4.测试端口 curl localhost:38775
- 需要准备tar.gz压缩包,这边犯了一个比较睿智的问题,x86是32位的,x64是64位的
- 起名为Dockerfile(默认名),在build的时候-f后面可以不用指定名字
- 使用COPY命令拷贝文件到容器内部(比如readme.md)
- ADD命令添加的压缩包会自动解压(一般会将它解压到/usr/local目录下)
- Tomcat没有运行起来,可以到tomcat/bin目录下运行
catalina.sh run &
指令运行
-
镜像发布
发布到DockerHub
(1).注册账号
(2).从服务器登陆docker.hub
docker login -u usrname -p password
(3).从服务器提交镜像
[root@iZwz908j8pbqd86doyrez5Z test]# docker tag arno-tomcat8 arnovc/arno-tomcat8 #打上标记 [root@iZwz908j8pbqd86doyrez5Z test]# docker push arnovc/arno-tomcat8 #将打上标记的镜像上传
注意:
- 要在镜像之前打上id的标记
- 用
docker tag
指令打标记
阿里云镜像
准备工作:登陆阿里云,点开阿里云镜像服务,创建命名空间,创建镜像仓库,创建容器镜像
#登陆阿里云(如果有登陆docker.hub,建议先退出) docker login --username=亚诺_vc registry.cn-hangzhou.aliyuncs.com #打上tag docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/arno-test/新的镜像名:[镜像版本号] #上传镜像 $ sudo docker push registry.cn-hangzhou.aliyuncs.com/arno-test/镜像名:[镜像版本号]
注意:
- 点击仓库的基本信息,可以查看镜像推送的步骤
- [:tag]中的"[]"表示可选项,本身是不用带上的