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)