Contents

Docker Essentials

Docker Essentials

Install Docker

系统镜像 Ubuntu 20.04 LTS 以及 Debian 11

方法一

官方教程 Get Docker Engine - Community for Debian

卸载已有的docker

1
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

使用便携脚本安装的 docker 不会上述代码卸载。所以我只会用没有安装过 docker 的虚拟机,或者是重置虚拟机系统来解决。

允许通过 HTTPS 使用存储库

1
2
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

添加 Docker 的官方 GPG 密钥

1
2
3
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

设置 Docker 官方库

1
2
3
4
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

更新包

1
sudo apt-get update

安装 Docker Engine

1
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

这样安装可以同时安装 Docker Compose,无需单独操作。

使用非 root 用户运行 Docker

默认情况下,Docker 命令需要 root 权限。如果你想让非 root 用户也可以运行 Docker 命令,可以将用户添加到 docker 组中。

  1. Create the docker group
1
sudo groupadd docker
  1. Add your user to the docker group
1
sudo usermod -aG docker $USER
  1. 重启
1
newgrp docker
  1. 验证
1
docker run hello-world

方法二

Docker 提供了一个便捷脚本,可以自动安装

1
curl -fsSL https://get.docker.com | sudo sh

curl 一个命令行工具,用于从网络上获取数据。它可以处理各种类型的协议,包括HTTP和HTTPS

-f--fail 此选项告诉 curl 如果HTTP请求失败(返回码≥400),则不显示任何内容并直接退出

-s--silent 此选项告诉 curl 在操作过程中不显示错误和进度指示

-S--show-error 尽管 -s 选项告诉 curl 在操作过程中保持安静,但如果发生错误,-S 选项将使错误消息可见

-L--location:如果服务器报告指示新位置的HTTP状态码(如301,302等),此选项将告诉 curl 跟随服务器的重定向。

| 是一个叫做管道的Unix工具,它接受前一个命令的输出,并将它作为下一个命令的输入。

验证是否安装成功

1
docker --version 

或者

1
sudo systemctl status docker

如果你看到 “Active: active (running)” 这样的输出,那么 Docker 服务正在运行。

方法三

使用apt安装

以 docker.io 为例,docker.io 是 Ubuntu 官方仓库中的 Docker 包名,其版本可能会比 Docker 官方维护的版本(docker-ce)稍微落后一些。

1
2
sudo apt-get update
sudo apt-get install docker.io

确保 Docker 在开机时启动

1
2
sudo systemctl start docker
sudo systemctl enable docker

当你从 Docker 官方的存储库(repository)安装 Docker 时(方法一),Docker 服务(dockerd)应该被设置为在启动时自动运行。

Install Docker Compose

Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用。

安装 Docker Compose

1
2
3
4
# 可以在 Docker Compose 的 GitHub release 页面查看最新版本号并替换下面的版本号
# 仅支持 docker compose V1 版本
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/bin/docker-compose
sudo chmod +x /usr/bin/docker-compose
1
2
3
# 支持 docker compose V2 版本
sudo curl -SL https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-linux-x86_64 -o /usr/bin/docker-compose
sudo chmod +x /usr/bin/docker-compose

-o 或者 --output 参数用于将服务器返回的内容写入到文件中,而不是输出到终端。

在一般的 Linux 系统中,/usr/bin/usr/local/bin 都是默认的 PATH 环境变量中的路径,所以你可以选择任意一个来安装软件。只是按照惯例,用户级的二进制文件(如由用户手动安装的软件)通常放在 /usr/local/bin,而由系统包管理器管理的二进制文件(如由 apt 或 yum 安装的软件)放在 /usr/bin

验证是否安装成功

1
2
docker-compose --version    # docker compose V1 版本
docker compose version      # docker compose V2 版本  

删除 Docker Compose

1
sudo rm /usr/bin/docker-compose

Troubleshooting

  • 运行 docker-compose 命令时出现 No such file or directory 的错误提示
  1. 缓存问题: 如果你之前曾经在 /usr/local/bin/docker-compose 路径下安装过 Docker Compose,并在之后更改为 /usr/bin/docker-compose,那么可能会存在缓存问题。尝试使用以下命令刷新缓存:

    1
    
    hash -r
    

    用于清除 Bash 命令路径缓存,以便在下一次执行命令时重新搜索路径。

  2. 刷新环境变量: 在某些情况下,终端会保留旧的环境变量值,导致新安装的命令无法立即生效。你可以尝试重新加载你的终端或运行以下命令来刷新环境变量:

    1
    
    source ~/.bashrc
    

    用于重新加载 Bash 配置文件,以应用文件中的环境变量设置和别名等定义。

管理 Docker 命令

启用 Docker 服务的自动启动

1
sudo systemctl enable docker

禁用 Docker 服务的自动启动

1
sudo systemctl disable docker

启动 Docker 服务

