📒 容器技术¶
Docker 原理¶
- 镜像构建
- Docker 镜像构建为前后端架构:Buildx 为客户端,BuildKit 为服务端。
- 存储
- 默认情况
- 位于
/var/lib/docker
,卸载时不会自动清除。 - 层次化结构,由 Image 层(只读)和 Container 层(运行时数据,可写)组成。如果需要修改 Image 层数据,采用 copy-on-write 方式。
- 与容器强绑定,容器删除后数据也消失。
- 位于
- 持久化存储
- Volume:
- 在
/var/lib/docker/volumes
下创建,不随容器消失。 - 可以放置在远端存储。
- 使用
docker volume
命令操作,
- 在
- Bind mount:
- 挂载宿主机的文件系统。
- 允许挂载 NFS(使用 Docker 自己的 NFS 驱动,即不需要在宿主机上挂载)。
- Volume:
- 默认情况
-
网络
- 网络对容器透明,它只能看到一个具有 IP 地址的网络接口、网关、路由表和 DNS 服务。
- 在 Linux 上,Docker 使用 iptables 实现网络。目前有迁移到 nftables 的计划。
- Docker 自动为
FORWARD
链添加DROP
策略,阻止宿主机作为路由器。如果需要,应当手动添加规则。 - 支持的网络驱动有:
bridge
(默认)、host
、none
、overlay
、ipvlan
、macvlan
。 bridge
:部署时建议使用用户定义的bridge
网络。- 默认网桥
bridge
:- 自动创建,容器默认连接到该网桥。
- 容器间只能通过 IP 地址通信。需要使用
--link
参数在双方创建连接才能使用自动 DNS。 - 必须停止容器才能移出默认网桥。
- 用户定义
bridge
:- 自动 DNS 功能:容器可以使用 IP 地址或容器名相互沟通。
- 热插拔:不需要关闭容器即可移动到其他网络。
- 默认网桥
Compose 中的网络
Compose 会自动为应用创建一个网络,容器可以通过服务名相互访问。
host
:- 端口映射不生效。
- 端口映射:
- Docker 使用 iptables 进行相关 NAT、PNAT 和 masquerade 操作。
- 默认情况下所有外部主机都能访问公开端口,如果需要限制,需要自己写 iptables 规则。
- IPv6 下可能配置为直连路由。
-p host:docker
- 容器
- 重启策略:
no
、always
、unless-stopped
、on-failure
。