Docker之dockerfile命令详解

1.容器的生命周期:

* 检查本地是否存在镜像,如果不存在即从远端仓库检索

* 利用镜像启动容器

* 分配一个文件系统,并在只读的镜像层外挂载一层可读写层

* 从宿主机配置的网桥接口中桥接一个虚拟接口到容器

* 从地址池配置一个IP地址给容器

* 执行用户指定的指令

* 执行完毕后容器终止

2.Dockerfile的规则:

 * 格式:

  1)#为注释

  2)指令(大写)内容(小写)

  3)尽管指令是大小写不敏感的,但是,我们强烈建议指令用大写,内容用小写表示

* Docker是按顺序执行Dockerfile里的指令集合的(从上到下依次执行)

* 每一个Dockerfile的第一个非注释行指令,必须是“FROM”指令,用于为镜像文件构建过程中,指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境中。

*实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build 会在docker 主机(本地)上查找指定的镜像文件,当其他本地不存在时,则会从Docker registry(远端)上拉取所需镜像文件。

4组 核心的Dockerfile 指令

* USER/WORKDIR指令

*ADD/EXPOSE指令

*RUN/ENV指令

*CMD/ENTRYPOINT指令

===========================================================

(1)USER/WORKDIR指令:

      /data/dockerfile/Dockerfile

    FROM  stanleyws/nginx:v1.12.2 

    USER  nginx 

    WORKDIR  /usr/share/nginx/html 

     WORKDIR 类似于 cd:

[root@docker  dockerfile]#  docker build . -t docker.io/oldboy1103/nginx:v1.12.2_with_user_workdir   

[root@docker  dockerfile]# docker run --rm -ti --name nginx123 oldboy1103/nginx:v1.12.2_with_user_workdir /bin/bash    

===========================================================

(2)ADD/EXPOSE指令

     /data/dockerfile/Dockerfile 

    FROM stanleyws/nginx:v1.12.2 

    ADD index.html /usr/share/nginx/html/index.html 

    EXPOSE 80

[root@docker  dockerfile]# vi Dockerfile

    FROM stanleyws/nginx:v1.12.2

    ADD index.html /usr/share/nginx/html/index.html 

    EXPOSE 80

[root@docker  dockerfile]# docker build . -t stableyws/nginx:v1.12.2_with_index_expose 

[root@docker  dockerfile]# docker images 

===========================================================

(3)RUN/ENV 指令

     /data/dockerfile/Dockerfile 

    FROM centos 

    ENV VER 9.9.4-74.el7_6.1 

    RUN yum install bind-$VER -y 

# 构建镜像:

[root@docker  dockerfile]#  docker build . -t stanleyws/bind:v9.9.4_with_env_run 

# 运行容器:

[root@docker  dockerfile]# docker run --rm stanleyws/bind:v9.9.4_with_env_run rpm -qa bind

bind-9.9.4-74.el7_6.1.x86_64

===========================================================

(4)CMD/ENTRYPOINT指令

## CMD和ENTRYPOINT指令作用相同,使用方法略有不同

1.CMD指令
/data/dockerfile/Dockerfile 

FROM centos 

RUN yum install httpd -y 

CMD ["httpd","-D","FOREGROUND"]

构建镜像:

[root@docker  dockerfile]#  docker build . -t stanleyws/httpd:myhttpd

[root@docker  dockerfile]#  vi Dockerfile 

  FROM centos 

  RUN yum install httpd -y 

  CMD ["httpd","-D","FOREGROUND"]

[root@docker  dockerfile]# docker run -d --rm --name myhttpd -p83:88 oldboy1103/httpd:test 

2e12804350b12b0916fe

[root@docker  dockerfile]# docker ps -a 

2.ENTRYPOINT指令:

/data/dockerfile/Dockerfile 

FROM centos

ADD entrypoint.sh /entrypoint.sh 

RUN yum install epel-release -q -y && yum install nginx -y 

ENTRYPOINT /entrypoint.sh 

entrypoint.sh 

/data/dockerfile/entrypoinot.sh 

#!/bin/bash 

/sbin/nginx -g "daemon off;"

[root@docker  dockerfile]#  docker exec -ti compassionate_solomon /bin/bash 

[root@docker  dockerfile]#  vi dockerfile 

  FROM centos

  ADD entrypoint.sh /entrypoint.sh 

  RUN yum install epel-release -q -y && yum install nginx -y 

  ENTRYPOINT /entrypoint.sh 

   entrypoint.sh 

===========================================================

(5)综合实验:

      运行一个docker容器,在浏览器打开demon.od.com能访问到百度首页

准备Docker 镜像:

/data/dockerfile/nginx/Dockerfile 

FROM stanleyws/nginx:v1.12.2 

USER root 

ENV www /usr/share/zoneinfo/Asia/shanghai /etc/localtime &&\

echo 'Asia/Shanghai' >/etc/timezone 

WORKDIR $www 

ADD index.html  $www/index.html

ADD demo.od.com.conf $CONF /demo.od.com.conf 

EXPOSE 80 

CMD ["nginx","g","damon off;"]

index.html 

/data/dockerfile/nginx/index.html

[root@docker  dockerfile]#  wget www.baidu.com -O index.html 

[root@docker  dockerfile]#  vi demo.od.com.conf 

server {

listen 80;

server_name demo.od.com;

root /usr/share/nginx/html;

}

[root@docker  dockerfile]#  docker run --rm -P oldboy1103/nginx:baidu 

你可能感兴趣的:(Docker之dockerfile命令详解)