docker-tips

Tips #

列出所有运行中的容器的端口映射 #

bash
docker ps --format '{{.Names}}' | xargs -n 1 docker port
# 输出样例:
# 80/tcp -> 0.0.0.0:80
# 443/tcp -> 0.0.0.0:443
# 8080/tcp -> 127.0.0.1:8080

docker ps --format '{{.Names}}' | xargs -n 1 -I '{}' bash -c 'echo;echo [{}];docker port {}'
# 输出样例:
#
# [caddy]
# 80/tcp -> 0.0.0.0:80
# 443/tcp -> 0.0.0.0:443
#
# [api]
# 8080/tcp -> 127.0.0.1:8080

删除无tag镜像 #

bash
docker images --filter dangling=true -q | xargs docker rmi

导入、导出镜像 #

导出一个或多个镜像到tar文件或标准输出:

text
docker save [-o|--output FILE] IMAGE [IMAGE...]

从tar文件或标准输入导入镜像:

text
docker load [-i|--input FILE] [-q|--quiet[=true]]

样例1:导入/导出镜像文件 #

bash
# Step 1: 将openjdk8镜像导出为文件openjdk8.img:
docker save -o openjdk8.img openjdk:8
# 或者:
docker save openjdk:8 > openjdk8.img

# Step 2: 上传镜像文件
# ...

# Step 3: 登录目标服务器,下载镜像文件,导入镜像
docker load -i openjdk8.img
# 或者:
docker load < openjdk8.img

# Step 4: 列出所有镜像,检查是否导入成功
docker images

样例2: 通过SSH隧道传输镜像 #

bash
# 把服务器 HOST_A 中的镜像 openjdk:8 传到服务器 HOST_B 中(注意没有进度条):
ssh HOST_A 'docker save openjdk:8' | ssh HOST_B 'docker load'

# 把当前机器上的镜像 openjdk8:8 传到服务器 HOST_A 中(注意没有进度条):
docker save openjdk:8 | ssh HOST_A 'docker load'

备份、还原、转移数据卷 #

bash
# 备份数据卷 VOLUME_A(这是直接挂载卷的方案):
# (注意 docker run 不要添加 -t 参数来分配虚拟 tty,不然会导致导出的文件格式出错)
sudo docker run --rm -v VOLUME_A:/data busybox tar -c -C /data . > VOLUME_A.tar

# 备份数据卷 VOLUME_A(这是从容器 CONTAINER_A 中挂载卷的方案):
# (注意 docker run 不要添加 -t 参数来分配虚拟 tty,不然会导致导出的文件格式出错)
# (注意 /path/to/container/mount-point 指的是数据卷在容器内部当中的挂载点)
sudo docker run --rm --volumes-from CONTAINER_A busybox tar -c -C /path/to/container/mount-point . > VOLUME_A.tar

# 还原数据卷 VOLUME_A:
# (这里的 docker run 需要添加 -i 参数,来保证容器接收标准输入)
sudo docker run --rm -i -v VOLUME_A:/data busybox tar -xv -C /data < VOLUME_A.tar

将一台服务器上的数据卷转移到另一台服务器上:

bash
# 把服务器 HOST_A 的数据卷 VOLUME_A 转移到 HOST_B 中(下面的命令只需在本地执行):

# Step 1: 为 HOST_B 创建一个空数据卷 VOLUME_B(如果已经有了,则不用执行)
ssh HOST_B 'sudo docker volume create VOLUME_B'
# Step 2: 转移数据(在本地执行,通过 ssh 隧道从 HOST_A 中获取数据转移到 HOST_B 的数据卷中)
ssh HOST_A 'sudo docker run --rm -v VOLUME_A:/data busybox tar -c -C /data .' | ssh HOST_B 'sudo docker run --rm -i VOLUME_B:/data busybox tar -xv -C /data'

导出容器内的文件系统(不推荐) #

以tar格式导出容器的文件系统。 (仅保存容器内的所有文件,会丢失镜像信息)

text
Export a container's filesystem as a tar archive

Usage:
    docker export [OPTIONS] CONTAINER

Options:
-o, --output=""
    Write to a file, instead of STDOUT

创建文件系统镜像(不推荐) #

导入tar格式文件中的内容并为此创建一个文件系统镜像。 (运行容器时需要重新指定command)

text
Import the contents from a tarball to create a filesystem image

Usage:
    docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

Options:
-c, --change=
    Apply Dockerfile instruction to the created image
-m, --message=""
    Set commit message for imported image
--platform=""
    Set platform if server is multi-platform capable
2025年8月20日