跳转到内容
Go back

Docker 使用简记

更新于:

Docker 使用简记

编译镜像

编译 Dockerfile,打包镜像

Docker Buildx 是一个 docker CLI 插件,在 Debian 13 下,对应的包名为 docker-buildx-plugin

docker build -t anki-sync-server:latest -f Dockerfile .

# 或者
docker buildx build -t anki-sync-server:latest -f Dockerfile .

更新 Docker-compose 基础镜像

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具,其通过 .yaml 文件来进行配置管理,这样便于统一管理和后续的配置调整。

似乎修改 docker-compose.yml 之后,直接运行 docker-compose up -d 也可以

docker-compose down

# 修改 docker-compose.yml
# 启动

docker-compose up -d

清理占用空间

清理空间占用

docker 的空间占用主要分成四个部分

  1. Images(镜像)
  2. Containers(容器)
  3. Local Volumes(本地卷)
  4. Build Cache(构建缓存)

可以通过入下命令查看 docker 各部分的空间占用

# 查看 docker 的磁盘占用
docker system df

示例命令

注意:在执行这些命令之前,请确保你真的不再需要这些资源,因为这些操作是不可逆的

# 删除未使用的镜像
docker image prune -a

# 清理未使用的容器
docker container prune

# 删除未使用的本地卷
docker volume prune
docker volume prune --force

# 删除所有卷(使用循环)
docker volume ls -q | xargs -r docker volume rm

# 清理构建缓存
docker builder prune
docker builder prune --force

# 清理所有构建缓存
docker builder prune --all

# 所有未使用的资源(镜像、容器、网络、本地卷、构建缓存)
# 慎用,会删除编译好的镜像
docker system prune --all --volumes
docker system prune --volumes --force

参数说明:

清除悬空镜像(空标签镜像)

# 清除空标签镜像
docker rmi $(docker images -f "dangling=true" -q)
docker images --filter "dangling=true" -q | xargs -r docker rmi

批量删除带指定关键字的镜像

使用 docker images 列出所有镜像,然后使用 --format 选项格式化输出为 repository:tag 形式

使用 parallel 命令进行删除

docker images --format '{{.Repository}}:{{.Tag}}' | grep 'php' | parallel docker rmi

# 或者

docker images | awk -v OFS=":" '/php/{print $1,$2}' | parallel docker rmi {}

使用 xargs 命令进行删除,所有带 PHP 标签的镜像

docker images --format '{{.Repository}}:{{.Tag}}' | grep 'php' | xargs -I {} docker rmi {}

快速导出和导入镜像

我们可以把本地编译好的镜像存储为 tar 包来进行分享,Docker 的镜像和容器可以有两种方式来导出

docker save #ID or #Name

docker export #ID or #Name

docker save -o <image-name>.tar <image-name>

当需要使用镜像时则可以通过 docker load 命令来加载 tar 包:

docker load -i <image-name>.tar

docker load -i docker_images/template_run_v0.1.tar

导出镜像

#!/usr/bin/env bash

# 创建文件夹
mkdir -p /tmp/docker_images

# 清除空标签镜像
docker images --filter "dangling=true" -q | xargs -r docker rmi

# 导出镜像
docker images --format '{{.ID}} {{.Repository}}:{{.Tag}}' --filter "dangling=false" \
  | sed -e 's/\//_/g' -e 's/:/_/g' \
  | while read -r line; do
      repo_tag=$(echo "$line" | awk '{print $2}')
      output_file="/tmp/docker_images/$(echo "$repo_tag" | sed 's/ /_/g').tar"
      docker save -o "$output_file" $(echo "$line" | awk '{print $1}')
    done

# 从镜像列表生成元信息
docker images --format '{{.ID}} {{.Repository}}:{{.Tag}}' | sed 's/^/docker tag /g' | tee /tmp/docker_images/images_list.txt

还原镜像

#!/usr/bin/env bash

# 导入镜像
echo 'find /tmp/docker_images -name *.tar -type f -exec docker load -i {} \;' > /tmp/docker_images/import.sh

# 修正标签信息
echo 'bash -x /tmp/docker_images/images_list.txt'
# 清除空标签镜像
docker images --filter "dangling=true" -q | xargs -r docker rmi

命令参数说明

使用 Cf 加速拉取镜像

重命名镜像步骤:

  1. 通过加速链接拉取镜像
  2. 修改镜像标签,移除镜像名称中的加速链接相关的字符串
  3. 删除原始标题镜像

示例命令:

docker tag anki/syncd:v24.04 anki/syncd:v24.04

docker rmi anki/syncd:v24.04

使用 cf 加速镜像下载,然后重命名标签

# 拉取镜像
docker pull cf-workers-docker-io-51m.pages.dev/library/alpine:latest

