## 什么是 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/