Docker Essentials
Docker Essentials
Install Docker
系统镜像 Ubuntu 20.04 LTS 以及 Debian 11
方法一
官方教程 Get Docker Engine - Community for Debian
卸载已有的docker
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done使用便携脚本安装的 docker 不会上述代码卸载。所以我只会用没有安装过 docker 的虚拟机,或者是重置虚拟机系统来解决。
允许通过 HTTPS 使用存储库
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg添加 Docker 的官方 GPG 密钥
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 官方库
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更新包
sudo apt-get update安装 Docker Engine
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 组中。
- Create the
dockergroup
sudo groupadd docker- Add your user to the
dockergroup
sudo usermod -aG docker $USER- 重启
newgrp docker- 验证
docker run hello-world方法二
Docker 提供了一个便捷脚本,可以自动安装
curl -fsSL https://get.docker.com | sudo shcurl 一个命令行工具,用于从网络上获取数据。它可以处理各种类型的协议,包括HTTP和HTTPS
-f 或 --fail 此选项告诉 curl 如果HTTP请求失败(返回码≥400),则不显示任何内容并直接退出
-s 或 --silent 此选项告诉 curl 在操作过程中不显示错误和进度指示
-S 或 --show-error 尽管 -s 选项告诉 curl 在操作过程中保持安静,但如果发生错误,-S 选项将使错误消息可见
-L 或 --location:如果服务器报告指示新位置的HTTP状态码(如301,302等),此选项将告诉 curl 跟随服务器的重定向。
| 是一个叫做管道的Unix工具,它接受前一个命令的输出,并将它作为下一个命令的输入。
验证是否安装成功
docker --version 或者
sudo systemctl status docker如果你看到 “Active: active (running)” 这样的输出,那么 Docker 服务正在运行。
方法三
使用apt安装
以 docker.io 为例,docker.io 是 Ubuntu 官方仓库中的 Docker 包名,其版本可能会比 Docker 官方维护的版本(docker-ce)稍微落后一些。
sudo apt-get update
sudo apt-get install docker.io确保 Docker 在开机时启动:
sudo systemctl start docker
sudo systemctl enable docker当你从 Docker 官方的存储库(repository)安装 Docker 时(方法一),Docker 服务(dockerd)应该被设置为在启动时自动运行。
Install Docker Compose
Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用。
安装 Docker Compose
# 可以在 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# 支持 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。
验证是否安装成功
docker-compose --version # docker compose V1 版本
docker compose version # docker compose V2 版本 删除 Docker Compose
sudo rm /usr/bin/docker-composeTroubleshooting
- 运行
docker-compose命令时出现No such file or directory的错误提示
缓存问题: 如果你之前曾经在 /usr/local/bin/docker-compose 路径下安装过 Docker Compose,并在之后更改为 /usr/bin/docker-compose,那么可能会存在缓存问题。尝试使用以下命令刷新缓存:
hash -r用于清除 Bash 命令路径缓存,以便在下一次执行命令时重新搜索路径。
刷新环境变量: 在某些情况下,终端会保留旧的环境变量值,导致新安装的命令无法立即生效。你可以尝试重新加载你的终端或运行以下命令来刷新环境变量:
source ~/.bashrc用于重新加载 Bash 配置文件,以应用文件中的环境变量设置和别名等定义。
管理 Docker 命令
启用 Docker 服务的自动启动
sudo systemctl enable docker禁用 Docker 服务的自动启动
sudo systemctl disable docker启动 Docker 服务
sudo systemctl start docker停止 Docker 服务
sudo systemctl stop docker重启 Docker 服务
sudo systemctl restart docker查看 Docker 服务的状态
sudo systemctl status docker查看 Docker 安装位置
which docker进入 Docker 容器
docker exec -it container_name bashDocker 常用命令
- Docker 卷
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 只会识别现在有没有被容器使用,只要没被使用,不管数据卷是怎么被创建的,都会被删除
- 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=value或key--env-file: 从文件中读取环境变量。-i或--interactive: 保持 STDIN 打开,即使没有连接到容器。这通常与-t参数一起使用,让你可以交互式地运行容器-t或--tty: 分配一个伪终端或控制台。这通常与-i参数一起使用,让你可以交互式地运行容器--network: 指定容器的网络。将容器连接到特定的网络--restart: 容器退出时的重启策略,no、on-failure、always、unless-stopped
这些只是 docker run 命令的一部分参数,Docker 提供了很多其他的参数来配置容器。如果你想查看所有的参数,你可以使用 docker run --help 命令来查看完整的参数列表。但是,上述列出的参数已经足够覆盖大部分的用例。
Docker 容器的网段可以通过 Docker 的命令行工具进行查询。默认的,Docker 在安装时会创建一个名为 bridge 的网络,它被用作 Docker 容器的默认网络。
你可以使用下面的命令来查询 Docker 网络的详细信息:
docker network inspect bridge这个命令会输出一大段 JSON 格式的数据,其中包含了 bridge 网络的所有配置信息,包括网段(Subnet)。
这个命令的输出可能看起来类似这样:
[
{
"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。
- 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 命令代替