Docker-4 DockerFile
1. DockerFile是什么
-
用来构建Docker镜像的构建文件,是由一些列的命令和参数构成的脚本
-
构建步骤:
- 创建DockerFile文件
- docker build
- docker run
-
规范:
- 每条保留字指令都必须为大写字母,且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
2. DockerFile 保留字指令
-
From 基础镜像,当前镜像是基于哪个镜像的
-
MAINTAINER 镜像维护者姓名和邮箱
-
RUN 容器构建时需要运行的命令
-
EXPOSE 当前容器对外暴露的端口
-
WORKDIR 指定创建容器后,终端默认登录进来的目录
-
ENV 在构建镜像过程中设置环境变量
-
ADD 将宿主机目录下的文件拷贝进镜像,且ADD命令会自动处理URL和解压缩tar包
-
COPY 拷贝文件和目录到镜像中。
COPY src dest COPY ["src", "dest"]
-
VOLUME 容器数据卷,用于持久化和共享数据
-
CMD 指定容器启动时要运行的命令。Dockerfile可以有多个CMD指令,但只有最后一个会生效。CMD会被docker run之后的参数替换
-
ENTRYPOINT 指定容器启动时要运行的命令。
-
ONBUILD 构建一个被继承的Dockerfile时运行命令。父镜像在被子镜像集成后,父镜像的onbuild被触发。
3. 案例:自定义centos
- 编写
cd mydocker/
vim Dockerfile01
# 编写DockerFile
FROM centos
MAINTAINER aaa<aaa@123.com>
# 定义环境变量
ENV MYPATH /usr/local
# 登录后的路径设置为 /usr/local
WORKDIR $MYPATH
# 安装vim
RUN yum -y install vim
# 安装net-tools(ifconfig命令)
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--->ok"
CMD /bin/bash
-
构建
# 最后的.代表当前目录 docker build -f /mydocker/Dockerfile01 -t mycentos:1.0 . # 构建完成后查看镜像 docker images
-
运行
docker run -it mycentos:1.0
运行后,进入的路径是/usr/local
-
列出镜像的历史
docker history 镜像ID
4. 案例:CMD和ENTRYPOINT
-
编写
cd mydocker/ vim Dockerfile02 FROM centos RUN yum install -y curl CMD [ "curl", "-s", "http://ip.cn"]
-
构建
docker build -f /mydocker/Dockerfile02 -t myip . docker images
-
运行
docker run -it myip
此时能查到IP信息。
但若想要看请求头信息,使用docker run -it myip -i,则会有如下报错,原因是加上-i以后,相当于在Dockerfile最后加上了CMD -i,导致CMD [ “curl”, “-s”, “http://ip.cn”]被替换。
此时将CMD命令改为ENTRYPOINT,再执行docker run -it myip -i就不会报错。
cd mydocker/ vim Dockerfile02 FROM centos RUN yum install -y curl ENTRYPOINT [ "curl", "-s", "http://ip.cn"]
5. 案例:ONBUILD
-
编写父Dockerfile
cd mydocker/ vim Dockerfile03 FROM centos RUN yum install -y curl ENTRYPOINT [ "curl", "-s", "http://ip.cn"] ONBUILD RUN echo "father image onbuild..."
-
构建父镜像
docker build -f /mydocker/Dockerfile03 -t myip_father .
-
编写子Dockerfile
cd mydocker/ vim Dockerfile04 FROM myip_father RUN yum install -y curl ENTRYPOINT [ "curl", "-s", "http://ip.cn"]
-
构建子镜像
docker build -f /mydocker/Dockerfile04 -t myip_son .
此时,会打印出“father image onbuild…”