常用的dockerfile指令
FROM:指定自动化构建的基础镜像,该指令必须指定。
RUN:制作镜像过程中需要的执行命令,通常用作安装服务。但不能出现阻塞当前终端的命令。
CMD:指定容器启动的时候需要执行的初始命令,当然,我们也可以在启动容器的时候替换该命令哟。
ENTRYPOINT:
指定容器启动的时候执行的初始命令,与CMD指令不同,因为它不能被替换。
如果启动指令时强行传递三处,则仅能用作ENTRYPOINT指令的参数,并不会替换哟。
如果同时使用CMD和ENTRYPOINT,cmd命令将作为ENTRYPOINT命令的参数。
ADD:把dockerfile当前目录下的文件拷贝到容器中,其会自动解压tar包。
COPY:把dockerfile当前目录下的文件拷贝到容器中,但并不会解压tar包哟。
WORKDIR:指定容器的默认工作目录。
EXPOSE:指定镜像要对外暴露的端口。
VOLUME:指定随机的持久化卷。
ENV:用于设置环境变量,比如设置sshd,数据库的root密码等。
ARG:构建参数,与ENV作用一至。不过作用域不一样。
ARG设置的环境变量仅对Dockerfile内有效,也就是说只有 docker build的过程中有效,构建好的镜像内不存在此环境变量。←
LABEL:为镜像的属性打标签。
MAINTAINER(官方已废弃,可能在未来的docker版本中移除它,因此我推荐大家使用更加灵活的LABEL指令):管理者标识。
USER:用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
ONBUILD:
用于延迟构建命令的执行。
简单的说,就是Dockerfile里用ONBUILD指定的命令,
在本次构建镜像的过程中不会执行(假设镜像为test-build)。
当有新的Dockerfile使用了之前构建的镜像 FROM test-build ,
这时执行新镜像的 Dockerfile构建时候,会执行test-build的Dockerfile 里的ONBUILD 指定的命令。
HEALTHCHECK:
用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
HEALTHCHECK [选项] CMD〈命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK [选项] CMD〈命令〉:这边CMD后面跟随的命令使用,可以参考CMD的用法。
使用dockerfile构建nginx服务镜像
[root@docker ~]# mkdir nginx
[root@docker ~]# cd nginx
[root@docker nginx]# vim dockerfile
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install -y nginx
RUN rm -rf /usr/share/nginx/html/index.html
RUN echo 'hello' > /usr/share/nginx/html/index.html
CMD nginx -g 'daemon off;'
[root@docker nginx]# docker build -t nginx:v1 .
[root@docker nginx]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 f4bff8c333ac 29 seconds ago 536MB
centos_new latest dc76385af28d 11 hours ago 470MB
[root@docker nginx]# docker run -itd --name nginx -p 80:80 nginx:v1
526eccb5f1c5d3285e0fdfe5ff2a1cab5048bb0a627b375eb82681602f70b159
[root@docker nginx]# curl 127.0.0.1
hello
证明创建成功
使用docker制作tomcat镜像
[root@docker ~]# mkdir tomcat
[root@docker ~]# cd tomcat
[root@docker tomcat]# ls
apache-tomcat-9.0.14.tar.gz dockerfile jdk-8u401-linux-x64.tar.gz profile
这里我已经在dockerfile目录下准备好了jdk和tomcat的安装包以及java的环境变量文件
[root@docker tomcat]# vim dockerfile
FROM centos:7
ADD apache-tomcat-9.0.14.tar.gz /usr/local
ADD jdk-8u401-linux-x64.tar.gz /usr/local
RUN cd /usr/local && mv apache-tomcat-9.0.14 tomcat && mv jdk1.8.0_401 jdk
ENV JAVA_HOME=/usr/local/jdk
ENV PATH=$PATH:$JAVA_HOME/bin
CMD /usr/local/tomcat/bin/startup.sh && tail -F /usr/local/tomcat/logs/catalina.out
[root@docker tomcat]# docker build -t tomcat:v11 .
[+] Building 15.3s (9/9) FINISHED docker:default
=> [internal] load build definition from dockerfile 0.0s
=> => transferring dockerfile: 366B 0.0s
=> [internal] load metadata for docker.io/library/centos:7 15.2s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/4] FROM docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 99B 0.0s
=> CACHED [2/4] ADD apache-tomcat-9.0.14.tar.gz /usr/local 0.0s
=> CACHED [3/4] ADD jdk-8u401-linux-x64.tar.gz /usr/local 0.0s
=> CACHED [4/4] RUN cd /usr/local && mv apache-tomcat-9.0.14 tomcat && mv jdk1.8.0_401 jdk 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:eacea8862d124c40c23bfffdf56c048f50bbe4abfaad3e891f3951d8c7acc535 0.0s
=> => naming to docker.io/library/tomcat:v11
[root@docker tomcat]# docker run -itd --name tomcat tomcat:v11
e98cb5876bed68b4929980d2213ffbda515e41c7418bcbc39f6a6f200d6e4b4e
[root@docker tomcat]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e98cb5876bed tomcat:v11 "/bin/sh -c '/usr/lo…" 2 seconds ago Up 2 seconds tomcat
11aa14b2a0a5 nginx:v2 "/bin/sh -c 'nginx -…" About an hour ago Up About an hour 0.0.0.0:80->80/tcp, :::80->80/tcp nginx
可以看到启动成功
dockerfile的优化
dockerfile的优化原则简而言之为:"构建的镜像尽可能小,构建速度尽可能快"。
(1)使用体积小的Linux镜像,比如使用alpine作为基础镜像(仅有5MB大小);
(2)尽可能的清理无用的缓存文件,比如尽可能把多个RUN指令合并,避免产生多个临时镜像;
(3)修改dockerfile的时候,尽可能把修改的内容放在最后,这样可以充分利用缓存镜像;
(4)使用".dockerignore"忽略构建docker镜像时不需要的文件,从而减小镜像体积;
温馨提示:
(1)大多数开源的Linux镜像默认都是用了标准C语言编译器glibC,这会占用很大一部分空间;
(2)而alpine使用musl libc和BusyBox构建的Linux发行版;
(3)alpine和其它linux发行版相比就是体积小,但也可能会存在部分软件不兼容的情况哟;
(4)如果alpine无法兼容一些软件时,可以考虑使用Ubuntu18.04镜像,因为其63MB;
(5)最后再考虑使用centos镜像,因为其镜像大小超过200MB,jumpserver就是基于该镜像制作的,这导致最终生成的镜像还是蛮大的;