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