Dockerfile是一种能够被Docker程序解释的剧本。Dockerfile由一条一条指令组成,并且有自己的书写格式和支持的命令。当我们需要在容器镜像中指定自己额外的需求时,只需要在Dockerfile上添加和修改指令,然后通过docker build生成我们自定义的容器镜像(image)
用于构建image,其指定的操作不会在运行image的容器上运行
FROM MAINTAINER RUN ENV ADD COPY
用于设置image的属性,其指定的指令将在运行的image的容器中执行
CMD ENTRYPOINT USER VOLUME WORKDIR ONBUILD EXPOSE
指令说明
- FROM <image>:<tag>
- 如FROM centos:latest
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指令,应该用&&连接,方便查看
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 镜像名 运行的命令
EXPOSE指令用于指定容器在运行时监听的端口
- EXPOSE <port> [<port> ....]
- 如 EXPOSE 80 3306 8080
上述运行的端口还需要使用docker run运行容器时通过 -p 映射到宿主机的端口
ENV指令用于指定一个环境变量
- 格式:ENV <key> <value> 或者 ENV <key>=<value>
- 例: ENV JAVA_HOME /usr/local/jdkxxx/
ADD指令用于把宿主机上的文件拷贝到镜像中
- ADD <src> <dest>
- <src> 可以是本地文件或本地压缩文件吗,也可以是一个url
- <dest>路径填写可以是容器内的绝对路径,也可以是相对于工作路径的相对路径
COPY指令与ADD指令类似,但COPY的源文件只能是本地文件
COPY <src> <dest>
ENTRYPOINT和CMD非常类似
相同点:一个Dockerfile只写一条,如果写了多条,只有最后一条生效;
都是容器启动时才运行
不同点:如果用户启动容器时候指定了运行命令,ENTRYPOINT不会被运行的命令覆盖而CMD会被覆盖
- ENTRYPOINT ["executable","param1","param2"]
- ENTRYPOINT command param1 param2
VOLUME指令用于把宿主机里的目录与容器里的目录映射
只指定挂载点,docker宿主机映射的目录为自动生成的
VOLUME ["" ]
USER指令设置启动容器的用户(像hadoop需要hadoop用户操作,oracle需要oracle用户操作),可以是用户名或UID
- USER daemon
- 如USER 1001
WORKDIR指令设置工作目录,类似与cd命令。不建议使用 RUN cd /root ,建议使用WORKDIR
WORKDIR /root
基础镜像信息:如 centos:latest
维护者信息:出问题了该找谁
镜像操作指令:在容器中执行的命令,通常为linux的操作命令
容器启动时执行指令:如CMD
拿到Dokerfile文件后,先build生成image,然后用run根据image生成容器
第一步:创建一个文件夹
第二步:在文件夹中创建Dockerfile文件及其他文件
第三步:使用docker build命令构建镜像
第四步:使用构建的镜像启动容器
- 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端口来进行访问容器