Docker面试经常被问到的问题,一直困扰自己。希望可以帮助到你,望君面试顺利。
Docker创建镜像
dockerfile文件
dockerfile:构建docker镜像的配置文件,包含了一条条的指令,来告知如何去创建docker镜像。
常用参数:
参数 | 含义 |
---|---|
FROM(*) | 指定基础镜像,是dockerfile中最重要的参数。 |
WORKDIR(*) | 指定shell语句执行到哪个目录下,不存在则自动创建 |
COPY(*) | 将当前主机上的文件拷贝到容器某目录下(推荐) |
ADD | 和COPY类似,除了本机目录外,也可以是url资源 |
RUN(*) | 构建时运行shell语句 |
CMD(*) | 运行时运行shell语句(推荐) |
ENTRYPOINT | 和CMD类似,不过优先级比CMD高 |
EXPOSE | 指定暴露端口 |
VOLUME | 数据卷 |
ENV | 参数,作用域为构建镜像到容器运行结束 |
ARG | 参数,作用域为构建镜像的过程 |
LABEL | 指定元数据信息,对镜像没有影响。做标识 |
ONBUILD | 当基于此镜像进行构建镜像时,会被继承。 |
STOPSIGNAL | 指定信号来终止容器(不常用) |
HEALTHCHECK | 检查容器健康状态 |
SHELL | 指定文件使用的shell类型 |
CMD的json格式可参考:博客
注意:
RUN是构建镜像时运行的脚本,CMD是容器运行时运行的脚本,脚本运行结束之后容
器的生命周期结束。
当文件中同时存在CMD和ENTRYPOINT时,如果ENTRYPOINT是非json格式时,则按
照ENTRYPOINT执行。如果二者都是json格式,则将二者拼接成shell。
EXPOSE:如nginx暴露端口为80,可以使用docker inspect nginx查看详细信息。
这样做的好处是,可以在运行镜像时通过P参数来端口映射
构建镜像:
docker build -t [name]:[version] /path/to/dockerfile
举例:docker build -t test:1.0 /root/docker
运行镜像
docker run [name]:[version]
实例:基于alpine构建镜像
1.先编写简单的Dockerfile文件
[root@localhost ~]# cat Dockerfile
FROM alpine
WORKDIR /app
COPY ./test.txt /app/
run echo "world!" >>test.txt
cmd cat test.txt
2.构建镜像以及运行镜像。
[root@localhost ~]# docker build -t test .
Sending build context to Docker daemon 16.9kB
Step 1/5 : FROM alpine
Step 2/5 : WORKDIR /app
Step 3/5 : COPY ./test.txt /app/
Step 4/5 : run echo "world!" >>test.txt
Step 5/5 : cmd cat test.txt
[root@localhost ~]# docker run test
hello
world!
更好的理解参数ENV和ARG:
3.1在Dcokerfile文件中添加参数
ENV A=10
CMD echo $A
3.2构建镜像以及运行镜像。
[root@localhost ~]# docker run test
10
4.1在Dcokerfile文件中添加参数
ARG B=11
CMD echo $B
4.2构建镜像以及运行镜像
[root@localhost ~]# docker run test
另外需要注意的是,Dockerfile文件中定义的ARG参数是默认值,我们在运行镜像时,可以通过–build-arg B=12进行重新赋值。