cd ..

云服务器中使用 Docker 搭建子服务器

在云计算环境中,使用 Docker 容器技术可以实现更灵活的服务部署方案。本文介绍如何利用 Docker 搭建轻量级的子服务器,减少对特定云服务提供商的依赖,实现快速迁移。

你有没有遇到过这种情况:在一台云服务器上辛辛苦苦配好了环境、装好了各种依赖,结果某天需要换服务商或者加一台机器,发现所有事情得从头来一遍?

这正是我开始用 Docker 搭建”子服务器”的原因。把应用跑在容器里,而不是直接装在宿主机上,迁移的时候打个包就走,几分钟就能在新机器上跑起来。

为什么选择 Docker?

直接在云服务器上部署应用当然可以,但时间一长你会发现几个头疼的问题:环境难以复现、迁移成本高、不同应用之间互相干扰。Docker 恰好解决了这些痛点:

  • 可移植性强:容器可以轻松地在不同云服务器间迁移
  • 环境隔离:应用程序运行在独立的容器环境中,不受宿主机影响
  • 资源高效:比传统虚拟机更轻量,资源消耗更少
  • 快速部署:容器启动速度快,便于快速扩展

简单来说,Docker 让你的服务器环境变成了”随身携带”的东西,而不是绑死在某台机器上。

Docker 基础操作指南

接下来我们从零开始,一步一步把容器跑起来。

配置 Docker 权限

装好 Docker 之后,第一件事是把当前用户加到 docker 用户组里。不然每次执行命令都要加 sudo,用起来很烦:

sudo usermod -aG docker $USER

注意,添加后需要重新登录才能生效,别改完就直接跑命令,不然会报权限错误。

Docker 容器管理

创建并运行容器

一行命令就能创建一个基于 Ubuntu 的容器,同时把 SSH 端口映射出来:

docker run --name my_server -p 20000:22 -itd ubuntu:20.04

这里每个参数都有用,拆开来看:

  • --name my_server:指定容器名称
  • -p 20000:22:将容器的22端口映射到宿主机的20000端口
  • -itd:交互式终端,后台运行
  • ubuntu:20.04:使用的镜像

端口映射这一步很关键 — 之后你就可以通过宿主机的 20000 端口 SSH 进容器了,就像连接一台独立的服务器一样。

进入容器

容器跑起来之后,用 attach 进去:

docker attach my_server

进去第一件事,给 root 设个密码,不然后面配 SSH 的时候会很麻烦:

passwd

容器操作技巧

有个小技巧很实用:想要临时退出容器但又不想把它停掉,可以用挂起操作:

  1. 先按 Ctrl+p
  2. 再按 Ctrl+q

这样容器会继续在后台运行,而你回到了宿主机的终端。如果直接输 exit 或者按 Ctrl+d,容器就停了,这个区别一定要记住。

容器迁移方案

这是整篇文章最核心的部分 — 怎么把一个配好的容器搬到另一台机器上。整个流程分五步,看起来多,但每一步都很简单。

1.将容器保存为镜像

docker commit my_server my_custom_image:v1

2.将镜像导出为文件

docker save -o my_server_image.tar my_custom_image:v1

3.设置文件权限并传输

chmod +r my_server_image.tar

scp my_server_image.tar user@new-server:/path/to/destination

4.在新服务器上加载镜像

docker load -i my_server_image.tar

5.从镜像创建新容器

docker run --name my_server -p 20000:22 -itd my_custom_image:v1

走完这五步,你在旧服务器上的所有配置、安装的软件、修改的文件,全部都原封不动地搬到了新服务器上。这就是 Docker 最让人省心的地方。

容器配置技巧

容器跑起来之后,还有几个实用的配置值得做。

加速软件安装

如果你的服务器在国内,apt 默认的源下载速度会很慢。换成清华大学的镜像源可以大幅提升速度:

清华大学开源软件镜像站

这一步建议在容器创建后第一时间做,后面装什么都会快很多。

用户管理

生产环境下不建议一直用 root 操作,创建一个普通用户并给 sudo 权限是更安全的做法:

# 创建新用户
adduser username

# 授予sudo权限
usermod -aG sudo username

自定义登录欢迎信息

如果你管理多个容器,自定义一下登录时的欢迎信息可以帮你快速区分当前在哪个环境里:

nano /etc/update-motd.d

写在最后

用 Docker 搭建子服务器这个方案,我自己用下来最大的感受就是”安心”。不用再担心换服务商的时候要重新配环境,也不用担心某个应用的依赖把系统搞乱。每个容器都是独立的,打包带走就行。

如果你也经常需要在多台服务器之间折腾,或者想给自己的部署流程留一条后路,不妨试试这个思路。