互联网科技Docker容器Awesome Docker

Docker使用和Dockerfile详解

2019-07-01  本文已影响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教学视频

上一篇下一篇

猜你喜欢

热点阅读