## 什么是 Docker
Docker 是一个开放源代码的软件平台,用于开发、交付和运行应用程序。Docker 使用容器化技术,让开发者可以将应用及其依赖打包在一个轻量级、可移植的容器中。这样,无论在何种环境下,都能确保应用运行的一致性和效率。
## 安装 Docker
### 手动安装
```Shell
# Add Docker's official GPG key:
$ sudo apt-get update
$ sudo apt-get install ca-certificates curl
$ sudo install -m 0755 -d /etc/apt/keyrings
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
$ sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update
# Install Docker
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
### 三方脚本安装
可以解决国内网络无法安装问题
```Bash
# 使用1panel,安装完Docker后按下ctrl+c强制退出安装即可
$ curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh
# 使用linuxmirrors安装
$ bash <(curl -sSL https://linuxmirrors.cn/docker.sh)
# 使用kejilion.sh,通过提示安装即可
$ curl -sS -O https://raw.githubusercontent.com/kejilion/sh/refs/heads/main/en/kejilion.sh && $ chmod +x kejilion.sh && ./kejilion.sh
```
## 启动 Docker
启动 Docke 服务并设置为开机自启动
```Shell
$ sudo systemctl start docker && sudo systemctl enable docker && sudo systemctl status docker
```
## 配置 Docker 镜像加速
1. 修改创建配置文件
```shell
$ vim /etc/docker/daemon.json
```
2. 修改或添加配置
```json
{
"registry-mirrors": [
"https://proxy.1panel.live",
"https://docker.catcto.com",
"https://ghcr.catcto.com",
"https://gcr.catcto.com"
],
"runtimes": {
"nvidia": {
"args": [],
"path": "nvidia-container-runtime"
}
}
}
```
3. 重启 Docker
```shell
$ systemctl restart docker
```
如果是 Mac/Windows 系统,可以在 Docker desktop 设置 Docker Engine 配置
## 配置 Docker 代理
1. 创建配置文件
```shell
$ mkdir -p /etc/systemd/system/docker.service.d
$ vim /etc/systemd/system/docker.service.d/http-proxy.conf
```
2. 修改或添加配置
```
[Service]
Environment="HTTP_PROXY=你的代理"
Environment="HTTPS_PROXY=你的代理"
```
3. 重启 Docker
```shell
$ systemctl daemon-reload
$ systemctl restart docker
$ systemctl show --property=Environment docker
```
## 配置 Docker日志大小
```yaml
services:
test:
image: test:latest
container_name: test
restart: always
logging:
driver: 'json-file'
options:
max-size: '1m'
max-file: '1'
```
## 清理 Docker 占用的磁盘空间
在 Docker 中,`/var/lib/docker/overlay2/` 目录用来存储镜像和容器的数据。如果你发现这个目录占用了过多的空间,你可以通过以下步骤来排查哪些文件或目录占用的空间最大:
1. 检查 Docker 镜像和容器的大小
```bash
# 查看所有镜像及其大小
$ docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
# 查看所有容器及其大小
$ docker ps -a --size --format "table {{.ID}}\t{{.Image}}\t{{.Size}}"
```
2. 使用 `du` 命令检查 `/var/lib/docker/overlay2/` 下哪些子目录占用的空间大(按大小排序)
```bash
$ sudo du -h --max-depth=1 /var/lib/docker/overlay2/ | sort -hr
```
3. 识别具体文件,如果你需要更详细地了解某个特定子目录中的文件占用情况,可以进入对应的目录,使用 `du` 命令深入查看
```bash
$ cd /var/lib/docker/overlay2/<specific-directory>
$ sudo du -h --max-depth=1 | sort -hr
```
4. 清理未使用的镜像和容器,如果确定一些镜像或容器不再需要,可以通过以下方式清理
```shell
# 删除所有未运行的容器
$ docker container prune
# 删除所有未被使用的镜像
$ docker image prune
# 删除所有未被使用的数据卷
$ docker volume prune
# 删除所有网络
$ docker network prune
# 删除所有未被使用的对象(注意:这将删除未被使用的镜像、网络、数据卷和已停止的容器)
$ docker system prune
```
## 备份 Docker Volumes
1. 打包所有卷到一个压缩文件,将以下脚本保存为 `backup_volumes.sh` 文件
```bash
#!/bin/bash
# 定义需要备份的卷名称
VOLUMES=("catcto-home-2_postgres-data" "catcto-home-2_mongo-data" "catcto-home-2_redis-data" "catcto-home-2_homeassistant-config" "catcto-home-2_emqx-data" "catcto-home-2_emqx-log")
# 备份文件名
BACKUP_FILE="./volumes_backup.tar.gz"
# 创建临时目录
TEMP_DIR="./temp_volumes"
mkdir -p "$TEMP_DIR"
# 遍历每个卷并复制数据到临时目录的子目录中
for VOLUME in "${VOLUMES[@]}"; do
echo "正在备份卷 $VOLUME..."
# 为每个卷创建一个子目录
mkdir -p "$TEMP_DIR/$VOLUME"
# 使用 busybox 容器将卷中的数据复制到临时目录的对应子目录
docker run --rm \
-v "$VOLUME:/volume" \
-v "$(pwd)/$TEMP_DIR/$VOLUME:/backup" \
busybox cp -a /volume/. /backup/
done
# 打包所有临时文件到一个压缩文件中
echo "正在创建备份文件 $BACKUP_FILE..."
tar czvf "$BACKUP_FILE" -C "$TEMP_DIR" .
# 清理临时目录
rm -rf "$TEMP_DIR"
echo "所有卷已成功备份到 $BACKUP_FILE"
```
2. 运行备份脚本:
```shell
$ chmod +x backup_volumes.sh
$ ./backup_volumes.sh
```
3. 下载备份文件
```shell
$ scp catcto-home-2:~/volumes_backup.tar.gz ./
```
4. 恢复卷,将以下脚本保存为 `restore_volumes.sh` 文件
```bash
#!/bin/bash
# 定义需要还原的卷名称(应与备份时的卷名称一致)
VOLUMES=("catcto-home-2_postgres-data" "catcto-home-2_mongo-data" "catcto-home-2_redis-data" "catcto-home-2_homeassistant-config" "catcto-home-2_emqx-data" "catcto-home-2_emqx-log")
# 设置备份文件路径
BACKUP_FILE="./volumes_backup.tar.gz"
# 设置临时目录(用于解压备份文件)
TEMP_DIR="./temp_restore"
# 检查备份文件是否存在
if [ ! -f "$BACKUP_FILE" ]; then
echo "错误: 备份文件 $BACKUP_FILE 不存在。请检查路径或备份文件名称。"
exit 1
fi
# 创建临时目录
echo "创建临时目录 $TEMP_DIR..."
mkdir -p "$TEMP_DIR"
# 解压备份文件到临时目录
echo "正在解压备份文件 $BACKUP_FILE 到 $TEMP_DIR..."
tar xzvf "$BACKUP_FILE" -C "$TEMP_DIR"
# 遍历每个卷并将数据恢复到对应的 Docker 卷中
for VOLUME in "${VOLUMES[@]}"; do
echo "正在恢复卷 $VOLUME..."
# 检查卷的备份子目录是否存在
if [ ! -d "$TEMP_DIR/$VOLUME" ]; then
echo "警告: 备份中未找到卷 $VOLUME 的数据,跳过恢复该卷。"
continue
fi
# 使用 busybox 容器将备份数据复制回 Docker 卷
docker run --rm \
-v "$VOLUME:/volume" \
-v "$(pwd)/$TEMP_DIR/$VOLUME:/backup" \
busybox sh -c "rm -rf /volume/* && cp -a /backup/. /volume/"
if [ $? -eq 0 ]; then
echo "卷 $VOLUME 恢复成功。"
else
echo "错误: 卷 $VOLUME 恢复失败。"
fi
done
# 清理临时目录
echo "清理临时目录 $TEMP_DIR..."
rm -rf "$TEMP_DIR"
echo "所有卷已成功还原。"
```
5. 运行恢复脚本:
```shell
$ chmod +x restore_volumes.sh
$ ./restore_volumes.sh
```
## 参考
- https://docs.docker.com/engine/install/ubuntu/
- https://docs.docker.com/config/daemon/systemd/