Dockerfile名必须叫Dockerfile
Dokerfile官方文档: Dockerfile reference
参考: https://github.com/docker-library
FROM
Dockerfile中的FROM是指定这个Dockerfile是基于哪个bash image构建的,Dockerfile是按顺序运行的指令。一个Dockerfile是用FROM指定启动的,必须放在第一行
> FROM scratch #不依赖其他bash image自己从头创建一个bash image
> FROM centos #利用已有的bash image,在其上build image
<*>尽量使用官方的bash image作为bash image,因为安全
LABEL
Dockerfile中的LABEL是类似与java中的注释描述的作用,必须有LABEL
> LABEL maintainer="lijinlongonly@163.com" #作者
> LABEL version="1.0" #描述
> description="dockerfile demo" #信息
RUN
Dockerfile中的Run用来执行命令,所运行的命令必须是在FROM中指定的bash image中是可以执行的,每运行一条run就会在image中新加一条layer,在编写run是
为了美观最好用"\"来进行换行写命令
为了避免无用分层,合并多条命令为一行RUN(指的是layer分层)
> RUN yum update && yum install -y vim \
python-dev
WORKDIR
Dockerfile中的WORKDIR相当于linux中的cd命令,在Dockerfile中不要使用cd,要使用WORKDIR来取代,而且最好使用绝对路径,因为不确定有多少层目录,cd只能切换目录,而WORKDIR则会在切换目录时如果目录不存在就创建目录,如果存在就切换目录
> WORKDIR /opt/test
> WORKDIR mydir
> RUN pwd #会返回/opt/test/mydir
ADD和COPY
Dockerfile中的ADD和COPY效果都是将本地文件添加到bash
image中,只不过ADD可以解压缩文件,COPY不可以
添加远程文件或目录要使用"RUN curl ..."或者"RUN wget ..."
> ADD abc.tar.gz / #将abc.tar.gz添加到根目录下并解压缩
> COPY abc.tar.gz / #将abc.tar.gz添加到根目录不解压缩
例:
WORKDIR /test
ADD abc demo/
RUN pwd #返回/test/demo/abc
ENV
Dockerfile中ENV是用来设置环境变了或者一些常量的,可以在ENV设置常量后直接使用,尽量使用ENV可以增强Dockerfile的可维护性(比如有多个地方使用了这个常量,需要进行修改时不使用ENV的话,得一个一个改,如果使用了ENV那么就只修改ENV设置的常量值就可以了)
> ENV MYSQL_VERSION 5.6
> RUN yum install -y mysql_service="${MYSQL_VERSION}"
CMD
Dockerfile中CMD是设置容器启动后默认执行的命令和参数
容器启动时默认执行的命令
如果docker run指定了其他命令,CMD会被忽略
如果定义了多个CMD,只会执行最后一个CMD
ENTRYPOINT
Dockerfile中ENTRYPOINT是设置容器启动时执行的命令
让容器以应用程序或服务的形式运行
一定会执行,不会被忽略
Dockerfile中的Shell格式和Exec格式
shell格式:
RUN apt-get install -y vim
CMD echo "hello docker"
ENTRYPOINT echo "hello dockers"
exec格式:
RUN ["apt-get","install","-y","vim"]
CMD ["/bin/echo","hello docker"]
ENTRYPOINT ["/bin/echo","hello docker"]
例: shell格式:
FROM centos
RUN apt-get install -y vim
ENV HELLO hello
ENTRYPOINT echo "$HELLO"
——>docker build -t lijinlong666/entrypoint-shell .
——>docker run lijinlong666/entrypoint-shell #会输出hello
exec格式:
FROM centos
RUN ["apt-get","install","-y","vim"]
ENV HELLO hello
ENTRYPOINT ["/bin/echo","$HELLO"]
——>docker build -t lijinlong666/entrypoint-exec .
——>docker run lijinlong666/entrypoint-exec #会输出$HELLO
#原因是没有用解释器来执行echo命令,而是直接执行echo
#如果也要输出hello,那么ENTRYPOINT就要改为↓
ENTRYPOINT ["/bin/bash","-c","echo $HELLO"]
#修改为Dockerfile要重新build然后执行才可以生效
练习1
目的:使用Dockerfile创建一个应用程序镜像
CentOS上的python没有预装pip
yum -y install epel-release
yum install python-pip #即可安装成功
pip install --upgrade pip #更新一下
>pull一个python2.7
>>docker pull python:2.7
>创建Dockerfile
>>vim Dockerfile
>>FROM python:2.7
>>LABEL maintainer="<lijinlongonly@163.com>"
>>RUN pip install flask
>>COPY app.py /app/
>>WORKDIR /app
>>EXPOSE 5000
>>CMD ["python","app.py"]
>build Dockerfile
>>docker build -t lijinlong666/dockerpythontest1 .
>>docker run -d lijinlong666/dockerpythontest1 #加-d参数为后台运行
练习2
目的:使用Dockerfile创建一个工具(例子为stress测试压力工具)
stress是一个工具,需要通过yum install stress来安装
它具有可选参数,如: --vm 1:为常见一个进程,默认大小为256M
--verbose:打印详细输出
>创建Dockerfile
>>vim Dockerfile
>>FROM ubuntu #基于ubuntu创建镜像
>>RUN apt-get update && apt-get install -y stress #更新安装stress
>>ENTRYPOINT ["/usr/bin/stress"] #执行stress
>>CMD [] #在运行时可以挂载参数
>build Dockerfile
>>docker build -t lijinlong666/stressutils .
>执行压力工具镜像(创建一个进程以默认大小执行打印详细信息)
>>docker run -it lijinlong666/stressutils --vm 1 --verbose