前端 10 问之 Docker (第一篇)

674 阅读3分钟

1、容器技术解决了什么问题?

解决了开发人员和运维人员的沟通

  • 容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
  • 容器化软件适用于基于Linux和Windows的应用,在任何环境中都能够始终如一地运行。
  • 容器赋予了软件独立性 ,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。

一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。

2、docker 底层用了哪些技术?

  • namespace:做隔离pid,net,ipc,mnt,uts
  • control groups:做资源限制
  • union file systems:container和image的分层

3、容器和虚拟机有什么区别?

  • 容器是APP层面的隔离,虚拟化是物理层面的隔离;
  • 容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动。
  • 每个VM都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源,因此占用大量空间。而且 VM 启动也相对缓慢。

4、什么是 DevOps?

DevOps是一种重视“软件开发人员(Development)”和“IT运维技术人员(Operations)”之间沟通合作的文化、运动或惯例。通过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。具体来说,就是在软件交付和部署过程中提高沟通与协作的效率,旨在更快、更可靠的的发布更高质量的产品。

5、image 与 container 的区别?

image

  • 文件和 meta data 的集合
  • 分层的,每一层可以添加改变删除文件,成为一个新的Image
  • 不同的 image 可以共享相同的 layer
  • 本身是 read-only 的

container

  • 通过 image 创建
  • 在 image layer 上建立一个 container layer(可读写)

image 负责 app 的存储和分发,container 负责运行 app

6、如何停止所有运行的容器?

docker rm `docker ps -aq`

7、如何删除所有已停止的容器?

# 删除所有已停止的容器
docker rm $(docker ps -a -f"status=exited" -q)

# 或者
docker ststem prune

8、Dockerfile 中 COPY 与 ADD 的区别?

ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能,它可以自动解压缩文件。

另外需要注意的是,ADD 指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。

因此在 COPY 和 ADD 指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD。

9、容器的端口是怎么映射到 host 主机上的?

容器所有到外部网络的连接,源地址都会被 NAT 成本地系统的 IP 地址。这是使用 iptables 的源地址转发实现的。

以 ubuntu16.04 做实验,参考如下:

用 docker 创建一个 nginx 服务:

docker run -p 9999:80 -d nginx

docker ps查看,可以看到nginx容器正在运行:

用 iptables 查看当前防火墙,执行:

iptables -t nat -nL

可以看到 Chain DOCKER172.17.0.5:80 被转发到了宿主机的 9999 端口

10、为什么两个容器可以互相 ping 通?

借助 网桥、VETH 的能力。

Docker 服务默认会创建一个 docker0 网桥,所有容器创建时都会通过veth默认链接到这个网桥上。

觉得不错可以 star 这个 repo 关注更多内容。