什么是 Docker?如何在 VPS 上使用?
Docker 是一种工具,它把应用连同所需的一切,放在一个称为容器的隔离包中运行。在 VPS 上使用 Docker,意味着您从现成的包启动应用,而不是在服务器上一件件安装。安装和移除只需几条命令,而且应用之间不会干扰彼此的设置。
与虚拟机不同,容器不自带操作系统。它共用服务器的内核,所以几秒钟就能启动,占用的内存也很少。代价是它的隔离性不如虚拟机强。
入门只需四个术语
| 术语 | 含义 |
|---|---|
| 镜像(Image) | 应用现成的包。它从 Docker Hub 之类的镜像仓库下载。 |
| 容器(Container) | 从镜像启动的一个运行中的副本。 |
| 卷(Volume) | 持久存储,即使容器被删除,数据也会保留。 |
| Compose | 一种工具,在一个 compose.yaml 文件中定义多个容器,并用一条命令管理它们。 |
删除容器会删除其中的文件。必须保留的内容(例如数据库)要挂载到卷或服务器的文件夹上。
如何在 Ubuntu 上安装 Docker?
首先通过 SSH 连接服务器。Ubuntu 软件源中的 docker.io 软件包可以使用,Seturack 预装 Docker 的服务器用的就是它。如果要最新版本,请使用 Docker 自己的 apt 软件源。根据 Docker 官方文档,Ubuntu 的 docker.io、docker-compose 等软件包与 Docker 自己的软件包冲突,所以如果已经安装,请先删除。
- 按照 Docker 的 Ubuntu 安装页面上“apt repository”一节添加软件源的签名密钥和源。请原样运行那里的命令,因为它们会随版本变化。
- 安装软件包:
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin - 检查服务是否在运行:
sudo systemctl status docker - 运行测试容器:
sudo docker run --rm hello-world
如果看到欢迎信息,说明 Docker 已就绪。在 Ubuntu 和 Debian 上,服务会在每次开机时自动启动。
您的第一个容器
用一条命令启动一个 Web 服务器:
docker run -d --name web --restart unless-stopped -p 80:80 nginx:1.30
-d 让容器在后台运行。--restart unless-stopped 会在服务器重启或容器崩溃时重新启动它。-p 80:80 把服务器的 80 端口连接到容器。nginx:1.30 是镜像名称和版本标签。这个标签只是示例,请到 Docker Hub 上的官方 Nginx 页面选择当前的稳定标签。在浏览器中打开服务器的 IP 地址,您会看到 Nginx 欢迎页面。要删除它,请运行 docker rm -f web。
为持久数据挂载一个卷,例如 -v sitedata:/usr/share/nginx/html。用 docker volume ls 列出卷。同一个 compose.yaml 文件中的服务可以通过服务名互相访问,例如您的应用以 db 的名字连接数据库。
有多个容器时,把它们都写进一个 compose.yaml 文件,并在该文件所在的文件夹中运行 docker compose up -d。文件中的 image、restart、ports 和 volumes 键与上面的参数相对应。用 docker compose ps 检查状态,用 docker compose logs -f 查看日志,用 docker compose down 关闭全部容器。
每天都会用到的命令
| 命令 | 作用 |
|---|---|
docker ps | 列出运行中的容器。加上 -a 还能看到已停止的容器。 |
docker logs -f web | 实时跟踪 web 容器的日志。 |
docker exec -it web sh | 在容器内打开一个 shell。 |
docker stats | 显示容器的 CPU 和内存使用情况。 |
docker compose pull 和 docker compose up -d | 下载新镜像,并用新容器替换旧容器。卷中的数据会保留。 |
更新之前,请阅读应用的发行说明,并自己在 compose 文件中提高版本标签。固定标签的意义在于,让更新成为一个决定,而不是一次意外。
需要留意的四件事
- Docker 会绕过 ufw 规则。根据官方文档,Docker 发布的端口会在 ufw 规则生效之前就被开放。一条拒绝该端口的 ufw 规则不会起作用。对于不能从外部访问的服务,请只绑定到本地地址,例如
-p 127.0.0.1:5432:5432。同一个 Docker 网络中的容器本来就可以互相访问,所以不需要发布数据库。 - latest 标签。如果不指定标签,会拉取
latest。下次拉取时,您的应用可能跳到一个您没想到的版本。请写明具体的标签,并自己安排更新。 - docker 组就等于 root。把用户加入
docker组,就赋予该用户 root 级别的权限(官方文档)。只添加您信任的账户。 - 日志和镜像会占满磁盘。Docker 默认的日志设置没有大小限制。请在容器上设置:
--log-opt max-size=10m --log-opt max-file=3。docker system df显示磁盘使用情况,docker image prune会删除没有标签的镜像。
用 Docker 还是直接安装?
如果您在一台服务器上运行多个需要不同版本的应用,想试用某个应用并干净地删除,或者开发者发布了官方镜像,Docker 会有帮助。对于单个 WordPress 网站这样的简单情形,直接安装也完全可以。Docker 是额外的一层:更新它、监控它、备份卷,都是您的工作。如果拿不准,就从一个小应用开始,不必一次把所有东西都搬到 Docker 上。
Seturack 上的 Docker 开箱即用
如果不想自己安装 Docker,可以下单选择带 Docker 应用的服务器。Docker 和 Compose 已安装好,安装约需 2.5 分钟。防火墙(ufw)已开启,对外只开放 SSH 端口,fail2ban 保护 SSH,每个容器的日志限制为 3 个文件,每个 10 MB。这个应用没有网页界面,所以面板中不显示网站地址。上面提到的端口陷阱在这里同样适用。想从现成的服务器开始,请看 Docker VPS 页面。
评论0
暂无评论
成为第一个分享想法的人。
请登录或注册后发表评论。