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 的空间占用主要分成四个部分
- Images(镜像)
- Containers(容器)
- Local Volumes(本地卷)
- 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
参数说明:
-a选项会删除所有未使用的镜像,而不仅仅是 dangling 镜像。--volumes选项会删除未使用的本地卷。-f或--force不经过确认强行删除。
清除悬空镜像(空标签镜像)
- 使用 docker 命令原生的方式对悬空镜像进行过滤
--filter "dangling=true"
# 清除空标签镜像
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 Save 方法,会保存该镜像的所有历史记录
- 对于 Docker Export 方法,不会保留历史记录,即没有 commit 历史
docker save保存的是镜像(image),docker export保存的是容器(container)
当需要使用镜像时则可以通过 docker load 命令来加载 tar 包:
docker load -i <image-name>.tar
docker load -i docker_images/template_run_v0.1.tar
docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称
导出镜像
#!/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
命令参数说明
- 使用 docker 命令原生的方式对悬空镜像进行过滤
--filter "dangling=true"
使用 Cf 加速拉取镜像
重命名镜像步骤:
- 通过加速链接拉取镜像
- 修改镜像标签,移除镜像名称中的加速链接相关的字符串
- 删除原始标题镜像
示例命令:
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
参数:
-u:登录用户名--password:登录凭据,使用字符形式的凭据进行登录时,不能省略成-p
注意:关于使用
--password的警告问题
- 从安全角度来说,最好还是使用
--password-stdin参数进行登录会比较好- 但如果是在 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
附录
参考资料
- Control Docker with systemd | Docker Documentation
- Configure Docker to use a proxy server | Docker Documentation
- Use the Docker command line | Docker Documentation
- Docker 深度清除镜像缓存(overlay2)
- Docker(十三)-Docker save and load 镜像保存
- docker 启动镜像命令
- golang 打包到 docker 运行,最小镜像
- Docker 官网
- Docker Tutorial for Beginners
- Docker 的入门「指北」 - 少数派
- Dockerfile 最佳实践
- docker 多阶段构建
- 三个技巧,将 Docker 镜像体积减小 90%
- 精简 Docker 镜像的五种通用方法
- 优化 Dockerfile 最佳实践
- alpine3.12 镜像
- docker —alpine包管理工具 —apk
- 精简Docker镜像的五种通用方法
- Alpine Dockerfile advantages of —no-cache vs. rm /var/cache/apk/*
- Alpine Linux配置使用技巧【一个只有5M的操作系统(转)】
- Docker实践
- Flatten a Docker container or image
- Docker Build Cache 缓存清理
- Docker CE 软件仓库
- Debian 13 安装 Docker Engine
- Save all Docker images and push to docker registry or copy to another machine
- 阿里云 - 官方镜像加速
- portainer 使用阿里云 docker 镜像加速器_木子欢儿的博客-CSDN 博客
- docker-compose 更新镜像