网易首页 > 网易号 > 正文 申请入驻

Docker Compose:搭建开发环境的好方式 | Linux 中国

0
分享至

导读:我曾花了两天的时间,尝试使用其他的工具来尝试搭建一个开发环境,搭到后面,我实在是心累了。相比起来,Docker Compose 就简单易用多了,我非常满意。

本文字数:7147,阅读时长大约: 9分钟

大家好!我又写了一篇关于 jvns.ca 的文章。这一篇讲的是 Docker Compose!

本文主要就是讲一讲我对 Docker Compose 有多么满意啦(不讨论它的缺点)!咳咳,因为它总能够完成它该做的,并且似乎总能有效,更棒的是,它的使用还非常简单。另外,在本文中,我只讨论我是如何用 Docker Compose 来搭建开发环境的,而不涉及它在生产中的使用。

最近,我考虑了很多关于这种个人开发环境的搭建方式,原因是,我现在把所有的计算工作都搬到了一个私有云上,大概 20 美元/月的样子。这样一来,我就不用在工作的时候花时间去思考应该如何管理几千台 AWS 服务器了。

在此之前,我曾花了两天的时间,尝试使用其他的工具来尝试搭建一个开发环境,搭到后面,我实在是心累了。相比起来,Docker Compose 就简单易用多了,我非常满意。于是,我和妹妹分享了我的docker-compose使用经历,她略显惊讶:“是吧!你也觉得 Docker Compose 真棒对吧!” 嗯,我觉得我应该写一篇博文把过程记录下来,于是就有了你们看到的这篇文章。

我们的目标是:搭建一个开发环境

目前,我正在编写一个 Ruby on Rails 服务(它是一个计算机“调试”游戏的后端)。在我的生产服务器上,我安装了:

◈ 一个 Nginx 服务器

◈ 一个 Rails 服务

◈ 一个 Go 服务(使用了 github.com 来代理一些 SSH 连接)

◈ 一个 Postgres 数据库

