AIOps 一场颠覆传统运维的盛筵
811
2022-10-14
Dockerfile构建容器镜像 - 运维笔记
在Docker的运用中,从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低。所以就需要一 种文件或脚本,我们把想执行的操作以命令的方式写入其中,然后让docker读取并分析、执行,那么重复构建、更新将变得很方便,所以Dockerfile就此诞生了。Docker提供了Dockerfile作为构建Docker镜像脚本,避免人们一行一行的输入,真是善莫大焉。Dockerfile脚本可以做到随时维护修改,即可以分享,更有利于在模板化,更不用说传输了,好处那是一大箩筐!下面就详细介绍下Dockfile的使用:
Dockfile是一种被Docker程序解释的脚本,它由一条条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译成真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。Docker程序将读取Dockerfile,根据指令生成定制的image。相比image这种黑盒子,Dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明image是怎么产生的。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。
总的来说:Dockerfile分为四部分:基础镜像信息、镜像创建者信息、镜像操作指令、容器启动执行指令。一开始必须要指明所基于的镜像名称,接下来一般会说明镜像创建者信息。后面则是镜像操作指令
一、Dockerfile的书写规则及指令使用方法Dockerfile的指令是忽略大小写的,建议使用大写,使用 # 作为注释,每一行只支持一条指令,每条指令可以携带多个参数。Dockerfile的指令根据作用可以分为两种:构建指令和设置指令。构建指令用于构建image,其指定的操作不会在运行image的容器上执行;设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。
二、Dockerfile使用实例
1)利用dockerfile部署jdk1.7+tomcat7服务环境
Docker容器创建好之后,尽量不要直接登陆容器内去修改。所以最好容器创建的时候进行目录映射。这样就可以通过映射到宿主机上的文件或目录去共享到容器内。则上面的wangshibo-tomcat容器可以如下调整操作:
[root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESc0812ad20bed wangshibo/jdk-tomcat "/bin/sh -c 'service " 7 seconds ago Up 6 seconds 0.0.0.0:8899->8080/tcp wangshibo-tomcat[root@localhost ~]# docker cp wangshibo-tomcat:/opt/tomcat7/webapps /opt/[root@localhost ~]# docker run -ti -d --name wangshibo-tomcat -v /opt/webapps:/opt/tomcat7/webapps -p 8899:8080 wangshibo/jdk-tomcat /bin/bash1373d1496c2a6226fe5bb6b4877e854bde68ec3653c04966a1b5d22b98486f7d[root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1373d1496c2a wangshibo/jdk-tomcat "/bin/sh -c 'service " 4 seconds ago Up 2 seconds 0.0.0.0:8899->8080/tcp wangshibo-tomcat这样让需要修改wangshibo-tomcat容器的代码或上线代码时,只需要操作宿主机的/opt/webapps目录即可。
------------------删除docker images中为none的镜像----------------
经常使用Dockerfile制作镜像,Docker build 命令执行后,由于版本更新需要重新创建,那么以前那个版本的镜像就会成为临时镜像,这就是none标签的镜像。,如下:[root@localhost ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEwangshibo/jdk-tomcat latest 76b10dd9923f About an hour ago 771.5 MB
2)再看一例tomcat容器镜像的Dockerfile制作过程(centos为base镜像)
[root@localhost ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEdocker.io/centos latest 67591570dd29 3 months ago 191.8 MB提前下载好tomcat和java安装包,放在Docker宿主机的/usr/local/src目录下:[root@localhost src]# lsapache-tomcat-7.0.67.tar.gz jdk-7u79-linux-x64.tar.gz 在/usr/local/src当前目录下编辑Dockerfile。如下:即将宿主机本地的tomcat和java安装包拷贝到容器内,并自动解压。[root@localhost src]# vim Dockerfile#pull down centos imageFROM docker.io/centos MAINTAINER wangshibo wang_shibo1987@163.com#copy jdk and tomcat into imageADD ./apache-tomcat-7.0.67.tar.gz /usr/localADD ./jdk-7u79-linux-x64.tar.gz /usr/local#set environment variableENV JAVA_HOME /usr/local/jdk1.7.0_79ENV PATH $JAVA_HOME/bin:$PATH#define entry point which will be run first when the container starts upENTRYPOINT /usr/local/apache-tomcat-7.0.67/bin/startup.sh && tail -F /usr/local/apache-tomcat-7.0.67/logs/catalina.out接着构建镜像[root@localhost src]# docker build -t kevin_tomcat7 --rm=true .[root@localhost src]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEkevin_tomcat7 latest 8f242680d940 11 seconds ago 511.6 MBdocker.io/centos latest 67591570dd29 3 months ago 191.8 MB根据制作的镜像启动tomcat容器[root@localhost src]# docker run -ti -d --name tomcat-test -p 8899:8080 kevin_tomcat7 /bin/bash22dece8d6660b61677bf89137d5d21548c2f0b0fd337ce5a1e12ef6d2000091a[root@localhost src]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES22dece8d6660 kevin_tomcat7 "/bin/sh -c '/usr/loc" 4 seconds ago Up 4 seconds 0.0.0.0:8899->8080/tcp tomcat-test[root@localhost src]# docker exec -ti tomcat-test /bin/bash[root@22dece8d6660 /]# ps -ef|grep tomcatroot 1 0 0 08:59 ? 00:00:00 /bin/sh -c /usr/local/apache-tomcat-7.0.67/bin/startup.sh && tail -F /usr/local/apache-tomcat-7.0.67/logs/catalina.out /bin/bashroot 20 1 9 08:59 ? 00:00:05 /usr/local/jdk1.7.0_79/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-7.0.67/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/apache-tomcat-7.0.67/endorsed -classpath /usr/local/apache-tomcat-7.0.67/bin/bootstrap.jar:/usr/local/apache-tomcat-7.0.67/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-7.0.67 -Dcatalina.home=/usr/local/apache-tomcat-7.0.67 -Djava.io.tmpdir=/usr/local/apache-tomcat-7.0.67/temp org.apache.catalina.startup.Bootstrap startroot 21 1 0 08:59 ? 00:00:00 tail -F /usr/local/apache-tomcat-7.0.67/logs/catalina.outroot 67 47 0 09:00 ? 00:00:00 grep --color=auto tomcat
3)使用Dockerfile制作nginx镜像
---------------------------------------------------------------------------------------------------------------------特别需要注意的:在Docker daemon模式下,无论你是使用ENTRYPOINT,还是CMD,最后的命令,一定要是当前进程需要一直运行的,才能够防容器退出。也就是说,上面Dockerfile脚本中最后一行:
以下无效方式:ENTRYPOINT /usr/local/nginx/sbin/nginx #运行几秒钟之后,容器就会退出或者CMD /usr/local/nginx/sbin/nginx #运行几秒钟之后,容器就会退出
以下才是有效方式:ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /usr/local/nginx/logs/access.log #确保容器内的进程一直运行或者CMD /usr/local/nginx/sbin/nginx && tail -f /usr/local/nginx/logs/access.log #确保容器内的进程一直运行
其他应用程序镜像创建的Dockerfile配置类似------------------------------------------------------------------------------------------------------------------
Dockerfile写好了,需要转换成镜像:
构建镜像[root@localhost mnt]# docker build -t kevin_nginx --rm=true .[root@localhost mnt]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEkevin_nginx latest e4967a39dd54 23 seconds ago 411.1 MBdocker.io/centos latest 67591570dd29 3 months ago 191.8 MB根据Dockerfile构建的镜像启动nginx容器[root@localhost mnt]# docker run -ti -d --name test_nginx -p 8899:80 kevin_nginx /bin/bash8725aceba170722cd57a4f20fd843634ee5c5d75f1c2726c1e98f66b8102a179[root@localhost mnt]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES8725aceba170 kevin_nginx "/bin/sh -c '/usr/loc" 2 seconds ago Up 1 seconds 0.0.0.0:8899->80/tcp test_nginx进入容器,检查容器内的nginx程序是否已启动[root@localhost mnt]# docker exec -ti test_nginx /bin/bash[root@8725aceba170 /]# ps -ef|grep nginxroot 1 0 0 11:15 ? 00:00:00 /bin/sh -c /usr/local/nginx/sbin/nginx && tail -f /usr/local/nginx/logs/access.log /bin/bashroot 13 1 0 11:15 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginxwww 14 13 0 11:15 ? 00:00:00 nginx: worker processroot 15 1 0 11:15 ? 00:00:00 tail -f /usr/local/nginx/logs/access.logroot 38 16 0 11:16 ? 00:00:00 grep --color=auto nginx
通过映射到Docker宿主机的端口8080去访问容器的nginx
依据上面制定的kevin_nginx镜像在创建容器时,还可以使用-v参数映射宿主机目录或文件到容器里。做法如下:
创建好的镜像,可以保存到索引仓库中,便于下次使用(当然,我们直接共享Dockerfile是最简单的事情),但毕竟镜像可以做到开箱即用。
需要注意几点:1)Docker宿主机必须要有base镜像以供Dockerfile文件使用2)注意Dockerfile实例文件中的base镜像,这个引用的base镜像一定要是存在的3)可以切换到不同的目录路径下编写Dockerfile,然后构建,构建的时候直接使用.表示在当前路径下。 镜像构建成功后,可以放到自己的私有仓库里,然后Dockerfile文件可以选择删除。
发表评论
暂时没有评论,来抢沙发吧~