docker-logo

Docker 容器是一款很方便的作业虚拟化工具,软件环境打包和迁移十分友好。前面的文章分享过的不少软件搭建都需要用到 Docker,如搭建 SeafilePro 网盘File Browser 网盘AdGuard Home 去广告等等,不过很多时候都略过了 Docker 的安装,这里简单的写一写在 Debian 系统(适用于最新的 Debian 11 以及 Debian 10 系统)上安装 Docker 的教程以及一些基本的使用命令,当然,你也可以从官方文档中找到在不同系统中的详细安装教程。

如果你现在使用的是 Debian 10 系统,想要升级到最新的 Debian 11,可以参考我前面的文章:从 Debian 10 升级到 Debian 11 教程

安装 Docker

以下所有的操作以 root 用户进行演示,如果你是以 root 权限用户执行,请在前面加上 sudo命令。

安装软件包依赖

我们需要从 Docker 官方的存储库中安装,因此将存储库添加到 Debian 系统中,而在添加 Docker 官方存储库之前,需要准备一些环境:

apt install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

如下图所示:

install-docker-env

添加 Docker 存储库

将存储库添加到 Debian 系统中:

  1. 添加 GPG 密钥:
 curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  1. 添加到系统软件源:

x86_64/amd64 平台:

echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

arm64 平台:

echo \
  "deb [arch=arm64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

安装 Docker

直接更新软件包索引,然后安装:

apt update
apt install -y docker-ce docker-ce-cli containerd.io

安装好之后可以通过以下命令查看 Docker 是否开启自动启动并查看状态:

systemctl is-enabled docker
systemctl is-enabled containerd
systemctl status docker

可以从下图中看到,Docker 正在运行并且设置了开机自动启动。

install-docker-status

使用 hello-world 镜像测试 Docker 能否正常运行:

docker run hello-world

如果你的结果于下图类似,则说明能够正常使用:

install-docker-hello-word

至此,你的 Docker 已经成功安装并且能够正常使用了。

卸载 Docker

卸载 Docker Engine,CLI 和 Containerd 包:

apt-get purge docker-ce docker-ce-cli containerd.io

删除所有镜像、容器和配置文件等:

rm -rf /var/lib/docker
rm -rf /var/lib/containerd

安装 Docker Compose

通过仓库安装

前面安装 Docker 是已经添加过仓库了,这里可以直接安装(默认会安装 Compose V2):

apt install docker-compose-plugin

测试安装:

docker compose version

更新 Compose:

apt update
apt install docker-compose-plugin

手动安装

  1. 下载稳定版本的 Docker Compose:
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

请自行替换为需要的版本,如果你需要安装 Compose V2,可以参考官方文档

  1. 赋予可以执行权限:
chmod +x /usr/local/bin/docker-compose
  1. 测试安装:
docker-compose --version
# docker-compose version 1.29.2, build 5becea4c

Docker 基本使用

下面介绍一些 Docker 常用的基本命令。你可以直接输入 docker 查看 Docker 的所有命令,或者查看 runoob 教程

添加 Docker 软件镜像

对于国内用户来说,Docker 默认的软件源下载速度会很慢,这里可以z直接修改下面的文件(Docker 版本 >= 1.10)添加国内的镜像地址:

vim /etc/docker/daemon.json

添加以下内容:

{
 "registry-mirrors" : [
   "https://docker.mirrors.ustc.edu.cn",
   "http://registry.docker-cn.com",
   "https://dockerhub.azk8s.cn"
 ]
}

上面的部分地址可能会失效,你可以替换为你喜欢的镜像地址,然后重新启动 Docker:

systemctl daemon-reload
systemctl restart docker

运行命令 docker info, 查看最后的 Registry Mirrors 下是否有设置的内容,有的话就设置成功了。

容器/镜像使用

查看正在运行的容器

docker ps

查看所有容器

docker ps -a

查看所有镜像

docker images

停止所有容器

docker stop $(docker ps -a -q)

删除所有容器

docker rm $(docker ps -a -q)

删除所有镜像

docker rmi $(docker images -q)

如果是控制某一个容器/镜像,只需要将后面的变量 $() 换成该容器/镜像的 ID

查看指定容器日志

docker logs -f [container-name/id]

也可以和 “–tail n” 命令结合起来,查看日志最后 n 行:

docker logs --tail 10 [container-name/id]

进入容器

有两种方式进入后台运行的容器:

  1. docker attach(如果退出会导致容器停止)
docker attach [container-name/id]
  1. docker exec(推荐)
docker exec -it [container-name/id] /bin/bash

导入/导出容器

导出容器快照到本地(通过重定向命名):

docker export [container-name/id] > my_container.tar

将本地容器快照导入为镜像:

cat my_container.tar | docker import - my_container:new

Docker run 命令

下面介绍以下 Docker 中用得最多的运行容器命令。

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

完整的 OPTIONS 说明可以使用 docker run --help 查看,下面是部分常用的说明:

  • -d / --detach=true: 后台运行容器,并返回容器 ID;
  • -i / --interactive=true: 打开 STDIN,用于控制台交互,通常与 -t 同时使用;
  • -t / --tty=true: 分配 tty 设备,可以支持终端登录,默认为 false,通常与 -i 同时使用;
  • -P / --publish-all=true: 随机端口映射,容器内部端口随机映射到主机的端口
  • -p / --publish=[]: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -h / --hostname="": 指定容器的 hostname;
  • -v / --volume[]: 给容器挂载存储卷,挂载到容器的某个目录;
  • --name="test": 为容器指定一个名称;
  • --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  • -e username="": 设置环境变量 username
  • --env-file=[]: 从指定文件读入环境变量,文件格式为每行一个环境变量;
  • --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container 四种类型;
  • --link=[]: 添加链接到另一个容器,使用其他容器的IP、env等信息;
  • --restart="no": 指定容器停止后的重启策略,no:容器退出时不重启;on-failure:容器故障退出(返回值非零)时重启;always:容器退出时总是重启;
  • --rm=false: 容器退出时自动清理容器内部的文件系统,等价于在容器退出后,执行 docker rm -v,不支持以 docker run -d 启动的容器。

Docker system 命令

docker system 命令是 Docker 提供的帮助我们管理查看 Docker 运行情况的命令,你可以通过 docker system --help 查看介绍:

Usage:  docker system COMMAND

Manage Docker

Commands:
  df          Show docker disk usage
  events      Get real time events from the server
  info        Display system-wide information
  prune       Remove unused data

Run 'docker system COMMAND --help' for more information on a command.

其中比较有用的是 dfprune 两个指令:

  • docker system df: Docker 整体磁盘使用率的概况,包括镜像、容器、本地 Volume 和过程中的 Cache;
  • docker system prune: 清理没有使用的数据,包括那些已停止的容器、dangling 镜像(未被任何镜像引用的镜像)、未被容器引用的 network 和构建过程中的 cache

还可在不同在子命令下执行 prune,用来删除某类资源:

  • docker container prune: 删除所有退出状态的容器;
  • docker volume prune: 删除未被使用的数据卷;
  • docker image prune: 删除 dangling 或所有未被使用的镜像。

当然,你也可以通过下面的命令直接更加彻底的完全删除某类资源(谨慎使用):

  • docker container rm $(docker container ls -a -q): 删除所有容器;
  • docker volume rm $(docker volume ls -q): 删除所有数据卷;
  • docker image rm $(docker image ls -a -q): 删除所有镜像;
  • docker network rm $(docker network ls -q): 删除所有网络。

如果你认为这篇文章还不错,可以考虑为我充电 ⚡️