1. Dockerfile是什么:
Dockerfile是一个用来构建镜像的文本文件,包含了一系列构建镜像所需要的指令和说明。
2. Dockerfile的大致流程:
- docker从基础镜像运行一个容器
- 执行一个指令并且对容器进行修改
- 执行类似于docker commit的操作提交一个新的镜像
- docker基于刚提交的镜像再运行一个新的容器
- 继续向下直到命令都完成
3. 注意事项:
- 每个保留字按规则应该大写(实际不区分大小写),后面至少跟一个参数
- 指令是顺序执行的
#
表示注释- 每个指令都会创建一个新的镜像并对镜像进行commit
4. 常用的保留字指令
4.1 FROM
出现在第一行,代表要构建的镜像来自于哪。(相当于指定一个镜像作为模板,在它的基础上添加各种环境)
4.2 MAINTAINER
镜像维护者的姓名和邮箱地址
4.3 RUN
容器构建时执行的命令,分为两种格式:
- shell格式 (
RUN sudo apt-get install xxx
) - exec格式 (
RUN ["./main", "hello"]
=> 等价于RUN ./main hello
)
4.4 EXPSOE
暴露出的端口映射,相当于-P 或者 -p
4.5 WORKDIR
终端进入的工作目录,WORKDIR /home/jerry/java_workspace
=> 等价于 cd /home/jerry/java_workspace
4.6 USER
指定镜像以哪个用户去执行,如果不指定默认是root(执行之前得保证存在这个用户,没有的话可以RUN命令创建一个,不怎么用)
4.7 ENV
环境变量,可以在后续的指令中使用。
ENV MySpace /home/jerry/java_workspace
# 进入工作目录 $是shell语法取变量
WORKDIR $MySpace
4.8 VOLUME
容数据卷,用于数据保存和持久化工作。相当于docker run -v xxx:xxx
但是无法像命令启动挂载一样指定宿主机目录,只能自动生成
4.9 COPY | ADD
COPY命令相当于将宿主机目录下的文件拷贝到镜像中,docker cp
命令
ADD命令 = COPY + 处理URL + 解压tar
4.10 CMD
CMD指定容器启动后需要做什么事情。可以有多个,但是只有最后一个会生效。并且docker run
后面的跟着的命令参数会覆盖掉它。
RUN命令在构建镜像时运行,CMD在docker run执行
4.11 ENTRYPOINT
类似于CMD,但是不会被docker run
后的命令覆盖掉
ENTRYPOINT和CMD可以一起使用,指定了ENTRYPOINT之后,CMD就不会直接执行命令,而是将内容传递给ENTRYPOINT做参数。
5. 实践
docker pull centos:7
docker run -it centos /bin/bash # 此时进入的容器是没有vim等环境的
目标,使用dockerfile对centos进行改造 让它具有vim + ifconfig:
编写Dockerfile
文件
FROM centos:7
MAINTAINER jerry<xx@163.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
# install vim
RUN yum -y install vim
# install ifconfig
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "success ------------------ ok "
CMD /bin/bash
之后构建 docker build -t image_name:tag .
运行:docker run -it image_name:tag /bin/bash