1
sudo systemctl start docker

停止 Docker 服务

1
sudo systemctl stop docker

重启 Docker 服务

1
sudo systemctl restart docker

查看 Docker 服务的状态

1
sudo systemctl status docker

查看 Docker 安装位置

1
which docker

进入 Docker 容器

1
docker exec -it container_name bash

Docker 常用命令

  1. Docker 卷
1
2
3
4
5
docker volume create volume_name    # 创建一个名为 volume_name 的新 Docker 卷
docker volume ls    # 查看所有 Docker 卷
docker volume inspect volume_name   # 查看 Docker 卷的详细信息
docker volume rm volume_name   # 删除 Docker 卷
docker volume prune # 删除所有未被使用的 Docker 卷

Docker 卷是存储在主机上的,但由 Docker 管理。默认情况下,卷存储在 /var/lib/docker/volumes/ 目录下,每个卷都有一个唯一的目录。这种设计方式使得数据持久化,即使容器重启、被删除,数据仍然可以被保留和重用。还可以在容器之间共享数据

当你删除一个容器时,Docker 默认不会删除其关联的卷,无论这个卷是匿名卷还是命名卷,卷的生命周期不会因为容器的创建和删除而改变

删除容器,保留数据卷,可以再次创建新的容器并继续使用之前挂载的数据卷。只需在创建新容器时 docker run 命令中使用 -v--volume 参数指定你想要挂载的卷和在新容器中的挂载点,就可以使用之前的数据了

docker volume prune 只会识别现在有没有被容器使用,只要没被使用,不管数据卷是怎么被创建的,都会被删除

  1. Docker run

docker run 命令用于创建新的 Docker 容器并运行命令。以下是一些常用的 docker run 参数:

  • -d--detach: 在后台运行容器,并返回容器ID

  • --name: 指定容器的名称。使用易读方式来引用容器,而不是使用 Docker 自动生成的 ID

  • -p--publish: 发布容器的端口到主机。这允许你将容器的端口映射到主机的端口,使得你可以通过访问主机的端口来访问容器的服务。格式为 <hostPort>:<containerPort><ip>:<hostPort>:<containerPort>

  • -P--publish-all: 发布容器暴露的所有端口到随机端口

  • -v--volume: 挂载存储卷,在主机和容器之间共享文件或目录。<hostDir>:<containerDir><hostDir>:<containerDir>:<options>

  • --rm: 在容器终止后自动删除容器

  • -e--env: 设置环境变量,配置运行在容器中的程序。格式为 key=valuekey

  • --env-file: 从文件中读取环境变量。

  • -i--interactive: 保持 STDIN 打开,即使没有连接到容器。这通常与 -t 参数一起使用,让你可以交互式地运行容器

  • -t--tty: 分配一个伪终端或控制台。这通常与 -i 参数一起使用,让你可以交互式地运行容器

  • --network: 指定容器的网络。将容器连接到特定的网络

  • --restart: 容器退出时的重启策略,noon-failurealwaysunless-stopped

这些只是 docker run 命令的一部分参数,Docker 提供了很多其他的参数来配置容器。如果你想查看所有的参数,你可以使用 docker run --help 命令来查看完整的参数列表。但是,上述列出的参数已经足够覆盖大部分的用例。

Docker 容器的网段可以通过 Docker 的命令行工具进行查询。默认的,Docker 在安装时会创建一个名为 bridge 的网络,它被用作 Docker 容器的默认网络。

你可以使用下面的命令来查询 Docker 网络的详细信息:

1
docker network inspect bridge

这个命令会输出一大段 JSON 格式的数据,其中包含了 bridge 网络的所有配置信息,包括网段(Subnet)。

这个命令的输出可能看起来类似这样:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
[
    {
        "Name": "bridge",
        "Id": "aabbccddeeff...",
        ...
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        ...
    }
]

在这个例子中,你可以看到网段是 172.17.0.0/16

如果你的 Docker 容器不是运行在默认的 bridge 网络上,你需要将上述命令中的 bridge 替换为你的 Docker 容器所在的网络名称。

注意,执行这些命令可能需要相应的权限,如果你没有足够的权限,可能需要在命令前加上 sudo

  1. Docker compose

在 Docker compose V1 中,docker-compose 命令用于管理 Docker Compose 项目

在 Docker compose V2 中,docker compose 命令用于管理 Docker Compose 项目。此时 compose 可以视作 docker 的二级命令

V1 和 V2 版本参数类似:

  • up: 创建并启动容器

  • down: 停止并删除容器

  • start: 启动容器

  • stop: 停止容器

默认的,docker compose 命令会在当前目录下查找 docker-compose.yml compose.yml docker-compose.yaml compose.yaml 文件。可以使用 -f--file 参数来指定某一路径下的某一文件

其他的如查看容器、查看日志、查看网络等命令,可以使用 docker 命令代替