常用的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就是基于该镜像制作的,这导致最终生成的镜像还是蛮大的;

results matching ""

    No results matching ""