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
。
- 默认情况
版本¶
Docker 官方和 Debian APT 的打包策略不同。
在 Debian APT 中,相关软件包说明如下:
docker.io
守护进程docker-cli
命令行工具docker-compose
服务编排工具(独立命令docker-compose
)
在官方仓库,相关软件包如下:
docker-ce
守护进程docker-ce-cli
命令行工具docker-compose-plugin
作为 Docker CLI 的插件(子命令docker compose
)
目前,Debian 源中的 docker-compose
仍然是 v1 版本(Python 编写),而官方仓库中的 docker-compose-plugin
是 v2 版本(Go 编写)。Debian 团队正在努力将 v2 版本打包到源中。最新进展可见 Debian Bug Report。截止 2024 年 7 月,v2 版本的 Go 依赖处理仍在进行中。
OpenWRT 上的 docker-compose 也是 v1 版本。
命令¶
Docker Compose 运行自定义命令
Docker 容器只会执行一条命令,该命令退出后容器也会退出。执行的命令由如下方式决定:
- 如果容器未定义 entrypoint,那么执行 command。
- 如果容器定义了 entrypoint,那么执行 entrypoint,将 command 作为 entrypoint 的参数。
为容器提供 entrypoint 和 command 的方式如下:
运行方式 | 定义 entrypoint | 定义 command |
---|---|---|
docker run |
--entrypoint <entrypoint> 选项 |
镜像名后的参数 |
Dockerfile | ENTRYPOINT 指令 |
CMD 指令 |
Compose 文件 | entrypoint: |
command: |