424 lines
11 KiB
Markdown
424 lines
11 KiB
Markdown
# Docker(容器化平台)
|
||
|
||
Docker 是一个 容器化平台,可以让你把应用程序和它运行所需的环境打包在一起,形成一个独立的“容器”。
|
||
简单来说,它就像一个轻量级的虚拟机,但比虚拟机更快、更省资源。
|
||
|
||
## 概念
|
||
1. 镜像(Image)
|
||
- 镜像是一个 只读模板,包含应用程序和依赖环境。
|
||
- 可以理解为应用的快照,像“配方”。
|
||
2. 容器(Container)
|
||
- 容器是镜像的 运行实例,可以启动、停止、删除。
|
||
- 可以理解为根据配方做出来的“饭菜”。
|
||
3. Dockerfile
|
||
- 用来定义镜像内容的文件,相当于“配方清单”。
|
||
- 里面写明了基础镜像、依赖、环境变量、运行命令等。
|
||
4. Docker Hub
|
||
- 官方提供的镜像仓库,可以下载别人已经打包好的镜像,也可以上传自己的镜像。
|
||
|
||
## 快速安装
|
||
|
||
轩辕提供的安装脚本:
|
||
|
||
```bash
|
||
bash <(wget -qO- https://xuanyuan.cloud/docker.sh)
|
||
```
|
||
|
||
> 参考网站:https://zhuanlan.zhihu.com/p/24461370776
|
||
|
||
## 常用命令速查
|
||
|
||
:::tip 高频命令
|
||
日常排查 Docker 问题时,优先看容器状态、日志、端口映射和磁盘占用。
|
||
:::
|
||
|
||
### 容器
|
||
|
||
```bash
|
||
# 查看正在运行的容器
|
||
docker ps
|
||
|
||
# 查看所有容器,包括已停止的
|
||
docker ps -a
|
||
|
||
# 启动 / 停止 / 重启容器
|
||
docker start 容器名或容器ID
|
||
docker stop 容器名或容器ID
|
||
docker restart 容器名或容器ID
|
||
|
||
# 删除容器
|
||
docker rm 容器名或容器ID
|
||
|
||
# 强制删除运行中的容器
|
||
docker rm -f 容器名或容器ID
|
||
```
|
||
|
||
### 镜像
|
||
|
||
```bash
|
||
# 查看本地镜像
|
||
docker images
|
||
|
||
# 拉取镜像
|
||
docker pull 镜像名:版本
|
||
|
||
# 删除镜像
|
||
docker rmi 镜像名或镜像ID
|
||
|
||
# 构建镜像
|
||
docker build -t 镜像名:版本 .
|
||
```
|
||
|
||
### 运行与进入容器
|
||
|
||
```bash
|
||
# 后台运行容器,并映射端口
|
||
docker run -d --name 容器名 -p 主机端口:容器端口 镜像名:版本
|
||
|
||
# 后台运行容器,并挂载目录
|
||
docker run -d --name 容器名 -v 主机目录:容器目录 镜像名:版本
|
||
|
||
# 进入正在运行的容器
|
||
docker exec -it 容器名或容器ID bash
|
||
|
||
# 如果容器内没有 bash,改用 sh
|
||
docker exec -it 容器名或容器ID sh
|
||
```
|
||
|
||
### 日志与排查
|
||
|
||
```bash
|
||
# 查看容器日志
|
||
docker logs 容器名或容器ID
|
||
|
||
# 实时查看容器日志
|
||
docker logs -f 容器名或容器ID
|
||
|
||
# 查看容器端口映射
|
||
docker port 容器名或容器ID
|
||
|
||
# 查看容器资源占用
|
||
docker stats
|
||
|
||
# 查看 Docker 磁盘占用
|
||
docker system df
|
||
```
|
||
|
||
### Docker Compose
|
||
|
||
```bash
|
||
# 启动 compose 服务
|
||
docker compose up -d
|
||
|
||
# 停止并删除 compose 服务
|
||
docker compose down
|
||
|
||
# 重新构建并启动
|
||
docker compose up -d --build
|
||
|
||
# 查看 compose 服务日志
|
||
docker compose logs -f
|
||
```
|
||
|
||
### 清理
|
||
|
||
:::warning 谨慎执行
|
||
清理命令可能删除未使用的容器、镜像、网络和缓存。生产环境执行前先确认影响范围。
|
||
:::
|
||
|
||
```bash
|
||
# 删除所有已停止的容器
|
||
docker container prune
|
||
|
||
# 删除未使用的镜像
|
||
docker image prune
|
||
|
||
# 删除未使用的容器、镜像、网络和构建缓存
|
||
docker system prune
|
||
|
||
# 更彻底清理,包括未被容器使用的镜像
|
||
docker system prune -a
|
||
```
|
||
|
||
## 脚本安装
|
||
|
||
### 对于基于Debian的系统(如Ubuntu、Debian)
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
|
||
# -------------------------
|
||
# 1️⃣ 卸载旧版本 Docker
|
||
# -------------------------
|
||
sudo apt-get remove -y \
|
||
docker \
|
||
docker-engine \
|
||
docker.io \
|
||
containerd \
|
||
runc \
|
||
docker-ce \
|
||
docker-ce-cli \
|
||
containerd.io \
|
||
docker-compose-plugin
|
||
|
||
# 可选:清理残留数据(慎用,会删除容器和镜像)
|
||
# sudo rm -rf /var/lib/docker /var/lib/containerd
|
||
|
||
echo "旧版本 Docker 已卸载(如果存在)"
|
||
|
||
# -------------------------
|
||
# 2️⃣ 更新软件包列表并安装必要依赖
|
||
# -------------------------
|
||
sudo apt-get update
|
||
sudo apt-get install -y ca-certificates curl software-properties-common lsb-release
|
||
|
||
# -------------------------
|
||
# 3️⃣ 创建密钥存储目录
|
||
# -------------------------
|
||
sudo install -m 0755 -d /etc/apt/keyrings
|
||
|
||
# -------------------------
|
||
# 4️⃣ 下载Docker官方GPG密钥
|
||
# -------------------------
|
||
sudo curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg -o /etc/apt/keyrings/docker.asc
|
||
sudo chmod a+r /etc/apt/keyrings/docker.asc
|
||
|
||
# -------------------------
|
||
# 5️⃣ 添加 Docker 仓库
|
||
# -------------------------
|
||
if [ "$(lsb_release -is)" = "Ubuntu" ]; then
|
||
echo \
|
||
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
|
||
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||
elif [ "$(lsb_release -is)" = "Debian" ]; then
|
||
echo \
|
||
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
|
||
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||
fi
|
||
|
||
sudo apt-get update
|
||
echo "Docker 仓库已添加。"
|
||
|
||
# -------------------------
|
||
# 6️⃣ 安装 Docker 及相关组件
|
||
# -------------------------
|
||
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
|
||
|
||
echo "Docker 安装完成 ✅"
|
||
```
|
||
|
||
### 对于基于RHEL的系统(如CentOS、RHEL)
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
|
||
# -------------------------
|
||
# 1️⃣ 卸载旧版本 Docker
|
||
# -------------------------
|
||
sudo yum remove -y docker \
|
||
docker-client \
|
||
docker-client-latest \
|
||
docker-common \
|
||
docker-latest \
|
||
docker-latest-logrotate \
|
||
docker-logrotate \
|
||
docker-engine \
|
||
docker-ce \
|
||
docker-ce-cli \
|
||
containerd.io \
|
||
docker-compose-plugin
|
||
|
||
echo "旧版本 Docker 已卸载(如果存在)"
|
||
|
||
# -------------------------
|
||
# 2️⃣ 安装 yum 配置管理工具
|
||
# -------------------------
|
||
sudo yum install -y yum-utils
|
||
|
||
# -------------------------
|
||
# 3️⃣ 检测系统发行版并添加 Docker 仓库
|
||
# -------------------------
|
||
if [ -f /etc/centos-release ]; then
|
||
# CentOS 系统
|
||
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
|
||
elif [ -f /etc/redhat-release ]; then
|
||
# RHEL 系统
|
||
# 注意:RHEL 用户需要启用订阅管理仓库
|
||
sudo yum-config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
|
||
else
|
||
echo "未识别的发行版,脚本退出。"
|
||
exit 1
|
||
fi
|
||
|
||
# -------------------------
|
||
# 4️⃣ 更新 yum 缓存
|
||
# -------------------------
|
||
sudo yum makecache fast
|
||
echo "Docker 仓库已添加。"
|
||
|
||
# -------------------------
|
||
# 5️⃣ 安装 Docker 及相关组件
|
||
# -------------------------
|
||
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
|
||
|
||
echo "Docker 安装完成 ✅"
|
||
```
|
||
|
||
### 通用脚本
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
|
||
set -e
|
||
|
||
# -------------------------
|
||
# 1️⃣ 卸载旧版本 Docker
|
||
# -------------------------
|
||
remove_old_docker() {
|
||
if command -v apt-get >/dev/null 2>&1; then
|
||
sudo apt-get remove -y docker docker-engine docker.io containerd runc docker-ce docker-ce-cli containerd.io docker-compose-plugin || true
|
||
elif command -v yum >/dev/null 2>&1; then
|
||
sudo yum remove -y docker \
|
||
docker-client \
|
||
docker-client-latest \
|
||
docker-common \
|
||
docker-latest \
|
||
docker-latest-logrotate \
|
||
docker-logrotate \
|
||
docker-engine \
|
||
docker-ce \
|
||
docker-ce-cli \
|
||
containerd.io \
|
||
docker-compose-plugin || true
|
||
fi
|
||
echo "旧版本 Docker 已卸载(如果存在)"
|
||
}
|
||
|
||
# -------------------------
|
||
# 2️⃣ 安装 Docker(DEB 系统)
|
||
# -------------------------
|
||
install_docker_deb() {
|
||
local distro=$1
|
||
local codename=$2
|
||
sudo apt-get update
|
||
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common lsb-release
|
||
sudo install -m 0755 -d /etc/apt/keyrings
|
||
sudo curl -fsSL "https://download.docker.com/linux/$distro/gpg" -o /etc/apt/keyrings/docker.asc
|
||
sudo chmod a+r /etc/apt/keyrings/docker.asc
|
||
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/$distro $codename stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||
sudo apt-get update
|
||
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||
sudo systemctl enable --now docker
|
||
}
|
||
|
||
# -------------------------
|
||
# 3️⃣ 安装 Docker(RPM 系统)
|
||
# -------------------------
|
||
install_docker_rpm() {
|
||
local distro=$1
|
||
if [ "$distro" = "fedora" ]; then
|
||
sudo dnf -y install dnf-plugins-core
|
||
else
|
||
sudo yum install -y yum-utils
|
||
fi
|
||
sudo yum-config-manager --add-repo "https://download.docker.com/linux/$distro/docker-ce.repo"
|
||
sudo yum makecache fast
|
||
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
|
||
sudo systemctl enable --now docker
|
||
}
|
||
|
||
# -------------------------
|
||
# 4️⃣ 主流程
|
||
# -------------------------
|
||
remove_old_docker
|
||
|
||
# 检测 Linux 发行版
|
||
if [ -f /etc/os-release ]; then
|
||
. /etc/os-release
|
||
else
|
||
echo "无法确定您的 Linux 发行版。"
|
||
exit 1
|
||
fi
|
||
|
||
case $ID in
|
||
ubuntu|debian|raspbian)
|
||
echo "检测到 $ID $VERSION_CODENAME,开始安装 Docker..."
|
||
install_docker_deb $ID $VERSION_CODENAME
|
||
;;
|
||
centos|rhel|fedora|sles)
|
||
echo "检测到 $ID,开始安装 Docker..."
|
||
install_docker_rpm $ID
|
||
;;
|
||
*)
|
||
echo "不支持的 Linux 发行版:$ID"
|
||
exit 1
|
||
;;
|
||
esac
|
||
|
||
echo "Docker 及 Docker Compose 安装完成 ✅"
|
||
```
|
||
|
||
### 运行脚本
|
||
|
||
```bash
|
||
# 1.创建脚本
|
||
vim docker-script.sh
|
||
|
||
# 2.输入内容 i 进行编辑模式, :wq 保存
|
||
|
||
# 3.赋予权限
|
||
chmod +x docker-script.sh
|
||
|
||
# 4.运行脚本
|
||
./docker-script.sh
|
||
```
|
||
|
||
## 镜像设置
|
||
|
||
不设置镜像会导致拉取速度非常慢
|
||
访问 https://api.suoyinmulu.com/open/v1/docker-hub/seeded-up/lists 获取最新的docker镜像,将 list 中的内容拷贝到 docker 中的 registry-mirrors 中。
|
||
|
||
```bash
|
||
sudo vim /etc/docker/daemon.json
|
||
```
|
||
|
||
```json
|
||
{
|
||
"registry-mirrors": [
|
||
// list
|
||
]
|
||
}
|
||
```
|
||
|
||
刷新:
|
||
|
||
```bash
|
||
sudo systemctl daemon-reload && sudo systemctl restart docker
|
||
```
|
||
|
||
## 问题
|
||
### 权限不足
|
||
1. 添加docker用户组(默认有)
|
||
|
||
```
|
||
sudo groupadd docker
|
||
```
|
||
|
||
2. 添加当前用户到docker组中
|
||
|
||
```
|
||
sudo gpasswd -a $USER docker
|
||
```
|
||
|
||
3. 更新用户组
|
||
|
||
```
|
||
newgrp docker
|
||
```
|
||
|
||
4. 重启生效 或 提前执行(建议重启)
|
||
|
||
```
|
||
sudo chown root:docker /var/run/docker.sock
|
||
```
|