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