Docker 笔记 ongoing
服务器上安装最新版 Docker
参考 Install Docker Engine - Docker Docs.
#!/bin/sh
# Uninstall all conflicting packages.
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do
sudo apt-get remove $pkg
done
# Install dependecies.
sudo apt-get update
sudo apt-get install ca-certificates curl
# Add Docker's official GPG key.
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources.
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo \"$VERSION_CODENAME\") stable" | sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
# Install the latest version.
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin容器无法立即停止运行
有时候会遇到这个问题: docker compose down 命令无法立即停止容器 (需要等待 10 秒左右).
原因是: 容器中用于接受 Ctrl+C 信号的进程 PID 为 1, 而 Linux 做了特殊处理:
默认情况下 Linux 不会在收到 SIGTERM 或 SIGINT 信号后杀死 PID 为 1 的进程.
所以 docker compose down 之后, 会一直等待, 直到达到了默认的 timeout (10 秒).
最佳解决方案: 在程序内实现 SIGTERM 的处理逻辑 (也就是 graceful shutdown).
如果在程序中实现了 graceful shutdown, 但等待时间依然较长, 可能会影响迭代速度.
此时可以考虑在开发中使用以下命令中的任意一个:
# 此命令的不会移除容器实例, 还需进一步操作
docker compose kill
# 将 timeout 设置为 0, 会立即停止并移除容器实例
docker compose down --timeout 0另外也可以考虑在执行 docker run xxx 命令启动容器时, 使用 --init 选项.
若使用 docker compose, 可以在 compose.yaml 中的 service 层级下, 添加 init: true.
services:
my-service:
# 在服务中启用 init 进程,
# 这将确保容器在收到停止信号时及时被关闭.
init: true
# ...构建多平台的容器镜像
需要启用名为 containered image store 的设置项:

对应的构建命令如下:
# 构建同时支持 linux/amd64 和 linux/arm64 两个平台的容器镜像
docker build -t [name] --platform linux/amd64,linux/arm64 .当 multi-platform image 被推送至 Docker Hub 后, 可以观察到:

配置共享内存的大小
共享内存 (全称 shared memory, 简称 shm) 允许多个进程访问相同的内存区域.
Docker 容器实例默认的共享内存大小为 64 MB, 对于需要更大共享内存的程序, 应专门配置.
在 compose.yaml 中可以通过 shm_size 字段配置共享内存的大小:
version: '3'
services:
my-service:
image: my-image
shm_size: 256MTIP
通过 Docker 部署 GitLab 时, 官方文档中建议选择 256 MB 大小的共享内存.
首次向容器技术迁移
# 根据工程文件结构 (自动判断所用的技术栈),
# 并触发交互式命令行, 让开发者手动补充部分信息.
docker init最后会生成以下四个文件:
- .dockerignore
- Dockerfile
- README.Docker.md
- compose.yaml
在容器中构建容器镜像
在 CI/CD 管线中, 为了保证环境的一致性, 我们很可能会选择在容器环境中执行 job.
此时如果某个 CI/CD job 中打算构建容器镜像, 那么这就是 "在容器中构建容器镜像".
最常见的实现方案是 Docker in Docker (dind), 但此方案存在 安全性 和 性能 的缺陷.
笔者更倾向于使用 kaniko (结合 GitLab CI/CD 请参考 Using kaniko - GitLab Docs).