一.Dockerfile介绍
Dockerfile是一种能够被Docker程序解释的剧本。Dockerfile由一条一条指令组成,并且有自己的书写格式和支持的命令。当我们需要在容器镜像中指定自己额外的需求时,只需要在Dockerfile上添加和修改指令,然后通过docker build生成我们自定义的容器镜像(image)
二.Dockerfile指令
1.构建类指令
用于构建image,其指定的操作不会在运行image的容器上运行
FROM MAINTAINER RUN ENV ADD COPY
2. 设置类指令
用于设置image的属性,其指定的指令将在运行的image的容器中执行
CMD ENTRYPOINT USER VOLUME WORKDIR ONBUILD EXPOSE
指令说明
1.FROM
FROM <image>:<tag>
如FROM centos:latest
2.RUN
RUN指令用于构建镜像中执行命令,有以下两种格式
shell格式
RUN <命令>
如 RUN echo 'kunkun' > /var/www/html/index.html
exec格式
RUN ["可执行文件","参数1","参数2"]
如 RUN ["/bin/bash","-C","echo kubkub > /var/www/html/index.html"]
注意:如果有多条RUN指令,应该用&&连接,方便查看
3.CMD
CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时索要执行的命令
格式有三种
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
一个在物理机中执行,一个在容器中执行
每个Dockerfile只能有一条CMD指令,如果有多条CMD指令,只有最后一条会被执行;
如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令
什么是启动容器时指定运行的命令
docker run -d -p 80:80 镜像名 运行的命令
4.EXPOSE
EXPOSE指令用于指定容器在运行时监听的端口
EXPOSE <port> [<port> ....]
如 EXPOSE 80 3306 8080
上述运行的端口还需要使用docker run运行容器时通过 -p 映射到宿主机的端口
5.ENV
ENV指令用于指定一个环境变量
格式:ENV <key> <value> 或者 ENV <key>=<value>
例: ENV JAVA_HOME /usr/local/jdkxxx/
6.ADD
ADD指令用于把宿主机上的文件拷贝到镜像中
ADD <src> <dest>
<src> 可以是本地文件或本地压缩文件吗,也可以是一个url
<dest>路径填写可以是容器内的绝对路径,也可以是相对于工作路径的相对路径
7.COPY
COPY指令与ADD指令类似,但COPY的源文件只能是本地文件
COPY <src> <dest>
8.ENTRYPOINT
ENTRYPOINT和CMD非常类似
相同点:一个Dockerfile只写一条,如果写了多条,只有最后一条生效;
都是容器启动时才运行
不同点:如果用户启动容器时候指定了运行命令,ENTRYPOINT不会被运行的命令覆盖而CMD会被覆盖
ENTRYPOINT ["executable","param1","param2"]
ENTRYPOINT command param1 param2
9.VOLUME
VOLUME指令用于把宿主机里的目录与容器里的目录映射
只指定挂载点,docker宿主机映射的目录为自动生成的
VOLUME ["<mountpoint>"]
10.USER
USER指令设置启动容器的用户(像hadoop需要hadoop用户操作,oracle需要oracle用户操作),可以是用户名或UID
USER daemon
如USER 1001
11.WORKDIR
WORKDIR指令设置工作目录,类似与cd命令。不建议使用 RUN cd /root ,建议使用WORKDIR
WORKDIR /root
三.Dockerfile基本构成
基础镜像信息:如 centos:latest
维护者信息:出问题了该找谁
镜像操作指令:在容器中执行的命令,通常为linux的操作命令
容器启动时执行指令:如CMD
1.Dockerfile生成容器镜像方法
拿到Dokerfile文件后,先build生成image,然后用run根据image生成容器
2.使用dockerfile生成容器镜像案例
第一步:创建一个文件夹
第二步:在文件夹中创建Dockerfile文件及其他文件
第三步:使用docker build命令构建镜像
第四步:使用构建的镜像启动容器
以Dockerfile生成Nginx容器镜像为例
mkdir nginxroot
cd nginxroot
echo "nginx's running" > index.html
vim Dockerfile
Dockerfile文件中的内容
注意:#先下载wget再使用
FROM centos:centos7
MAINTAINER "www.kubemsb.com"
#先安装wget再使用
RUN yum -y install wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum -y install nginx
ADD index.html /usr/share/nginx/html/
#给容器一个进程,使容器处于运行状态
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
#启动nginx
CMD /usr/sbin/nginx
根据Dockerfile生成文件
docker build -t centos7-nginx:v1 .
注意: 如果文件名字不为Dockerfile则命令结尾的 . 应该换成 -f 来指定文件
根据镜像生成容器
docker run -p 10002:80 -d centos7-nginx:v1
然后就可以访问物理机的10002端口来进行访问容器