Docker 总结

156 阅读2分钟

1. 多个 CMD 指令会执行几次?

答:只有最后一个 CMD 指令会执行

# Dockerfile
FROM centos
CMD echo "hello first"
CMD echo "hello second"

2. RUN 指令什么时候执行?

答:RUN 指令在构建镜像的时候执行。每次执行 RUN 都会产生一层镜像,所以执行命令尽量写在一个 RUN 里面

3. CMD 指令什么时候执行?

答:CMD 指令在容器运行的时候执行

4. COPY 指令什么时候执行,拷贝源文件相对的根目录是哪个?

答:COPY 命令在构建镜像的时候执行。根目录是 build 时指定的目录

5. WORKDIR 指令的作用

答:接上题4,WORKDIR 可以永久改变根目录

6. docker run 命令 -P 和 -p 参数的区别

答:-p 指定外部端口和内部端口;-P 随机产生一个外部端口,内部端口由 Expose 指定

7. CMD指令 和 Entrypoint指令 的区别

答:CMD 只能原样执行命令,Entrypoint 可以交互指定命令参数

8. docker run 命令 -d 参数可以让容器一直运行吗?

答:-d 不会让容器一直运行,容器是否长久运行和 docker run 指定的命令有关和 -d 参数无关

9. docker run 命令 -d 参数的作用

答:-d 让 docker 在后台运行而不是直接把执行命令的结果打印在前台

10. 如何创建一个一直运行的容器

# Dockerfile 
FROM centos
COPY /startup.sh /startup.sh
CMD ["bash","./startup.sh"]

# startup.sh
#!/bin/bash
while true
  sleep 2
done

# 执行以下命令查看效果
docker build -t test:0 .
docker run -d test:0
docker container ls

11. 容器的根目录是什么?

答:容器的根目录是 FROM 镜像的根目录

12. Expose 的作用?

答:Expose声明定义了内部容器的端口,一般和 -P 参数一起使用

13. 声明式 Volumes 和 绑定挂载点 的区别

答:

Named Volumes 可以在启动时,将容器的内容刷新到 volume 中

Bind Mount 在启动时,不能将容器的内容刷新到 volume 中,所以Bind Mount必然存在完整的待映射的源文件

不好解释,就说下使用场景吧:

Named Volumes 可以用来做数据库的映射,简而言之,容器内部产生的数据提供给外部

Bind Mount 用来做给容器提供额外的数据(源码的映射),简而言之,外部提供数据给容器

总结:

Named Volumes 用来持久化容器内部产生的数据如 SQLite、MySQL 等关系型数据库的数据

Bind Mount 用来给容器提供额外数据(如源码、配置信息等),这样可以避免不必要的 Build Image

14. 容器解析域名策略

Docker 通过复制主机的 /etc/resolv.conf 来填充 /etc/resolv.conf,并过滤掉任何本地名称服务器,例如 127.0.1.1。如果之后没有域名服务器,Docker 将添加 Google 的公共 DNS 服务器(8.8.8.8 和 8.8.4.4)