# 重命名镜像
docker tag cf-workers-docker-io-51m.pages.dev/library/alpine:latest alpine:3.20.0

# 删除 cf 标签镜像
docker rmi cf-workers-docker-io-51m.pages.dev/library/alpine:latest

登录到私有仓库

docker login 命令用于登陆到一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub

如下命令可以登录到指定私有仓库:

┌──(hacker💀MacBook)-[~]
└─$ docker login -u user --password $pass docker.target.com

WARNING! Using --password via the CLI is insecure. Use --password-stdin.

Login Succeeded

参数:

注意:关于使用 --password 的警告问题

  1. 从安全角度来说,最好还是使用 --password-stdin 参数进行登录会比较好
  2. 但如果是在 GitHub action 中使用,通过环境变量的方式进行凭据的传递的话,倒也无妨

报错和解决方案记录

Docker-compose 1.29.2 启动容器报错

Docker-compose 1.29.2 运行容器时报错 docker.errors.DockerException: Error while fetching server API version: Not supported URL scheme http+docker

Docker-compose 版本:

┌──(hacker💀MacBook)-[~]
└─# docker-compose version
docker-compose version 1.29.2, build unknown
docker-py version: 5.0.3
CPython version: 3.11.2
OpenSSL version: OpenSSL 3.0.11 19 Sep 2023

完整报错:

vagrant@node-1:/services$ docker-compose up
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/dist-packages/requests/adapters.py", line 633, in send
    conn = self.get_connection_with_tls_context(
  File "/usr/local/lib/python3.10/dist-packages/requests/adapters.py", line 489, in get_connection_with_tls_context
    conn = self.poolmanager.connection_from_host(
  File "/usr/lib/python3/dist-packages/urllib3/poolmanager.py", line 245, in connection_from_host
    return self.connection_from_context(request_context)
  File "/usr/lib/python3/dist-packages/urllib3/poolmanager.py", line 257, in connection_from_context
    raise URLSchemeUnknown(scheme)
urllib3.exceptions.URLSchemeUnknown: Not supported URL scheme http+docker

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/dist-packages/docker/api/client.py", line 214, in _retrieve_server_version
    return self.version(api_version=False)["ApiVersion"]
  File "/usr/local/lib/python3.10/dist-packages/docker/api/daemon.py", line 181, in version
    return self._result(self._get(url), json=True)
  File "/usr/local/lib/python3.10/dist-packages/docker/utils/decorators.py", line 46, in inner
    return f(self, *args, **kwargs)
  File "/usr/local/lib/python3.10/dist-packages/docker/api/client.py", line 237, in _get
    return self.get(url, **self._set_request_timeout(kwargs))
  File "/usr/local/lib/python3.10/dist-packages/requests/sessions.py", line 602, in get
    return self.request("GET", url, **kwargs)
  File "/usr/local/lib/python3.10/dist-packages/requests/sessions.py", line 589, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python3.10/dist-packages/requests/sessions.py", line 703, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python3.10/dist-packages/requests/adapters.py", line 637, in send
    raise InvalidURL(e, request=request)
requests.exceptions.InvalidURL: Not supported URL scheme http+docker

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/bin/docker-compose", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.10/dist-packages/compose/cli/main.py", line 81, in main
    command_func()
  File "/usr/local/lib/python3.10/dist-packages/compose/cli/main.py", line 200, in perform_command
    project = project_from_options('.', options)
  File "/usr/local/lib/python3.10/dist-packages/compose/cli/command.py", line 60, in project_from_options
    return get_project(
  File "/usr/local/lib/python3.10/dist-packages/compose/cli/command.py", line 152, in get_project
    client = get_client(
  File "/usr/local/lib/python3.10/dist-packages/compose/cli/docker_client.py", line 41, in get_client
    client = docker_client(
  File "/usr/local/lib/python3.10/dist-packages/compose/cli/docker_client.py", line 170, in docker_client
    client = APIClient(use_ssh_client=not use_paramiko_ssh, **kwargs)
  File "/usr/local/lib/python3.10/dist-packages/docker/api/client.py", line 197, in __init__
    self._version = self._retrieve_server_version()
  File "/usr/local/lib/python3.10/dist-packages/docker/api/client.py", line 221, in _retrieve_server_version
    raise DockerException(
docker.errors.DockerException: Error while fetching server API version: Not supported URL scheme http+docker

解决办法:

temporary fix it to install requests version 2.31.0 - which fixed it for me. Might need a lower version to fix it for you.

临时修复是安装 requests 版本 2.31.0 - 这对我解决了问题。可能需要更低的版本才能为您解决问题。

pip3 install requests==2.31.0 --break-system-packages

附录

参考资料


分享文章至:

Previous Post
Windows 备份和还原驱动
Next Post
macOS 关闭 Microsoft AutoUpdate 弹框