时间:2020-10-27 10:57 作者:admin610456
dockerfile 是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
编写一个dockerfile 文件 docker build 构建成一个镜像 docker run 运行镜像 docker push 发布镜像(DockerHub、阿里云镜像仓库)# 以contes为例 查看 dockerhub 上 contes 的 dockerfileFROM scratchADD 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="20200809" \ 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-08-09 00:00:00+01:00"CMD ["/bin/bash"]
DockerFile构建过程
基础知识:
每个保留关键字(指令)都必须是大写字母 执行顺序从上到下顺序执行 表示注释 每个指令都会创建提交一个新的镜像层,并提交dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成为企业交付的标准!
DockerFile:构建镜像,定义了一切的步骤,源代码;
DockerImages:通过DockerFile构建生成的一个镜像,这个镜像就是我们最终发布和运行的产品!
Docker容器:容器就是镜像运行起来提供服务!
DockerFile的指令
FROM# 基础镜像MAINTAINER# 镜像是谁写的姓名 + 邮箱RUN# 镜像构建的时候需要运行的命令ADD# 步骤eg:tomcat镜像---》放入tomcat的压缩包!添加内容WORKDIR# 镜像的工作目录VOLUME# 挂载的目录位置EXPOST# 暴露端口配置CMD# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代ENTRYPOINT# 指定这个容器启动的时候要运行的命令,可以追加命令ONBUILD# 当构建一个被继承的 DockerFile ,这个时候就会运行 ONBUILD 的指令,触发指令COPY# 类似ADD,将我们的文件拷贝到镜像中ENV # 构建的时候设置环境变量
实战测试
Docker Hub 中 99% 的镜像都是从 FROM scratch 这个基础镜像过来的 ,然后配置我们需要的软件和配置来进行构建
创建一个自己的centos
# 1、编写DockerFile的文件FROM centos# 作者信息MAINTAINER yinxiaodong<m15010969094@163.com># 配置环境变量 ENV MYPATH /user/local# 指定镜像的工作目录WORKDIR $MYPATH RUN yum install -y vimRUN yum install -y net-tools# 暴露80端口 EXPOSE 80 CMD echo $MYPATHCMD echo "---------end--------"CMD /bin/bash# 2、通过文件构建镜像# 命令 docker build -f dockerfile文件路径-t 镜像名:版本号 .[root@localhost dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .Sending build context to Docker daemon 2.048kBStep 1/9 : FROM centos ---> 0d120b6ccaa8Step 2/9 : MAINTAINER yinxiaodong<m15010969094@163.com> ---> Running in f79b12ffb083Removing intermediate container f79b12ffb083 ---> 8ee53d3f7a65Step 3/9 : ENV MYPATH /user/local ---> Running in 659a2c96d5f7Removing intermediate container 659a2c96d5f7 ---> 59ab131ef44cStep 4/9 : WORKDIR $MYPATH ---> Running in 0b4b8f9c65bbRemoving intermediate container 0b4b8f9c65bb ---> 408b06671488Step 5/9 : RUN yum install -y net-tools ---> Running in 151f81148a87CentOS-8 - AppStream 118 kB/s | 5.8 MB 00:50 CentOS-8 - Base 218 kB/s | 2.2 MB 00:10 CentOS-8 - Extras 1.8 kB/s | 7.3 kB 00:04 Dependencies resolved.================================================================================ Package Architecture Version Repository Size================================================================================Installing: net-tools x86_64 2.0-0.51.20160912git.el8 BaseOS 323 kTransaction Summary================================================================================Install 1 PackageTotal download size: 323 kInstalled size: 1.0 MDownloading Packages:net-tools-2.0-0.51.20160912git.el8.x86_64.rpm 219 kB/s | 323 kB 00:01 --------------------------------------------------------------------------------Total 66 kB/s | 323 kB 00:04 warning: /var/cache/dnf/BaseOS-f6a80ba95cf937f2/packages/net-tools-2.0-0.51.20160912git.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEYCentOS-8 - Base 162 kB/s | 1.6 kB 00:00 Importing GPG key 0x8483C65D: Userid : "CentOS (CentOS Official Signing Key) <security@centos.org>" Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficialKey imported successfullyRunning transaction checkTransaction check succeeded.Running transaction testTransaction test succeeded.Running transaction Preparing : 1/1 Installing : net-tools-2.0-0.51.20160912git.el8.x86_64 1/1 Running scriptlet: net-tools-2.0-0.51.20160912git.el8.x86_64 1/1 Verifying : net-tools-2.0-0.51.20160912git.el8.x86_64 1/1 Installed: net-tools-2.0-0.51.20160912git.el8.x86_64 Complete!Removing intermediate container 151f81148a87 ---> c0a0546c9b2aStep 6/9 : EXPOSE 80 ---> Running in 42000936515dRemoving intermediate container 42000936515d ---> fe68114ecf3fStep 7/9 : CMD echo $MYPATH ---> Running in c393fc53a354Removing intermediate container c393fc53a354 ---> a6924276bf90Step 8/9 : CMD echo "---------end--------" ---> Running in 5994de56f0a1Removing intermediate container 5994de56f0a1 ---> a8ba0ebb3770Step 9/9 : CMD /bin/bash ---> Running in d1fa2d436363Removing intermediate container d1fa2d436363 ---> 41bb76be4884Successfully built 41bb76be4884Successfully tagged mycentos:0.1[root@localhost dockerfile]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmycentos 0.1 41bb76be4884 7 seconds ago 246MBcentos 1.0 d840628c30a9 6 hours ago 215MBcentos latest 0d120b6ccaa8 2 days ago 215MB# 启动 mycentos 使用 ifconfig 命令查看ip信息[root@localhost dockerfile]# docker run -it mycentos:0.1[root@494c2bc72263 local]# ifconfigeth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.3 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:ac:11:00:03 txqueuelen 0 (Ethernet) RX packets 6 bytes 516 (516.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 0lo: 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# 查看所在目录 /user/local 正是我们在dockerfile中指定的目录 [root@494c2bc72263 local]# pwd/user/local
查看镜像的构建历史记录
# 命令 docker history 镜像id[root@localhost ~]# docker history 41bb76be4884IMAGE CREATED CREATED BY SIZE COMMENT41bb76be4884 16 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B a8ba0ebb3770 16 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B a6924276bf90 16 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B fe68114ecf3f 16 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B c0a0546c9b2a 16 minutes ago /bin/sh -c yum install -y net-tools 31.3MB 408b06671488 17 minutes ago /bin/sh -c #(nop) WORKDIR /user/local 0B 59ab131ef44c 17 minutes ago /bin/sh -c #(nop) ENV MYPATH=/user/local 0B 8ee53d3f7a65 17 minutes ago /bin/sh -c #(nop) MAINTAINER yinxiaodong<m1… 0B 0d120b6ccaa8 2 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 2 days ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 2 days ago /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d… 215MB
我们平时拿到一个镜像,可以研究一下它是怎么做的---->docker history 镜像id
CMD 和 ENTRYPOINT 的区别
CMD# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代ENTRYPOINT# 指定这个容器启动的时候要运行的命令,可以追加命令# 测试 CMD# 编写DockerFile的文件[root@localhost dockerfile]# cat dockerfile-cmd-test FROM centosCMD ["ls","-a"]# 根据 DockerFile 构建镜像[root@localhost dockerfile]# docker build -f dockerfile-cmd-test -t testcmd:0.1 .Sending build context to Docker daemon 3.072kBStep 1/2 : FROM centos ---> 0d120b6ccaa8Step 2/2 : CMD ["ls","-a"] ---> Running in b3f8ba72222bRemoving intermediate container b3f8ba72222b ---> 561e47f88730Successfully built 561e47f88730Successfully tagged testcmd:0.1# 构建成功# 查看镜像[root@localhost dockerfile]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEtestcmd 0.1 561e47f88730 6 seconds ago 215MBcentos latest 0d120b6ccaa8 2 days ago 215MB# 启动镜像 发现ls -a命令生效[root@localhost dockerfile]# docker run -it testcmd:0.1. .dockerenvdev home lib64 media opt root sbinsys usr.. binetc lib lost+found mnt proc run srvtmp var# 启动命令中 追加一个 -l, 我们期望的是 ls -a -l,但是 报错,这里将 ls -a 替换成了 -l,最终的命令是 -l 所以报错。[root@localhost dockerfile]# docker run -it 561e47f88730 -ldocker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.# 将启动命令替换成 docker run -it testcmd:0.1 ls -al, 成功打印详细信息;[root@localhost dockerfile]# docker run -it testcmd:0.1 ls -altotal 0drwxr-xr-x. 1 root root 6 Aug 13 08:20 .drwxr-xr-x. 1 root root 6 Aug 13 08:20 ..-rwxr-xr-x. 1 root root 0 Aug 13 08:20 .dockerenvlrwxrwxrwx. 1 root root 7 May 11 2019 bin -> usr/bindrwxr-xr-x. 5 root root 360 Aug 13 08:20 devdrwxr-xr-x. 1 root root 66 Aug 13 08:20 etcdrwxr-xr-x. 2 root root 6 May 11 2019 homelrwxrwxrwx. 1 root root 7 May 11 2019 lib -> usr/liblrwxrwxrwx. 1 root root 9 May 11 2019 lib64 -> usr/lib64drwx------. 2 root root 6 Aug 9 21:40 lost+founddrwxr-xr-x. 2 root root 6 May 11 2019 mediadrwxr-xr-x. 2 root root 6 May 11 2019 mntdrwxr-xr-x. 2 root root 6 May 11 2019 optdr-xr-xr-x. 123 root root 0 Aug 13 08:20 procdr-xr-x---. 2 root root 162 Aug 9 21:40 rootdrwxr-xr-x. 11 root root 163 Aug 9 21:40 runlrwxrwxrwx. 1 root root 8 May 11 2019 sbin -> usr/sbindrwxr-xr-x. 2 root root 6 May 11 2019 srvdr-xr-xr-x. 13 root root 0 Aug 11 09:58 sysdrwxrwxrwt. 7 root root 145 Aug 9 21:40 tmpdrwxr-xr-x. 12 root root 144 Aug 9 21:40 usrdrwxr-xr-x. 20 root root 262 Aug 9 21:40 var# 测试二:现在我们把 DockerFile 中 CMD 替换成 ENTRYPOINT 后重新构建,运行 看看结果[root@localhost dockerfile]# cat dockerfile-cmd-test FROM centosENTRYPOINT ["ls","-a"]# 重新构建镜像[root@localhost dockerfile]# docker build -f dockerfile-cmd-test -t testcmd:0.2 .Sending build context to Docker daemon 3.072kBStep 1/2 : FROM centos ---> 0d120b6ccaa8Step 2/2 : ENTRYPOINT ["ls","-a"] ---> Running in c634ca09fabeRemoving intermediate container c634ca09fabe ---> 52d295395f08Successfully built 52d295395f08Successfully tagged testcmd:0.2# 查看镜像[root@localhost dockerfile]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEtestcmd 0.2 52d295395f08 7 seconds ago 215MBtestcmd 0.1 561e47f88730 12 minutes ago 215MBcentos latest 0d120b6ccaa8 2 days ago 215MB# 运行testcmd:0.2镜像 并追加 -l ,发现 打印出了详细信息[root@localhost dockerfile]# docker run -it testcmd:0.2 -ltotal 0drwxr-xr-x. 1 root root 6 Aug 13 08:17 .drwxr-xr-x. 1 root root 6 Aug 13 08:17 ..-rwxr-xr-x. 1 root root 0 Aug 13 08:17 .dockerenvlrwxrwxrwx. 1 root root 7 May 11 2019 bin -> usr/bindrwxr-xr-x. 5 root root 360 Aug 13 08:17 devdrwxr-xr-x. 1 root root 66 Aug 13 08:17 etcdrwxr-xr-x. 2 root root 6 May 11 2019 homelrwxrwxrwx. 1 root root 7 May 11 2019 lib -> usr/liblrwxrwxrwx. 1 root root 9 May 11 2019 lib64 -> usr/lib64drwx------. 2 root root 6 Aug 9 21:40 lost+founddrwxr-xr-x. 2 root root 6 May 11 2019 mediadrwxr-xr-x. 2 root root 6 May 11 2019 mntdrwxr-xr-x. 2 root root 6 May 11 2019 optdr-xr-xr-x. 121 root root 0 Aug 13 08:17 procdr-xr-x---. 2 root root 162 Aug 9 21:40 rootdrwxr-xr-x. 11 root root 163 Aug 9 21:40 runlrwxrwxrwx. 1 root root 8 May 11 2019 sbin -> usr/sbindrwxr-xr-x. 2 root root 6 May 11 2019 srvdr-xr-xr-x. 13 root root 0 Aug 11 09:58 sysdrwxrwxrwt. 7 root root 145 Aug 9 21:40 tmpdrwxr-xr-x. 12 root root 144 Aug 9 21:40 usrdrwxr-xr-x. 20 root root 262 Aug 9 21:40 var
DockerFile中很多命令都十分相似,我们需要了解他的区别,最好的学习就是对比进行测试查看效果!
实战:Tomcat镜像
1、准备镜像文件 tomcat压缩包 jdk压缩包
[root@localhost tomcat]# ls
apache-tomcat-8.5.43.tar.gz Dockerfile jdk-8u211-linux-x64.tar.gz read.txt
2、编写dockerfile文件, 官方命名Dockerfile,build会自动寻找这个文件,不需要 -f 指定!
# 引入基础FROM centos# 作者信息MAINTAINER yinxiaodoong<m15010969094@163.com># copy文件read.txt到容器的 /usr/local/read.txt 目录下COPY read.txt /usr/local/read.txt# 添加jdk tomcat ---> 自动解压ADD jdk-8u211-linux-x64.tar.gz /usr/local/ADD apache-tomcat-8.5.43.tar.gz /usr/local/# 安装 vim 命令RUN yum install -y vim# 配置 MYPATHENV MYPATH /usr/local/# 指定 进入容器默认路径 /user/local/ WORKDIR $MYPATH# 配置jdk环境变量ENV JAVA_HOME /usr/local/jdk1.8.0_211ENV CLASSPATH $JAVA_HOME/lib/dt.jat:$JAVA_HOME/lib/tools.jar# 配置tomcat环境变量ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.43ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.43ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin# 暴露8080端口EXPOSE 8080# /usr/local/tomcat/webapps# # 启动容器时 启动tomcatCMD /usr/local/apache-tomcat-8.5.43/bin/startup.sh && tail -f /usr/local/apache-tomcat-8.5.43/logs/catalina.out # 构建tomcat镜像[root@localhost tomcat]# docker build -t mytomcat [root@localhost tomcat]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmytomcat latest a9707559afa1 8 seconds ago 693MBcentos latest 0d120b6ccaa8 4 days ago 215MB[root@localhost tomcat]# docker run -d -p 8081:8080 --name mytomcat--01 -v /home/yinxiaodong/build/tomcat/test:/usr/local/apache-tomcat-8.5.43/webapps/test -v /home/yinxiaodong/build/tomcat/logs:/usr/local/apache-tomcat-8.5.43/logs mytomcat
发布自己的镜像
发布到 dockerHub
地址https://hub.docker.com/ 注册自己的账号
确定自己的账号可以登录
在我们的服务器上提交
[root@localhost logs]# docker login --helpUsage: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@localhost logs]# [root@localhost logs]# docker login -u xxx -p xxxWARNING! Using --password via the CLI is insecure. Use --password-stdin.WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
登录完毕后就可以提交镜像了
[root@localhost logs]# docker push xxx/mytomcat:1.0
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
(责任编辑:admin)《中华人民共和国工业和信息化部》 编号:ICP备00012341号
Copyright © 2002 -2018 香港云主机 版权所有
声明:香港云主机品牌标志、品牌吉祥物均已注册商标,版权所有,窃用必究
云官方微信