Docker使用和Dockerfile详解

作者: 温室寻荒凉 | 来源:发表于2019-07-01 22:34 被阅读21次

    文章结构:

    (一)Docker常用知识点

    (二)Dockerfile指令详解

    文章最后附一份docker教学视频,本篇的Dockerfile指令详解是看该教学视频做的笔记


    (一)Docker常用知识点

    【1.1】进入一个正在运行的Docker容器命令: 

    ~]# docker ps 

     ~]# docker exec -it 775c7c9ee1e1 /bin/bash

    【1.2】Docker 退出容器但不关闭当前容器:

    按Ctrl+P+Q进行退出容器

    【1.3】docker状态转换和事件:

    docker event state

    【1.4】常用操作:

    常用操作

    【1.5】四种Docker容器网络

    Four network container archetypes

    【1.6】在容器中使用Volumes

    Volume(卷)为docker提供了独立于容器的数据管理机制

    可以把“镜像”想象成静态文件,例如“程序”,把卷类比为动态内容,例如“数据”;于是,镜像可以重用,而卷可以共享;

    卷实现了   “程序(镜像)”   和   “数据(卷)” 分离,以及   “程序(镜像)”    和    “制作镜像的主机”   分离。用户在制作镜像时无须再考虑镜像运行的容器所在的主机的环境

    一共有两种volume可以用,都能实现数据持久化,使用方式都一样,宿主机内修改容器内也改了,容器内修改宿主机内也改了。两种方式不同在于宿主机上存放位置是随机还是指定。

    docker inspect 查看时在Mounts对象里可以看到type不一样

    (1)Docker-managed volume,这种volume在宿主机上存在放的路径是随机的

    ~]# docker run -it -name bbox1 -v /data busybox

    ~]# docker inspect -f {{.Mounts}} bbox1

        查看bbox1容器的卷、卷标识符及挂载的主机目录

    (2)Bind-mount Volume,这种volume可以指定具体在宿主机上存放的位置

    ~]# docker run -it -v HOSTDIR:VOLUMEDIR --name bbox2 busybox

    ~]# docker inspect -f {{.Mounts}} bbox2



    (二)Dockerfile指令详解:

    【2.1】Dockerfile语法格式

    Format

    注意:

    1.Dockerfile中json数组中引号都为双引号,不能写单引号

    2.通常一行一个指令

    3..找一个专用工作目录放Dockerfile,Dockerfile首字母要大写

    4.如果需要打包很多文件进镜像,必须要把文件放到当前Dockerfile所在的工作目录下。即Dockerfile中引用文件的路径不能是其父路径,可以是子路径

    5.Dockerfile还支持专用的工作目录下做一个隐藏文件,叫.dockeringore,这也是个文本文件。在这个文件中可以写文件路径,可以使用通配符。所有在打包时的文件只要在.dockeringore中写的路径,打包时都不包含进去。

    【2.2】Dockerfile中FROM指令

    FROM instruction

    【2.3】Dockerfile中LABEL指令

    LABEL为镜像制定各种元数据

    LABEL instruction

    【2.4】Dockerfile中COPY指令

    COPY Instruction

    举个栗子:

    COPY index.html /data/web/html/

    COPY yum.repos.d /etc/

    【2.5】Dockerfile中ADD指令

    ADD Instruction

    举个栗子:

    ADD   nginx-1.15.2.tar.gz   ./src/

    注意:上面的./src是相对路径,相对于WORKDIR设置的工作路径

    【2.6】Dockerfile中WORKDIR指令

    用来设置容器的当前工作路径,设置完之后的COPY和ADD指令中<dest>可以写成相对于WORKDIR的路径 ./ 或者 ./src等等,可以设置多个工作路径。

    【2.7】Dockerfile中EXPOSE指令

    EXPOSE instruction

    举个栗子:

    EXPOSE  80/tcp

    【2.8】Dockerfile中ENV指令

    ENV instruction

    举个栗子:

    ENV    DOC_ROOT    /data/web/html/

    COPY   index.html    $DOC_ROOT

    #给DOC_ROOT加个默认值:

    COPY index.html   ${doc_root:-/data/web/html/}

    #一次设置多个变量:

    ENV  DOC_ROOT=/data/web/html/  \

              WEB_SERVER_PACKAGE="NGINX-1.15.2"0

    【2.9】Dockerfile中VOLUME指令

    举个栗子:

    VOLUME  /data/mysql/

    【2.10】Dockerfile中RUN指令

    RUN指令是在由基础镜像生成目标镜像docker build过程中执行的。RUN指令可以在Dockerfile中写多个,多个RUN指令都起作用,逐一运行。如果多个Command之间有关联关系建议用一条RUN写下来,因为Dockerfile中一条指令就会生成一个镜像层。

    RUN instruction

    格式:

    RUN COMMAND1 && \

             COMMAND2

    举个栗子:

    RUN  cd  /usr/local/src  &&  \

            tar  xf  ${WEB_SERVER_PACKAGE}

    基础镜像   ->   目标镜像   ->   容器

    【2.11】Dockerfile中的CMD指令

    CMD是定义一个镜像文件启动容器时默认要运行的程序块。Docker程序默认只运行一个程序。Dockerfile中只能有一个CMD指令有效。如果写了多个只有最后一个CMD起作用。

    RUN instruction

    【2.12】Dockerfile中ENTRYPOINT指令

    ENTRYPOINT instruction

    【2.13】Dockerfile案例

    Dockerfile案例需求介绍:

    运行nginx时,nginx通过接收变量来生成配置文件。接收的变量能在启动容器时进行传递。

    案例中三个文件entrypoint.sh,Dockerfile,index.html在同一个目录下

    entrypoint.sh文件:

    #!/bin/sh

    cat > /etc/nginx/conf.d/www.conf << EOF

    server {

                server_name ${HOSTNAME};

                listen  ${IP:-0.0.0.0}:${PORT:-80};

                root ${NGX_DOC_ROOT:-/usr/share/nginx/html};

    }

    EOF

    exec "$@"

    上面的exec用来替换当前进程,“$@”含义是脚本的所有参数,即传什么就运行什么

    Dockerfile文件:

    FROM nginx:1.14-alpine

    LABEL maintainer="Andy <andy@qq.com>"

    ENV NGX_DOC_ROOT="/data/web/html/"

    ADD index.html ${NGX_DOC_ROOT}

    ADD entrypoint.sh /bin/

    CMD ["/usr/sbin/nginx","-g","daemon off;"]

    ENTRYPOINT ["/bin/entrypoint.sh"]

    index.html文件():

    <h1>New Doc Root for Nginx</h1>

    docker build:

    [root@node01 img3]# docker build -t myweb:v0.3-6 ./

    docker run:

    [root@node01 ~]# docker run --name myweb1 --rm -P myweb:v0.3-6

    启动时设置端口号,监听到8080上

    [root@node01 ~]# docker run --name myweb1 --rm -P -e "PORT=8080" myweb:v0.3-6

    进入容器验证:

    [root@node01 ~]# docker exec -it myweb1 /bin/sh

    / # cat /etc/nginx/conf.d/www.conf

    / # netstat -tnl

    / # wget -o - -q 主机名(在www.conf中查看到的server_name)

    杀掉一个运行中的容器:

    [root@node01 ~]# docker kill myweb1

    【2.14】Dockerfile中USER指令

    USER instruction

    【2.15】Docker中HEALTHCHECK指令

    主进程健康检测不能通过看进程在不在来确定,而是应该通过看是否能提供服务来确定。通过HEALTHCHECK来检测是否能提供服务。

    HEALTHCHECK  instruction HEALTHCHECK  instruction

    option释义:

    --interval含义是每隔多久检测一次主进程

    --timeout含义是超时时长,即多久没响应算为主进程不健康

    --start-period含义是容器启动后等多久开始进行健康检测

    --retries含义是检测多少次失败后认定为不健康

    三个返回值中reserved表示预留的,可以自己定义

    【2.16】Dockerfile中ARG指令

    在Dockerfile中定义的ARG指令可以在docker build 命令中通过--build-arg <变量名>=<变量值>的方式传递自定义参数。

    注意:在docker run时可以向环境变量传值,docker build时不能向环境变量传值,只能用默认值。如果想在docker build时也能给变量定义值,那就得使用ARG。

    ARG instruction

    举个栗子:

    在Dockerfile中:

    ARG author="pony <pony@qq.com>"

    LABEL maintainer="${author}"

    在docker build命令中:

    docker build --build-arg author="andy <andy@qq.com>" -t myweb:v0.3-10 ./

    【2.17】Dockerfile中ONBUILD指令

    ONBUILD指令后面跟的是正常的Dockerfile中的指令如RUN、ADD等等。

    自己做的镜像可以被别人作为基础镜像使用,如果自己做的镜像Dockerfile中写了ONBUILD指令,这个指令后面的Dockerfile指令在自己做image时不会执行。而当别人把你的镜像当做基础镜像,并写在Dockerfile,在他的build时才会执行。

    ONBUILD instructio、

    结束语:到此为止就可以愉快的做镜像了,如果还是不熟练,可以到 docker hub 上看看别人怎么写的,读别人写的Dockerfile可以了解怎么用他的镜像更合适。多读几个应该就会写了。

    点击获取马哥的docker教学视频

    相关文章

      网友评论

        本文标题:Docker使用和Dockerfile详解

        本文链接:https://www.haomeiwen.com/subject/wksscctx.html