Docker的基本操作

# Docker 及 Docker Compose 的安装与配置

## Docker 的安装

### 升级 packages

```bash
apt update -y

安装一些必要软件(Debian 系统比较干净)

apt install wget curl sudo vim git -y

Docker 安装(这里及下面所指都是大陆外的 VPS)

wget -qO- get.docker.com | bash

使 Docker 开机自启动

systemctl enable docker

修改 Docker 配置

以下配置会增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能,以及限制日志文件大小,防止 Docker 日志塞满硬盘。——来自烧饼博客

cat > /etc/docker/daemon.json <<EOF
{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "20m",
        "max-file": "3"
    },
    "ipv6": true,
    "fixed-cidr-v6": "fd00:dead:beef:c0::/80",
    "experimental":true,
    "ip6tables":true
}
EOF

然后重启 Docker 便可生效

systemctl restart docker

Docker Compose 的安装

命令安装

curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

创建 Docker 数据目录

为了管理及迁移的方便,我们一般把所有的 Docker 数据统一放在一处,所以这里我们新建一个路径为 /root/data/docker_data 的文件:

cd ~
mkdir -p /root/data/docker_data

Docker 的迁移

当我们要换服务器时,Docker 的优势便体现了出来。这里我们以将原服务器 A 的 Docker 项目 doc 迁移至新服务器 B 为例:

doc 项目的传输

# 来到 A 服务器放 doc 项目的 Docker 数据的地方
cd /root/data/docker_data

# 创建 doc 的压缩文件 doc.tar.gz
tar -czvf doc.tar.gz doc

# 将 A 服务器的 doc.tar.gz 文件通过 SSH 方式传输至 B 服务器的 /root/data/docker_data 路径下
scp -P 22 -r doc.tar.gz root@YourIP:/root/data/docker_data

其中 22 指 SSH 的端口,若不是则改为其他;root 指 B 服务器的 root 用户;YourIP 指 B 服务器的 IP 地址,而 YourIP: 后的路径可以自定义。

开启 B 服务器上的 doc 项目

# 然后我们来到 B 服务器的对应路径下
cd /root/data/docker_data/

# 将 doc.tar.gz 解压为 doc
tar -zxvf doc.tar.gz

# 删除 doc.tar.gz
rm -rf /root/data/docker_data/doc.tar.gz

doc 是以 Docker 命令形式部署的项目:只需把之前部署的命令再敲一次就行(但是注意路径的映射)

doc 是以 Docker Compose 部署的项目:

cd /root/data/docker_data/doc
docker-compose up -d

停止 A 服务器上的 doc 项目并删除

这一步,可见 Docker 项目的停止及删除

Docker 项目的停止及删除

以 Docker 命令部署的项目的停止及删除

以 Docker Compose 部署的项目也适用

我们要停止一个正在运行的 Docker 容器,首先要知道容器的名字或 ID ,所以可以通过下面命令,列出所有在运行的容器信息:

docker ps

如果我们要列出所有容器的信息(包括已停止的容器),那么我们可以用下面的命令:

docker ps -a

记住要删除的容器名或 ID 以及其所对应的镜像。

容器的停止

docker stop <name_or_id>

<name_or_id> 为容器名或 ID

如果我们只是想把项目停下,但保留数据,以便下次打开的话,到那么到这一步就可以了。但如果我们要将整个项目删除,则可以继续下面的步骤。

容器的删除

docker rm -f <name_or_id>

镜像的删除

虽然我们删除了容器,但最占空间的镜像我们并没有删除。

我们可以通过下面的命令来查看所有的镜像名或 ID:

docker image ls -a

找到与删除容器所对应的镜像,执行下面的命令便可删除镜像:

docker rmi -f <image_name_or_id>

这里 <image_name_or_id> 为镜像名或 ID

删除本地映射文件

我们在运行 Docker 项目时常常会将本地文件与容器中文件做一个映射,然后容器的数据便会在映射的本地文件中储存,这也是我们要删除的一部分,我们可以执行下面的命令:

rm -rf <your_path>

<your_path> 为本地映射文件的路径

如果按照之前的规范,该路径一般为 /root/data/docker_data/doc ,把 doc 换为你的项目名即可

其他

还有网络配置等的数据需要删除,但一般而言,它们占空间并不大,如要细究可见这里。

总结

总体而言,这种删除方法比较复杂,如果没啥要保留的镜像,我们可以直接使用 Docker 数据的清理介绍的方法来清除这些数据(但是映射文件无法通过该方法清除)。

以 Docker Compose 部署的容器的停止及删除

以 Docker 命令部署的项目并不适用

这里仍以上面的 doc 项目为例

# 来到本地映射文件目录下
cd /root/data/docker_data/doc

# 停止并删除容器
docker-compose down

这里我们只能停止并删除容器,而其他操作参考以 Docker 命令部署的项目的停止及删除的镜像删除及其之后的操作。

Docker 数据的清理

使用 Docker 就不得不面对一个问题,那就是磁盘空间的清理,因为我们有时会忘记删除不用的 Docker 容器及镜像。

我们一般可以通过下面的代码来查看 Docker 镜像与容器的占用情况:

docker system df

我们可能会看到一个很可怕的数据,因此我们应当定期地删除一些已停止的容器,未使用的网络和悬挂的镜像,即执行下面的命令:

docker system prune

或者,更激进一点,直接删除所有与正在运行的容器无关的镜像:

docker system prune -a

脚本

#!/bin/bash

# 更新 packages
apt update -y

# 安装必要软件
apt install wget curl sudo vim git -y

# 安装 Docker
wget -qO- get.docker.com | bash

# 使 Docker 开机自启动
systemctl enable docker

# 修改 Docker 配置
cat > /etc/docker/daemon.json <<EOF
{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "20m",
        "max-file": "3"
    },
    "ipv6": true,
    "fixed-cidr-v6": "fd00:dead:beef:c0::/80",
    "experimental":true,
    "ip6tables":true
}
EOF

# 重启 Docker 使配置生效
systemctl restart docker

# 安装 Docker Compose
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

# 创建 Docker 数据目录
cd ~
mkdir -p /root/data/docker_data

# 迁移 Docker 项目
# 来到 A 服务器放 doc 项目的 Docker 数据的地方
cd /root/data/docker_data

# 创建 doc 的压缩文件 doc.tar.gz
tar -czvf doc.tar.gz doc

# 将 A 服务器的 doc.tar.gz 文件通过 SSH 方式传输至 B 服务器的 /root/data/docker_data 路径下
scp -P 22 -r doc.tar.gz root@YourIP:/root/data/docker_data

# 来到 B 服务器的对应路径下
cd /root/data/docker_data/

# 将 doc.tar.gz 解压为 doc
tar -zxvf doc.tar.gz

# 删除 doc.tar.gz
rm -rf /root/data/docker_data/doc.tar.gz

# 如果 doc 是以 Docker Compose 部署的项目
cd /root/data/docker_data/doc
docker-compose up -d

# 停止 A 服务器上的 doc 项目并删除
docker ps
docker stop <name_or_id>
docker rm -f <name_or_id>
docker image ls -a
docker rmi -f <image_name_or_id>
rm -rf <your_path>

# Docker 数据的清理
docker system df
docker system prune
docker system prune -a

YourIP 替换为实际的 B 服务器 IP 地址。 将 <name_or_id> 替换为实际的容器名或 ID。 将 <image_name_or_id> 替换为实际的镜像名或 ID。 将 <your_path> 替换为实际的本地映射文件路径。

将上述脚本保存为一个文件,例如 docker_setup.sh,然后赋予其执行权限并运行:

chmod +x docker_setup.sh
./docker_setup.sh
{0x14000bcf180 0x14000b9a8f0}