在本地搭建 Rails 服务非常简单,用不着容器(我只需要安装 Postgres 和 Ruby 就行了,小菜一碟)。但是,我还想要把匹配/proxy/*的请求的发送到 Go 服务,其他所有请求都发送到 Rails 服务,所以需要借助 Nginx。问题来了,在笔记本电脑上安装 Nginx 对我来说太麻烦了。

是时候使用docker-compose了!

docker-compose 允许你运行一组 Docker 容器

基本上,Docker Compose 的作用就是允许你运行一组可以互相通信 Docker 容器。

你可以在一个叫做docker-compose.yml的文件中,配置你所有的容器。我在下方将贴上我为这个服务编写的docker-compose.yml文件(完整内容),因为我觉得它真的很简洁、直接!

  1. version: "3.3"

  2. services:

  3. db:

  4. image: postgres

  5. volumes:

  6. - ./tmp/db:/var/lib/postgresql/data

  7. environment:

  8. POSTGRES_PASSWORD: password # yes I set the password to 'password'

  9. go_server:

  10. # todo: use a smaller image at some point, we don't need all of ubuntu to run a static go binary

  11. image: ubuntu

  12. command: /app/go_proxy/server

  13. volumes:

  14. - .:/app

  15. rails_server:

  16. build: docker/rails

  17. command: bash -c "rm -f tmp/pids/server.pid && source secrets.sh && bundle exec rails s -p 3000 -b '0.0.0.0'"

  18. volumes:

  19. - .:/app

  20. web:

  21. build: docker/nginx

  22. ports:

  23. - "8777:80" # this exposes port 8777 on my laptop

这个配置包含了两种容器。对于前面两个容器,我直接使用了现有的镜像(image: postgresimage: ubuntu)。对于后面两个容器,我不得不构建一个自定义容器镜像,其中,build: docker/rails的作用就是告诉 Docker Compose,它应该使用docker/rails/Dockerfile来构建一个自定义容器。

我需要允许我的 Rails 服务访问一些 API 密钥和其他东西,因此,我使用了source secrets.sh,它的作用就是在环境变量中预设一组密钥。

如何启动所有服务:先 “build” 后 “up”

我一直都是先运行docker-compose build来构建容器,然后再运行docker-compose up把所有服务启动起来。

你可以在 yaml 文件中设置depends_on,从而进行更多启动容器的控制。不过,对于我的这些服务而言,启动顺序并不重要,所以我没有设置它。

网络互通也非常简单

容器之间的互通也是一件很重要的事情。Docker Compose 让这件事变得超级简单!假设我有一个 Rails 服务正在名为rails_server的容器中运行,端口是 3000,那么我就可以通过http://rails_server:3000来访问该服务。就是这么简单!

以下代码片段截取自我的 Nginx 配置文件,它是根据我的使用需求配置的(我删除了许多proxy_set_headers行,让它看起来更清楚):

  1. location ~ /proxy.* {

  2. proxy_pass http://go_server:8080;

  3. }

  4. location @app {

  5. proxy_pass http://rails_server:3000;

  6. }

或者,你可以参考如下代码片段,它截取自我的 Rails 项目的数据库配置,我在其中使用了数据库容器的名称(db):

  1. development:

  2. <<: *default

  3. database: myproject_development

  4. host: db # <-------- 它会被“神奇地”解析为数据库容器的 IP 地址

  5. username: postgres

  6. password: password

至于rails_server究竟是如何被解析成一个 IP 地址的,我还真有点儿好奇。貌似是 Docker 在我的计算机上运行了一个 DNS 服务来解析这些名字。下面是一些 DNS 查询记录,我们可以看到,每个容器都有它自己的 IP 地址:

  1. $ dig +short @127.0.0.11 rails_server

  2. 172.18.0.2

  3. $ dig +short @127.0.0.11 db

  4. 172.18.0.3

  5. $ dig +short @127.0.0.11 web

  6. 172.18.0.4

  7. $ dig +short @127.0.0.11 go_server

  8. 172.18.0.5

是谁在运行这个 DNS 服务?

我(稍微)研究了一下这个 DNS 服务是怎么搭建起来的。

以下所有命令都是在容器外执行的,因为我没有在容器里安装很多网络工具。

第一步::使用ps aux | grep puma,获取 Rails 服务的进程 ID。

找到了,它是1837916!简单~

第二步::找到和1837916运行在同一个网络命名空间的 UDP 服务。

我使用了nsenter来在puma进程的网络命令空间内运行netstat(理论上,我猜想你也可以使用netstat -tupn来只显示 UDP 服务,但此时,我的手指头只习惯于打出netstat -tulpn)。

  1. $ sudo nsenter -n -t 1837916 netstat -tulpn

  2. Active Internet connections (only servers)

  3. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

  4. tcp 0 0 127.0.0.11:32847 0.0.0.0:* LISTEN 1333/dockerd

  5. tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 1837916/puma 4.3.7

  6. udp 0 0 127.0.0.11:59426 0.0.0.0:* 1333/dockerd

我们可以看到,此时有一个运行在59426端口的 UDP 服务,它是由dockerd运行的!或许它就是我们要找的 DNS 服务?

第三步:确定它是不是我们要找的 DNS 服务

我们可以使用dig工具来向它发送一个 DNS 查询:

  1. $ sudo nsenter -n -t 1837916 dig +short @127.0.0.11 59426 rails_server

  2. 172.18.0.2

奇怪,我们之前运行dig的时候,DNS 查询怎么没有发送到59426端口,而是发送到了53端口呢?这到底是怎么回事呀?

第四步:iptables

对于类似“这个服务似乎正运行在 X 端口上,但我却在 Y 端口上访问到了它,这是什么回事呢?”的问题,我的第一念头都是“一定是 iptables 在作怪”。

于是,我在运行了容器的网络命令空间内执行iptables-save,果不其然,真相大白:

  1. $ sudo nsenter -n -t 1837916 iptables-save

  2. .... redacted a bunch of output ....

  3. -A DOCKER_POSTROUTING -s 127.0.0.11/32 -p udp -m udp --sport 59426 -j SNAT --to-source :53

  4. COMMIT

在输出中有一条 iptables 规则,它将53端口的流量发送到了59426上。哈哈,真有意思!

数据库文件储存在一个临时目录中

这样做有一个好处:我可以直接挂载 Postgres 容器的数据目录./tmp/db,而无需在我的笔记本电脑上管理 Postgres 环境。

我很喜欢这种方式,因为我真的不想在笔记本电脑上独自管理一个 Postgres 环境(我也真的不知道该如何配置 Postgres)。另外,出于习惯,我更喜欢让开发环境的数据库和代码放在同一个目录下。

仅需一行命令,我就可以访问 Rails 控制台

管理 Ruby 的版本总是有点棘手,并且,即使我暂时搞定了它,我也总是有点担心自己会把 Ruby 环境搞坏,然后就要修它个十年(夸张)。

(使用 Docker Compose)搭建好这个开发环境后,如果我需要访问 Rails 控制台(console)(一个交互式环境,加载了所有我的 Rails 代码),我只需要运行一行代码即可:

  1. $ docker-compose exec rails_server rails console

  2. Running via Spring preloader in process 597

  3. Loading development environment (Rails 6.0.3.4)

  4. irb(main):001:0>

好耶!

小问题:Rails 控制台的历史记录丢失了

我碰到了一个问题:Rails 控制台的历史记录丢失了,因为我一直在不断地重启它。

不过,我也找到了一个相当简单的解决方案(嘿嘿):我往容器中添加了一个/root/.irbrc文件,它能够把 IRB 历史记录文件的保存位置指向一个不受容器重启影响的地方。只需要一行代码就够啦:

  1. IRB.conf[:HISTORY_FILE] = "/app/tmp/irb_history"

我还是不知道它在生产环境的表现如何

到目前为止,这个项目的生产环境搭建进度,还停留在“我制作了一个 DigitalOcean droplet(LCCT 译注:一种 Linux 虚拟机服务),并手工编辑了很多文件”的阶段。

嗯……我相信以后会在生产环境中使用 docker-compose 来运行一下它的。我猜它能够正常工作,因为这个服务很可能最多只有两个用户在使用,并且,如果我愿意,我可以容忍它在部署过程中有 60 秒的不可用时间。不过话又说回来,出错的往往是我想不到的地方。

推特网友提供了一些在生产中使用 docker-compose 的注意事项:

docker-compose up只会重启那些需要重启的容器,这会让重启速度更快。

◈ 有一个 Bash 小脚本 github.com,你可以用它来保持等待一个容器,直到另一个容器的服务可用。

◈ 你可以准备两份docker-compose.yaml文件:用于开发环境的docker-compose.yaml和用于生产环境的docker-compose-prod.yaml。我想我会在分别为 Nginx 指定不同的端口:开发时使用8999,生产中使用80

◈ 人们似乎一致认为,如果你的项目是一台计算机上运行的小网站,那么 docker-compose 在生产中不会有问题。

◈ 有个人建议说,如果愿意在生产环境搭建复杂那么一丢丢,Docker Swarm 就或许会是更好的选择,不过我还没试过(当然,如果要这么说的话,干嘛不用 Kubernetes 呢?Docker Compose 的意义就是它超级简单,而 Kubernetes 肯定不简单 : ))。

Docker 似乎还有一个特性,它能够 docs.docker.com,听上去好酷的样子,但是我还没有试过。

docker-compose 会有不适用的场景吗

我听说 docker-compose 在以下场景的表现较差:

◈ 当你有很多微服务的时候(还是自己搭建比较好)

◈ 当你尝试从一个很大的数据库中导入数据时(就像把几百 G 的数据存到每个人的笔记本电脑里一样)

◈ 当你在 Mac 电脑上运行 Docker 时。我听说 Docker 在 macOS 上比在 Linux 上要慢很多(我猜想是因为它需要做额外的虚拟化)。我没有 Mac 电脑,所以我还没有碰到这个问题。

以上就是全部内容啦!

在此之前,我曾花了一整天时间,尝试使用 Puppet 来配置 Vagrant 虚拟机,然后在这个虚拟机里配置开发环境。结果,我发现虚拟机启动起来实在是有点慢啊,还有就是,我也不喜欢编写 Puppet 配置(哈哈,没想到吧)。

幸好,我尝试了 Docker Compose,它真好简单,马上就可以开始工作啦!

via:

作者: 选题: 译者: 校对:

本文由 原创编译, 荣誉推出

LCTT 译者 :六开箱

翻译: 85.0 篇

贡献: 100 天

2022-03-16

2022-06-23

https://linux.cn/lctt/lkxed

欢迎遵照 CC-BY-SA 协议规定转载,

如需转载,请在文章下留言 “ 转载:公众号名称”,

我们将为您添加白名单,授权“ 转载文章时可以修改”。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
车臣卡德罗夫最近为什么“很乖很安静”?3个原因更多是无奈!

车臣卡德罗夫最近为什么“很乖很安静”?3个原因更多是无奈!

铁血米尔
2024-06-19 19:03:02
危机升级!中国打响养老金保卫战!养老金增速下滑?如何应对?

危机升级!中国打响养老金保卫战!养老金增速下滑?如何应对?

春菊秋兰
2024-06-18 21:11:30
俄罗斯总检察长:中国军事检察官将于11月在俄接受培训

俄罗斯总检察长:中国军事检察官将于11月在俄接受培训

俄罗斯卫星通讯社
2024-06-19 15:02:34
记者:2018年我们就说克罗地亚队老了,也许这场比赛他们终于老了

记者:2018年我们就说克罗地亚队老了,也许这场比赛他们终于老了

直播吧
2024-06-19 22:00:22
福建水投集团原副总经理夏让欣被公诉

福建水投集团原副总经理夏让欣被公诉

正义网
2024-06-19 16:33:23
美国为何死撑着不降息,将面临比08年次贷危机,还可怕金融危机

美国为何死撑着不降息,将面临比08年次贷危机,还可怕金融危机

浩然观点
2024-06-19 10:23:37
公家单位怎么敢无耻造假?

公家单位怎么敢无耻造假?

求实处
2024-06-18 20:20:54
神龟降临!队报:姆巴佩今日将戴面具训练,是否战荷兰将协商决定

神龟降临!队报:姆巴佩今日将戴面具训练,是否战荷兰将协商决定

直播吧
2024-06-20 09:23:15
下下签!巴黎奥运中国女排被抽到死亡之组,2大劲敌围剿中国女排

下下签!巴黎奥运中国女排被抽到死亡之组,2大劲敌围剿中国女排

体坛知识分子
2024-06-19 19:26:50
罗伯逊社媒晒与沙奇里拥抱照片:很高兴见到你,我的室友

罗伯逊社媒晒与沙奇里拥抱照片:很高兴见到你,我的室友

直播吧
2024-06-20 09:01:10
从现在到入伏,建议:这3种食物常给家人吃,赶走暑气,安稳度夏

从现在到入伏,建议:这3种食物常给家人吃,赶走暑气,安稳度夏

花小厨
2024-06-17 09:46:34
上海将建一所同济大学科技中学,以STEM教育为特色

上海将建一所同济大学科技中学,以STEM教育为特色

澎湃新闻
2024-06-19 19:22:28
女孩子为什么喜欢被打屁股?她的快乐你想象不到

女孩子为什么喜欢被打屁股?她的快乐你想象不到

南风山
2024-06-18 01:45:02
惹谁不好非惹个懂行的,物业遭报复,损失惨重!网友:干的漂亮

惹谁不好非惹个懂行的,物业遭报复,损失惨重!网友:干的漂亮

有趣的火烈鸟
2024-06-19 19:24:17
晴儿王艳独子被保送北大!长相帅气、篮球特长,早已褪去童年任性

晴儿王艳独子被保送北大!长相帅气、篮球特长,早已褪去童年任性

听栀子说
2024-06-18 20:27:17
首次3连胜!女库里状元18+12+6+4制胜两罚 率狂热险胜神秘人

首次3连胜!女库里状元18+12+6+4制胜两罚 率狂热险胜神秘人

醉卧浮生
2024-06-20 09:01:30
缪昌文,重返江苏履新

缪昌文,重返江苏履新

鲁中晨报
2024-06-19 22:56:03
是骡子是马拉出来遛遛:天才中专生姜萍被疑作弊,数学月考仅85分

是骡子是马拉出来遛遛:天才中专生姜萍被疑作弊,数学月考仅85分

瑜说还休
2024-06-17 12:19:02
女主播与住持发生关系,再敲诈获刑!共同作案的老公称要上诉

女主播与住持发生关系,再敲诈获刑!共同作案的老公称要上诉

南方都市报
2024-06-19 20:06:10
欧洲杯A组积分:瑞士打平即可出线,苏格兰、匈牙利末轮死磕

欧洲杯A组积分:瑞士打平即可出线,苏格兰、匈牙利末轮死磕

直播吧
2024-06-20 05:06:09
2024-06-20 09:36:49
Linux
Linux
Linux 中国开源社区
8016文章数 73124关注度
往期回顾 全部

科技要闻

美国AI圈震动! “OpenAI宫斗”核心人物苏茨克维官宣创业

头条要闻

德对华最强硬部长将访华 专家:或向中方传递三层意思

头条要闻

德对华最强硬部长将访华 专家:或向中方传递三层意思

体育要闻

欧洲杯最大的混子,非他莫属

娱乐要闻

黄一鸣“杀疯了” 直播间卖大葱养孩子

财经要闻

茅台大跌,谁的锅?

汽车要闻

双肾格栅变化大/内饰焕新 新一代宝马X3官图发布

态度原创

健康
旅游
艺术
家居
亲子

晚餐不吃or吃七分饱,哪种更减肥?

旅游要闻

遭遇极端高温天气导致希腊多名游客死亡

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

家居要闻

自然开放 实现灵动可变空间

亲子要闻

女儿自信给包上密码锁,下一秒被爸爸轻松“解码”

无障碍浏览 进入关怀版