Ubuntu20.04中Docker的安装和配置
·
Ubuntu20.04中Docker的安装和配置
总体参照 Docker 官方的教程,这里给出了四种安装方法,本文主要介绍 Set up and install Docker Engine from Docker’s apt repository 这一种安装方法。
难点主要是网络的问题,可以提前配置一下网络(本文的 解决之前遇到的网络问题部分),不过按照本文的正常步骤也可以在安装过程中初步解决网络问题。
首先清除一下之前可能遗留下来的老版本
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc | cut -f1)
下载之前的准备工作
# ==============================================================================
# Docker 官方仓库安装配置脚本(Ubuntu/Debian 系统)
# 来源:https://docs.docker.com/engine/install/ubuntu/
# ==============================================================================
# -----------------------------------------------------------------------------
# 步骤 1:更新本地软件包索引
# 必要性:确保后续安装的软件包信息是最新的,避免依赖冲突或下载旧版本
# -----------------------------------------------------------------------------
sudo apt update
# -----------------------------------------------------------------------------
# 步骤 2:安装 CA 证书和 curl 工具
# 必要性:
# - ca-certificates:验证 HTTPS 连接的安全性,防止中间人攻击
# - curl:用于从远程下载 GPG 公钥,比 wget 更灵活支持更多协议
# -----------------------------------------------------------------------------
sudo apt install ca-certificates curl
# -----------------------------------------------------------------------------
# 步骤 3:创建 APT 密钥专用目录
# 命令:sudo install -m 0755 -d /etc/apt/keyrings
# 必要性:
# - /etc/apt/keyrings 是 Ubuntu 22.04+ 推荐的第三方密钥存放位置,虽然当前版本是20.04,但是放在这里也是符合标准的
# - 与系统自带密钥(/usr/share/keyrings)分离,避免混淆
# - 使用 install 而非 mkdir:创建目录的同时原子化设置权限,避免竞态条件
# - -m 0755:权限 rwxr-xr-x,确保所有用户可进入目录,但只有 root 可修改
# -----------------------------------------------------------------------------
sudo install -m 0755 -d /etc/apt/keyrings
# -----------------------------------------------------------------------------
# 步骤 4:下载 Docker 官方 GPG 公钥
# 命令:sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
# 必要性:
# - GPG 公钥用于验证软件包签名,确保下载的 Docker 软件是官方正版,未被篡改
# - curl 参数详解:
# - -f, --fail:HTTP 错误码(如 404)时返回非零退出码,停止脚本(防止把错误页面当密钥保存)
# - -s, --silent:静默模式,不显示下载进度条(脚本执行更干净)
# - -S, --show-error:与 -s 配合,出错时仍显示错误信息(便于调试)
# - -L, --location:跟随 3xx 重定向(确保能到达最终下载地址)
# - -o:指定输出路径,直接保存到系统密钥目录
# 注意:使用docker官方的地址可能连接不上,这里替换为了阿里云的相关地址
# -----------------------------------------------------------------------------
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
# -----------------------------------------------------------------------------
# 步骤 5:设置公钥文件权限为所有用户可读
# 命令:sudo chmod a+r /etc/apt/keyrings/docker.asc
# 必要性:
# - APT 需要读取该密钥来验证软件包,普通用户运行 apt 时也需要访问
# - a+r = all + read,即 chmod 644,确保非 root 用户也能验证签名
# - 如果权限过严(如 600),普通用户执行 apt update 会报权限错误
# -----------------------------------------------------------------------------
sudo chmod a+r /etc/apt/keyrings/docker.asc
# -----------------------------------------------------------------------------
# 步骤 6:添加 Docker 软件源到 APT
# 命令:sudo tee /etc/apt/sources.list.d/docker.sources <<EOF ... EOF
# 必要性:
# - 使用 deb822 格式(.sources 文件)是现代标准,替代旧的 .list 一行格式
# - 优势:字段清晰、支持多架构、易读易维护
# - 使用 tee 而非重定向(>):在 sudo 环境下能正常写入受保护目录(重定向是 shell 操作,sudo 不生效)
# - 内容详解:
# - Types: deb:二进制软件包(deb-src 是源码包,这里不需要)
# - URIs:软件包下载地址,HTTPS 确保传输加密
# - Suites:系统版本代号(如 jammy, noble),动态获取确保与当前系统匹配
# - $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}"):
# - . /etc/os-release:加载系统版本信息变量
# - ${UBUNTU_CODENAME:-$VERSION_CODENAME}:优先用 UBUNTU_CODENAME,
# 如果不存在则回退到 VERSION_CODENAME(兼容 Debian 和其他衍生版)
# - Components: stable:稳定版通道(还有 test, nightly 等)
# - Signed-By:指定验证用的 GPG 公钥路径,APT 会用它验证软件包签名‘
# 注意:这里也要换为阿里云的仓库地址
# -----------------------------------------------------------------------------
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://mirrors.aliyun.com/docker-ce/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
# -----------------------------------------------------------------------------
# 步骤 7:再次更新软件包索引
# 必要性:使新添加的 Docker 软件源生效,APT 现在能识别 docker-ce 等软件包
# -----------------------------------------------------------------------------
sudo apt update
正式下载 Docker 并试运行
# ==============================================================================
# Docker 引擎安装与服务启动验证脚本
# 安装 Docker CE(社区版)及配套组件,并验证安装成功
# ==============================================================================
# -----------------------------------------------------------------------------
# 步骤 1:安装 Docker 引擎及配套组件
# 命令:sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 必要性:
# - docker-ce:Docker Community Edition(社区版),核心引擎,包含守护进程 dockerd 和客户端 docker
# - docker-ce-cli:Docker 命令行客户端,提供 docker 命令与用户交互
# - containerd.io:容器运行时,负责管理容器的生命周期(创建、运行、销毁)
# - Docker 早期自己管理运行时,后来剥离出 containerd,成为行业标准
# - Kubernetes 也直接使用 containerd 作为运行时
# - docker-buildx-plugin:下一代构建工具,支持多平台构建(如 AMD64/ARM64)、并行构建、缓存优化
# - 替代旧的 docker build,功能更强大
# - docker-compose-plugin:Docker Compose 插件版,用于编排多容器应用
# - 替代独立的 docker-compose 二进制文件,通过 docker compose(空格)调用
#
# 为什么分开安装:
# - 允许用户按需选择组件(如服务器只需运行时,不需要构建工具)
# - 各组件可独立升级,解耦依赖关系
#
# 安装过程:
# - APT 会自动解决依赖,下载并配置 systemd 服务
# - 安装完成后,docker 服务会自动注册到 systemd,但不会自动启动(Debian/Ubuntu 策略)
# -----------------------------------------------------------------------------
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# -----------------------------------------------------------------------------
# 步骤 2:检查 Docker 服务状态
# 命令:sudo systemctl status docker
# 必要性:
# - 确认 Docker 守护进程是否已注册到 systemd,以及当前运行状态
# - 输出信息解读:
# - Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
# - 表示服务已加载,开机自启已启用(enabled)
# - Active: inactive (dead) 或 active (running)
# - inactive:已安装但未启动
# - active:正在运行
# - Process: 显示主进程 PID 和资源占用
# - CGroup: 显示控制组信息(容器隔离机制)
#
# 常见状态:
# - 刚安装完通常显示 inactive (dead),需要手动启动
# - 如果显示 failed,查看日志:sudo journalctl -u docker.service
# -----------------------------------------------------------------------------
sudo systemctl status docker
# -----------------------------------------------------------------------------
# 步骤 3:启动 Docker 服务
# 命令:sudo systemctl start docker
# 必要性:
# - 启动 dockerd 守护进程,使其开始监听 Docker API 请求(默认 Unix 套接字 /var/run/docker.sock)
# - 只有守护进程运行后,docker 客户端命令才能正常工作
# - 与 enable 的区别:
# - start:立即启动服务(一次性)
# - enable:设置开机自启(永久性)
# - 安装包通常已自动 enable,但需手动 start
#
# 验证启动成功:
# - 再次执行 sudo systemctl status docker,应显示 Active: active (running)
# - 或查看进程:ps aux | grep dockerd
# -----------------------------------------------------------------------------
sudo systemctl start docker
# -----------------------------------------------------------------------------
# 步骤 4:验证 Docker 安装成功
# 命令:sudo docker run hello-world
# 必要性:
# - hello-world 是 Docker 官方提供的最小测试镜像(仅 13.3KB)
# - 完整验证链:
# 1. 客户端能否连接到守护进程(检查 /var/run/docker.sock 权限)
# 2. 能否从镜像仓库拉取镜像(验证网络和镜像加速器配置)
# 3. 能否成功创建并运行容器(验证 containerd 运行时)
# 4. 容器能否正常执行并输出(验证容器隔离和文件系统)
#
# - 预期输出:
# - Unable to find image 'hello-world:latest' locally:本地没有,开始拉取
# - latest: Pulling from library/hello-world:从镜像仓库下载
# - Status: Downloaded newer image for hello-world:latest:下载成功
# - Hello from Docker!:容器内程序执行的输出
# - 后续几行说明当前配置信息
#
# - 成功标志:看到 "Hello from Docker!" 即表示安装完全成功
#
# 常见错误:
# - Cannot connect to the Docker daemon:守护进程未启动或权限不足
# - Permission denied while trying to connect:当前用户不在 docker 组,需用 sudo 或执行 sudo usermod -aG docker $USER 后重新登录
# - 拉取超时:镜像加速器未配置或网络问题,参考之前的 daemon.json 配置
# -----------------------------------------------------------------------------
sudo docker run hello-world
# -----------------------------------------------------------------------------
# 后续建议(可选)
# -----------------------------------------------------------------------------
# 1. 免 sudo 使用 Docker(将当前用户加入 docker 组,强烈建议):
# sudo usermod -aG docker $USER
# newgrp docker # 立即生效(或重新登录)
#
# 2. 设置开机自启(通常已默认启用,可检查):
# sudo systemctl enable docker
#
# 3. 查看 Docker 版本信息:
# docker --version
# docker info
#
# 4. 验证 Buildx 和 Compose 插件:
# docker buildx version
# docker compose version
# -----------------------------------------------------------------------------~~~
删除时注意执行顺序
在删除 Docker 镜像时,您需要注意以下步骤和事项:
停止并移除相关容器:如果镜像正在被某个容器使用,您需要先停止并删除该容器。可以使用以下命令列出所有容器(包括已停止的):
docker ps -a
然后停止容器:
docker stop
最后删除容器:
docker rm
确认镜像 ID:通过 docker images 命令查看目标镜像的 IMAGE ID 或 REPOSITORY 名称。
删除镜像:使用以下命令删除指定镜像:
docker rmi
强制删除(如有必要):如果镜像无法正常删除,可以使用 -f 参数强制删除:
docker rmi -f
清理未使用的资源:为了释放更多空间,您可以清理未使用的镜像、容器、网络和卷:
docker system prune -a
解决之前遇到的网络问题
# ==============================================================================
# Docker 镜像加速器配置脚本
# 用于解决国内访问 Docker Hub 慢或超时的问题
# ==============================================================================
# -----------------------------------------------------------------------------
# 步骤 1:编辑 Docker 守护进程配置文件
# 命令:sudo nano /etc/docker/daemon.json
# 必要性:
# - nano 是简单易用的终端文本编辑器,适合新手操作
# - /etc/docker/daemon.json 是 Docker 守护进程的核心配置文件
# - 如果不存在此文件,Docker 会使用默认配置;创建后可自定义守护进程行为
# - 必须使用 sudo,因为 /etc/docker/ 目录需要 root 权限才能写入
# -----------------------------------------------------------------------------
sudo nano /etc/docker/daemon.json
# -----------------------------------------------------------------------------
# 步骤 2:写入镜像加速器配置(在 nano 中粘贴以下内容)
# 必要性:
# - registry-mirrors:配置 Docker 镜像仓库镜像站点列表
# - 原理:Docker 拉取镜像时,会优先从这些镜像站请求,镜像站缓存了 Docker Hub 的内容
# - 为什么需要多个:
# - 国内网络环境复杂,单个镜像站可能故障、限流或被封
# - Docker 会按顺序尝试,第一个失败自动尝试下一个,提高可用性
# - 各镜像站说明:
# - https://xxxxxxx.mirror.aliyuncs.com:阿里云个人加速器(需登录阿里云控制台获取专属地址)
# - https://docker.rainbond.cc:Rainbond 社区镜像站
# - https://do.nark.eu.org:欧洲节点,部分网络可用
# - https://dc.j8.work:国内个人维护镜像站
# - https://docker.m.daocloud.io:DaoCloud 企业级镜像站,较稳定
# - https://dockerproxy.com:DockerProxy 公益镜像
# - https://registry.docker-cn.com:Docker 中国官方镜像(已停止服务,保留作备用)
# - https://docker.mirrors.ustc.edu.cn:中科大镜像站,教育网速度快
# - https://hub-mirror.c.163.com:网易云镜像站
# - https://mirror.baidubce.com:百度云镜像站
# - https://docker.nju.edu.cn:南京大学镜像站
# - 注意:JSON 格式严格要求,最后一个元素后不能加逗号,字符串用双引号
# -----------------------------------------------------------------------------
# 配置内容如下:
{
"registry-mirrors": [
"https://xxxxxxx.mirror.aliyuncs.com",
"https://docker.rainbond.cc",
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://docker.nju.edu.cn"
]
}
# nano 操作提示:
# - Ctrl+O 保存,Enter 确认文件名,Ctrl+X 退出
# - 如果提示文件不存在,确认路径是否正确
# -----------------------------------------------------------------------------
# 步骤 3:重新加载 systemd 守护进程配置
# 命令:sudo systemctl daemon-reload
# 必要性:
# - systemctl 是 systemd 系统和服务管理器的控制命令
# - daemon-reload:重新加载所有服务单元的配置文件
# - 为什么需要:修改了 docker.service 相关的配置(如 daemon.json),systemd 需要重新读取
# - 注意:此命令不会重启 Docker 服务,只是让 systemd 知道配置有变化
# - 如果不执行,systemctl restart docker 可能使用旧的配置缓存
# -----------------------------------------------------------------------------
sudo systemctl daemon-reload
# -----------------------------------------------------------------------------
# 步骤 4:重启 Docker 服务
# 命令:sudo systemctl restart docker
# 必要性:
# - restart = stop + start,使新的 daemon.json 配置真正生效
# - Docker 守护进程启动时会读取 /etc/docker/daemon.json,加载 registry-mirrors 列表
# - 必须重启,reload 不足以让 Docker 重新读取配置文件
# - 重启后,docker pull 命令会优先使用镜像加速器
# -----------------------------------------------------------------------------
sudo systemctl restart docker
# -----------------------------------------------------------------------------
# 步骤 5:验证加速器是否生效
# 命令:sudo docker run hello-world
# 必要性:
# - hello-world 是 Docker 官方测试镜像,极小(约 13KB),适合测试连通性
# - 如果能成功拉取并运行,说明镜像加速器配置成功
# - 观察输出中的 "Pulling from library/hello-world" 部分:
# - 如果显示从 docker.io 拉取且速度很慢,说明加速器未生效
# - 如果快速完成或显示镜像站地址,说明配置成功
# - 常见失败原因:
# - daemon.json 格式错误(JSON 语法错误,如多余的逗号)
# - 镜像站地址失效或被封
# - 系统防火墙或安全组限制出站连接
# -----------------------------------------------------------------------------
sudo docker run hello-world
# -----------------------------------------------------------------------------
# 附加验证命令(可选)
# -----------------------------------------------------------------------------
# 查看当前生效的镜像加速器配置:
# sudo docker info | grep -A 10 "Registry Mirrors"
#
# 预期输出:
# Registry Mirrors:
# https://xxxxxxx.mirror.aliyuncs.com/
# https://docker.rainbond.cc/
# ...
#
# 如果列表为空,说明配置未生效,检查 daemon.json 语法和路径
# -----------------------------------------------------------------------------
其余常用命令
#!/bin/bash
# ==============================================================================
# Docker 常用命令速查手册
# 涵盖镜像管理、容器生命周期、网络、卷、系统维护等核心操作
# ==============================================================================
# ==============================================================================
# 一、镜像管理(Image)
# ==============================================================================
# -----------------------------------------------------------------------------
# 搜索镜像
# 命令:docker search [镜像名]
# 作用:在 Docker Hub 搜索公开镜像
# 示例:搜索 nginx 相关镜像,按星级排序
# -----------------------------------------------------------------------------
docker search nginx
# -----------------------------------------------------------------------------
# 拉取镜像
# 命令:docker pull [镜像名:标签]
# 作用:从镜像仓库下载镜像到本地
# 必要性:运行容器前必须先有镜像;默认从 Docker Hub 拉取
# 示例:拉取指定版本,不指定标签默认 latest(生产环境建议明确版本)
# -----------------------------------------------------------------------------
docker pull nginx:latest
docker pull nginx:1.24-alpine # 轻量级 Alpine 版本
# -----------------------------------------------------------------------------
# 查看本地镜像
# 命令:docker images 或 docker image ls
# 作用:列出本地存储的所有镜像
# 输出字段:REPOSITORY(仓库名)、TAG(标签)、IMAGE ID(唯一标识)、CREATED(创建时间)、SIZE(大小)
# -----------------------------------------------------------------------------
docker images
# -----------------------------------------------------------------------------
# 删除镜像
# 命令:docker rmi [镜像名或ID]
# 作用:删除本地镜像,释放磁盘空间
# 必要性:清理旧版本镜像、无用镜像,避免占用过多存储
# 注意:必须先删除依赖该镜像的所有容器才能删除镜像
# 示例:强制删除(-f 忽略容器依赖警告,谨慎使用)
# -----------------------------------------------------------------------------
docker rmi nginx:latest
docker rmi -f abc123def456 # 通过镜像ID强制删除
# -----------------------------------------------------------------------------
# 清理悬空镜像(dangling)
# 命令:docker image prune
# 作用:删除无标签的 <none>:<none> 镜像(通常是构建失败的中间层)
# -----------------------------------------------------------------------------
docker image prune
# -----------------------------------------------------------------------------
# 查看镜像历史
# 命令:docker history [镜像名]
# 作用:查看镜像构建历史,分析每一层的大小和创建指令
# 必要性:优化镜像体积、排查构建问题
# -----------------------------------------------------------------------------
docker history nginx:latest
# -----------------------------------------------------------------------------
# 给镜像打标签
# 命令:docker tag [源镜像] [目标镜像名:标签]
# 作用:为镜像创建别名,常用于推送到私有仓库前重命名
# -----------------------------------------------------------------------------
docker tag nginx:latest myregistry.com/nginx:v1.0
# -----------------------------------------------------------------------------
# 推送镜像到仓库
# 命令:docker push [镜像名:标签]
# 作用:将本地镜像上传到远程仓库(Docker Hub 或私有仓库)
# 必要性:分享镜像、CI/CD 流程、多环境部署
# 注意:需先 docker login 登录
# -----------------------------------------------------------------------------
docker push myregistry.com/nginx:v1.0
# ==============================================================================
# 二、容器生命周期(Container)
# ==============================================================================
# -----------------------------------------------------------------------------
# 创建并启动容器(核心命令)
# 命令:docker run [选项] [镜像名] [命令]
# 作用:创建新容器并启动,是 docker create + docker start 的组合
#
# 常用选项:
# -d, --detach 后台运行(守护模式)
# -p, --publish 端口映射(主机端口:容器端口)
# -v, --volume 挂载卷(主机路径:容器路径)
# -e, --env 设置环境变量
# --name 指定容器名称(否则随机生成)
# --rm 停止后自动删除容器(临时任务用)
# -it 交互模式(-i 标准输入,-t 伪终端)
# --network 指定网络模式
# --restart 重启策略(no/on-failure/always/unless-stopped)
#
# 必要性:运行应用的核心命令,所有选项组合满足各种部署场景
# -----------------------------------------------------------------------------
# 示例 1:后台运行 nginx,映射端口,命名容器
docker run -d -p 8080:80 --name my-nginx nginx
# 示例 2:交互式进入 Ubuntu 容器,退出后自动删除
docker run -it --rm ubuntu:22.04 bash
# 示例 3:运行 MySQL,设置环境变量,挂载数据卷持久化
docker run -d \
--name mysql-db \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=myapp \
-v /host/data:/var/lib/mysql \
-p 3306:3306 \
mysql:8.0
# 示例 4:自动重启策略(除非手动停止,否则总是重启)
docker run -d --restart unless-stopped nginx
# -----------------------------------------------------------------------------
# 查看运行中的容器
# 命令:docker ps
# 作用:列出正在运行的容器
# 输出字段:CONTAINER ID、IMAGE、COMMAND、CREATED、STATUS、PORTS、NAMES
# -----------------------------------------------------------------------------
docker ps
# -----------------------------------------------------------------------------
# 查看所有容器(包括已停止)
# 命令:docker ps -a
# 作用:查看完整容器列表,包括 Exited 状态的
# 必要性:查找已停止的容器、排查问题容器、清理残留
# -----------------------------------------------------------------------------
docker ps -a
# -----------------------------------------------------------------------------
# 启动已停止的容器
# 命令:docker start [容器名或ID]
# 作用:启动已存在但停止的容器,保留之前的状态和数据
# 与 run 区别:start 启动已有容器,run 创建新容器
# -----------------------------------------------------------------------------
docker start my-nginx
# -----------------------------------------------------------------------------
# 停止运行中的容器
# 命令:docker stop [容器名或ID]
# 作用:优雅停止容器(发送 SIGTERM,10秒后 SIGKILL)
# 必要性:释放资源、维护更新、避免数据损坏
# -----------------------------------------------------------------------------
docker stop my-nginx
# -----------------------------------------------------------------------------
# 强制停止容器
# 命令:docker kill [容器名或ID]
# 作用:立即强制停止(发送 SIGKILL),不等待优雅关闭
# 使用场景:容器卡死、无响应、紧急停止
# 注意:可能导致数据丢失或文件损坏
# -----------------------------------------------------------------------------
docker kill my-nginx
# -----------------------------------------------------------------------------
# 重启容器
# 命令:docker restart [容器名或ID]
# 作用:先 stop 再 start,用于配置重载或故障恢复
# -----------------------------------------------------------------------------
docker restart my-nginx
# -----------------------------------------------------------------------------
# 暂停/恢复容器
# 命令:docker pause / docker unpause
# 作用:暂停容器所有进程(冻结状态),恢复后从暂停点继续
# 使用场景:临时释放 CPU 资源,但保留内存状态
# -----------------------------------------------------------------------------
docker pause my-nginx
docker unpause my-nginx
# -----------------------------------------------------------------------------
# 删除容器
# 命令:docker rm [容器名或ID]
# 作用:删除已停止的容器,释放资源
# 注意:运行中的容器需先 stop,或加 -f 强制删除
# -----------------------------------------------------------------------------
docker rm my-nginx
docker rm -f my-nginx # 强制删除运行中的容器
# -----------------------------------------------------------------------------
# 清理所有已停止容器
# 命令:docker container prune
# 作用:批量删除 Exited 状态的容器,快速清理
# -----------------------------------------------------------------------------
docker container prune
# ==============================================================================
# 三、容器操作(进入、日志、信息)
# ==============================================================================
# -----------------------------------------------------------------------------
# 进入运行中的容器
# 命令:docker exec [选项] [容器名] [命令]
# 作用:在已运行的容器内执行命令,常用于调试和维护
#
# 常用选项:
# -it 交互终端模式
# -d 后台执行
# -u, --user 指定用户
#
# 与 docker attach 区别:
# - exec:新开进程进入,退出不影响容器主进程
# - attach:附加到容器主进程,退出会导致容器停止(除非主进程是 shell)
# -----------------------------------------------------------------------------
# 进入容器启动 bash(最常用)
docker exec -it my-nginx bash
# 以 root 身份进入(某些容器默认非 root)
docker exec -it -u root my-nginx bash
# 在容器内执行单条命令
docker exec my-nginx nginx -t # 测试 nginx 配置
# -----------------------------------------------------------------------------
# 查看容器日志
# 命令:docker logs [容器名]
# 作用:查看容器标准输出(stdout)和标准错误(stderr)
#
# 常用选项:
# -f, --follow 实时跟踪(类似 tail -f)
# --tail [n] 显示最后 n 行
# --since [时间] 显示某个时间之后的日志
# -t, --timestamps 显示时间戳
# -----------------------------------------------------------------------------
docker logs my-nginx
docker logs -f --tail 100 my-nginx # 实时跟踪最后100行
# -----------------------------------------------------------------------------
# 查看容器详细信息
# 命令:docker inspect [容器名]
# 作用:以 JSON 格式输出容器的完整配置和状态信息
# 使用场景:查看 IP 地址、挂载卷、环境变量、网络配置等
# -----------------------------------------------------------------------------
docker inspect my-nginx
# 配合 jq 提取特定字段(需安装 jq)
docker inspect my-nginx | jq '.[0].NetworkSettings.IPAddress'
# -----------------------------------------------------------------------------
# 查看容器资源使用
# 命令:docker stats [容器名]
# 作用:实时显示容器的 CPU、内存、网络、IO 使用情况
# 类似 top 命令,用于性能监控
# -----------------------------------------------------------------------------
docker stats
docker stats my-nginx
# -----------------------------------------------------------------------------
# 复制文件(主机与容器之间)
# 命令:docker cp [源路径] [目标路径]
# 作用:双向复制文件,无需进入容器
#
# 格式:
# docker cp 主机路径 容器名:容器路径 # 主机 → 容器
# docker cp 容器名:容器路径 主机路径 # 容器 → 主机
# -----------------------------------------------------------------------------
docker cp ./config.conf my-nginx:/etc/nginx/conf.d/
docker cp my-nginx:/var/log/nginx/error.log ./logs/
# ==============================================================================
# 四、数据卷管理(Volume)
# ==============================================================================
# -----------------------------------------------------------------------------
# 创建卷
# 命令:docker volume create [卷名]
# 作用:创建命名卷,Docker 自动管理存储位置(/var/lib/docker/volumes/)
# 优势:备份方便、跨容器共享、与容器生命周期解耦
# -----------------------------------------------------------------------------
docker volume create my-data
# -----------------------------------------------------------------------------
# 列出所有卷
# 命令:docker volume ls
# -----------------------------------------------------------------------------
docker volume ls
# -----------------------------------------------------------------------------
# 查看卷详情
# 命令:docker volume inspect [卷名]
# 作用:查看卷的挂载点、驱动、标签等信息
# -----------------------------------------------------------------------------
docker volume inspect my-data
# -----------------------------------------------------------------------------
# 删除卷
# 命令:docker volume rm [卷名]
# 注意:必须先删除使用该卷的容器
# -----------------------------------------------------------------------------
docker volume rm my-data
# -----------------------------------------------------------------------------
# 清理未使用卷
# 命令:docker volume prune
# 作用:删除未被任何容器引用的卷,释放空间
# 警告:确保没有重要数据再执行!
# -----------------------------------------------------------------------------
docker volume prune
# -----------------------------------------------------------------------------
# 使用卷运行容器
# 命令:docker run -v [卷名]:[容器路径] ...
# 对比 bind mount:-v [主机绝对路径]:[容器路径]
# -----------------------------------------------------------------------------
docker run -d -v my-data:/data nginx # 命名卷
docker run -d -v /host/data:/data nginx # 主机路径挂载(bind mount)
# ==============================================================================
# 五、网络管理(Network)
# ==============================================================================
# -----------------------------------------------------------------------------
# 列出网络
# 命令:docker network ls
# 作用:查看 Docker 创建的网络(bridge、host、none、自定义网络)
# 默认网络:
# - bridge:默认网桥,容器间可通过 IP 通信
# - host:共享主机网络栈,无隔离
# - none:无网络
# -----------------------------------------------------------------------------
docker network ls
# -----------------------------------------------------------------------------
# 创建自定义网络
# 命令:docker network create [选项] [网络名]
# 作用:创建隔离的虚拟网络,容器间可通过容器名 DNS 解析通信
# 必要性:微服务架构中,自定义网络比默认 bridge 更易管理
# -----------------------------------------------------------------------------
docker network create my-network
# 创建指定子网的网络
docker network create --subnet=172.20.0.0/16 --gateway=172.20.0.1 my-network
# -----------------------------------------------------------------------------
# 查看网络详情
# 命令:docker network inspect [网络名]
# -----------------------------------------------------------------------------
docker network inspect my-network
# -----------------------------------------------------------------------------
# 连接/断开容器网络
# 命令:docker network connect/disconnect [网络] [容器]
# 作用:动态调整容器网络归属,无需重启容器
# -----------------------------------------------------------------------------
docker network connect my-network my-nginx
docker network disconnect my-network my-nginx
# -----------------------------------------------------------------------------
# 删除网络
# 命令:docker network rm [网络名]
# 注意:需先断开所有连接的容器
# -----------------------------------------------------------------------------
docker network rm my-network
# -----------------------------------------------------------------------------
# 清理未使用网络
# 命令:docker network prune
# -----------------------------------------------------------------------------
docker network prune
# ==============================================================================
# 六、Docker Compose(多容器编排)
# ==============================================================================
# -----------------------------------------------------------------------------
# 启动服务(前台)
# 命令:docker compose up
# 作用:根据 docker-compose.yml 创建并启动所有服务
# 读取默认文件:当前目录的 docker-compose.yml 或 docker-compose.yaml
# -----------------------------------------------------------------------------
docker compose up
# -----------------------------------------------------------------------------
# 后台启动服务
# 命令:docker compose up -d
# 作用:守护模式运行,适合生产环境
# -----------------------------------------------------------------------------
docker compose up -d
# -----------------------------------------------------------------------------
# 停止并删除服务
# 命令:docker compose down
# 作用:停止容器、删除容器、删除自定义网络(默认保留卷)
#
# 常用选项:
# -v, --volumes 同时删除命名卷(彻底清理)
# --rmi [all/local] 删除镜像
# -----------------------------------------------------------------------------
docker compose down
docker compose down -v # 连同卷一起删除
# -----------------------------------------------------------------------------
# 查看服务状态
# 命令:docker compose ps
# 作用:列出 Compose 管理的所有容器
# -----------------------------------------------------------------------------
docker compose ps
# -----------------------------------------------------------------------------
# 查看服务日志
# 命令:docker compose logs [服务名]
# 作用:聚合所有服务的日志,或指定服务
# -----------------------------------------------------------------------------
docker compose logs -f # 跟踪所有服务
docker compose logs -f web # 只跟踪 web 服务
# -----------------------------------------------------------------------------
# 构建/重建镜像
# 命令:docker compose build [服务名]
# 作用:重新构建 Dockerfile 定义的镜像
# -----------------------------------------------------------------------------
docker compose build
docker compose up -d --build # 构建并启动
# -----------------------------------------------------------------------------
# 扩展/缩放服务
# 命令:docker compose up -d --scale [服务名]=[数量]
# 作用:快速水平扩展容器实例(负载均衡场景)
# -----------------------------------------------------------------------------
docker compose up -d --scale web=3
# ==============================================================================
# 七、系统维护与清理
# ==============================================================================
# -----------------------------------------------------------------------------
# 查看 Docker 系统信息
# 命令:docker info
# 作用:显示 Docker 守护进程配置、存储驱动、资源限制等详细信息
# -----------------------------------------------------------------------------
docker info
# -----------------------------------------------------------------------------
# 查看 Docker 版本
# 命令:docker version
# 作用:显示客户端和服务器版本信息,排查兼容性问题时使用
# -----------------------------------------------------------------------------
docker version
# -----------------------------------------------------------------------------
# 查看磁盘使用情况
# 命令:docker system df
# 作用:统计镜像、容器、卷、缓存的磁盘占用
# 选项:-v 显示详细信息
# -----------------------------------------------------------------------------
docker system df
docker system df -v
# -----------------------------------------------------------------------------
# 全面清理(危险!)
# 命令:docker system prune
# 作用:删除所有未使用的数据(停止的容器、悬空镜像、未使用网络、构建缓存)
#
# 选项:
# -a, --all 删除所有未使用镜像(不仅是悬空镜像)
# --volumes 同时删除未使用卷(彻底清理)
#
# 警告:生产环境慎用,可能误删数据!
# -----------------------------------------------------------------------------
docker system prune # 基础清理
docker system prune -a # 清理所有未使用镜像
docker system prune -a --volumes # 彻底清理(包括卷)
# -----------------------------------------------------------------------------
# 查看容器进程(类似 top)
# 命令:docker top [容器名]
# 作用:查看容器内运行的进程
# -----------------------------------------------------------------------------
docker top my-nginx
# -----------------------------------------------------------------------------
# 导出/导入容器
# 命令:docker export / docker import
# 作用:将容器文件系统打包为 tar(不含历史层),用于迁移
# 注意:推荐使用 docker save/load 处理镜像,保留分层信息
# -----------------------------------------------------------------------------
docker export -o my-nginx.tar my-nginx
docker import my-nginx.tar my-nginx:imported
# -----------------------------------------------------------------------------
# 保存/加载镜像
# 命令:docker save / docker load
# 作用:将镜像完整保存为 tar(包含所有层和历史),用于离线传输
# 优势:比 export/import 更完整,保留镜像元数据
# -----------------------------------------------------------------------------
docker save -o nginx.tar nginx:latest
docker load -i nginx.tar
# ==============================================================================
# 八、实用技巧与快捷命令
# ==============================================================================
# 批量停止所有容器
docker stop $(docker ps -q)
# 批量删除所有容器(包括运行中的)
docker rm -f $(docker ps -aq)
# 批量删除所有镜像
docker rmi $(docker images -q)
# 查看容器 IP 地址
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-nginx
# 查看容器环境变量
docker exec my-nginx env
# 查看容器资源限制
docker inspect -f '{{.HostConfig.Memory}} {{.HostConfig.CpuQuota}}' my-nginx
# 实时跟踪容器日志(带时间戳)
docker logs -ft --since="2024-01-01" my-nginx
# 进入容器执行命令并退出(不保持运行)
docker run --rm nginx nginx -t
# 复制容器内文件到主机当前目录
docker cp my-nginx:/etc/nginx/nginx.conf .
# 重命名容器
docker rename my-nginx new-nginx
# 更新容器重启策略
docker update --restart=always my-nginx
创作不易,感谢支持!
更多推荐
所有评论(0)