Docker部署ruby:新手也能上手
为什么要用 Docker 部署 Ruby
很多新手在本地装 Ruby 时会遇到版本冲突或系统依赖缺失的问题。Docker 部署 Ruby 可以把整个运行环境封装成一个镜像,让你在不同服务器上都能保持一致。
而且即使你完全不会 Ruby,只要会几个 Docker 命令也能把环境跑起来。
准备工作:确认服务器已安装 Docker
在开始 Docker 部署 Ruby 之前,先用 SSH 登录服务器,运行下面命令检查 Docker 是否存在:
docker --version
如果返回版本号,说明 Docker 已安装。
如果提示 command not found,需要先安装 Docker(CentOS 示例):
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
安装后再次执行 docker --version 确认。
拉取 Ruby 镜像并运行容器(分步拆解)
1. 拉取官方 Ruby 镜像
使用 docker pull 命令拉取最新稳定版:
docker pull ruby:3.3
建议指定版本号,避免之后因为镜像更新导致不一致。
这里以 3.3 为例。
2. 创建项目目录并运行容器
假设你的 Ruby 项目放在 /home/myapp 目录下,我们希望把代码挂载到容器里运行:
mkdir -p /home/myapp
cd /home/myapp
然后启动容器,并进入交互式 Shell:
docker run -it --rm -v "$PWD":/app -w /app ruby:3.3 bash
-it:交互模式--rm:退出容器后自动删除临时容器(适合测试)-v "$PWD":/app:将当前目录挂载到容器内的/app-w /app:设置工作目录
现在就进入了容器内部,可以执行 Ruby 命令了。
3. 测试 Ruby 是否可用
在容器内运行:
ruby --version
输出应该类似 ruby 3.3.0。
还可以写一个简单的脚本测试:
puts "Hello from Docker Ruby!"
保存为 test.rb,然后执行:
ruby test.rb
如果看到 Hello from Docker Ruby!,说明环境已正常工作。
避坑指南:新手最容易踩的四个坑
1. 权限问题导致无法写入文件
如果宿主机目录没有写入权限,容器内生成的 Gem 安装文件会报错。建议在宿主机先给目录设置 755 权限:
chmod -R 755 /home/myapp
2. 容器退出后代码丢失
使用 --rm 标志时,容器一旦退出,里面所有的改动都会消失。如果需要持久化 Gem 缓存,建议挂载一个 volume:
docker run -it --rm -v "$PWD":/app -v rubygems:/usr/local/bundle -w /app ruby:3.3 bash
这样 .gem 缓存在 volume rubygems 中,不会被删除。
3. 端口映射没写导致外部无法访问(Web 应用)
如果你的 Ruby 应用要开启 Web 服务(比如 Sinatra),启动容器时需要加端口映射:
docker run -it --rm -p 4567:4567 -v "$PWD":/app -w /app ruby:3.3 ruby app.rb
4. 镜像版本与代码冲突
有些旧项目需要特定的 Ruby 版本,拉取镜像时请根据项目 Gemfile 或 .ruby-version 文件确定版本。
例如:
docker pull ruby:2.7.8
高频问题解答
Q:每次都要打这么长的命令吗?
A:可以把常用参数写进 Dockerfile 或 docker-compose.yml。对于 Docker 部署 Ruby,推荐用 docker-compose,保存为 docker-compose.yml:
version: '3'
services:
ruby:
image: ruby:3.3
container_name: myruby
volumes:
- .:/app
working_dir: /app
stdin_open: true
tty: true
然后运行 docker-compose up -d 和 docker-compose exec ruby bash 即可。
Q:容器内安装 Gem 后怎么持久化?
A:参考避坑第二条,挂载 volume rubygems:/usr/local/bundle。或者把 Gem 安装到项目目录下的 vendor/bundle(执行 bundle config set path 'vendor/bundle'),挂载代码目录即可。
效果验证
完成以上步骤后,你已经在服务器上用 Docker 成功运行了一个 Ruby 环境。
可以创建一个包含第三方 Gem 的脚本测试,比如安装 sinatra:
gem install sinatra
如果安装成功且没有报错,说明网络和依赖都正常。
至此,Docker 部署 Ruby 的完整流程就走通了,后续你可以基于这个基础容器进行开发或部署。
如果你在处理 Docker 部署 Ruby 时遇到其他异常,建议先回看避坑部分,特别是权限和镜像版本这两个最常见问题。
根据我的经验,80% 的新手报错都能在这两部分找到答案。