【实战】Docker+Golang+Postgres


【编者的话】本文属于入门实战类教程,作者介绍了如何在Docker中部署一个使用Postgres的Golang Web应用程序,作者在文中列出了所有的步骤以及注意点,推荐对Golang感兴趣的Docker初学者阅读。

最近我一直在研究Docker,并决定使用它来部署我的Golang Negroni + Postgres的Web应用程序。考虑到以后的可扩展性以及别人的最佳实践,我需要使用两个Docker容器:一个用于应用程序,另一个用于数据库, 并且两个容器需要互通。由于这是我第一次使用Docker,所以整个部署过程也踩了不少坑,在这篇文章中我想向大家分享下我的经验。
go-docker.png

你可以在GitHub找到本教程中的演示程序。

我默认你已经安装了Docker,如果没有,请参考官方文档安装

第1步:Dockerize Postgres

首先,从Docker Hub下载并运行Postgres官方Docker镜像,将它命名为“db”,并为默认的“Postgres”用户设置密码:
docker run --name db -e POSTGRES_PASSWORD=password123 -d postgres

-d参数的意思是以后台进程的方式运行Docker。接下来,让我们创建应用程序依赖的Postgres用户以及数据库,首先打开“db”容器的bash shell:
docker exec -it db /bin/bash
从这个 bash shell 中登录 psql:
psql -U postgres
接下来创建用户和数据库:
CREATE USER app;
CREATE DATABASE testapp;
GRANT ALL PRIVILEGES ON DATABASE testapp TO app;

然后退出psql (快捷键: CTRL-D)。现在,已经建立了数据库,接下来需要在这个容器中编辑配置文件,因此需要先安装一个文本编辑器(Vim!我看好你!)。
apt-get update
apt-get install vim

使用Vim来编辑Postgres的pg_hba.conf文件,此文件用于管理客户端身份验证。

我们需要修改这个文件以保证接下来创建的应用程序容器可以使用新创建的postgres用户访问数据库容器。默认情况下,只有“postgres”用户有这个权限。要找到此配置文件可以用以下命令:
psql -U postgres
在Postgres交互shell中运行:
SHOW hba_file;
复制返回的文件路径并退出psql shell(快捷键: CTRL-D)。现在,使用Vim编辑该文件:
vim /var/lib/postgresql/data/pg_hba.conf
更改文件的最后一行,并保存更改,请键入:wq
host all "app" 0.0.0.0/0 trust

由于此配置文件只有在Postgres启动的时候才会加载,所以现在我们需要重新启动db容器。退回到你的主机 (快捷键: CTRL-D),然后运行:
docker stop db
docker start db

修改之后的配置已经生效,Postgres容器准备好了!

第2步:Dockerize Golang应用

为了Dockerize Go应用程序,我们必须在项目文件夹下创建Dockerfile。

如果你不想Dockerize你已经在编写的Golang应用程序,你可以下载Dockerize-tutorial Demo。在Golang项目的根目录下,创建Dockerfile:
touch Dockerfile

在此文件中,我们将添加以下三行:
FROM golang:onbuild
RUN go get bitbucket.org/liamstask/goose/cmd/goose
EXPOSE 4000

- 第一行运行Golang镜像的onbuild版本,它自动复制该数据包源,并获取该程序的依赖,然后建立程序,并配置其在启动时运行。
- 第二行安装'goose',一个我们在应用程序容器中会使用到的迁移工具。
- 最后一行开放端口4000。

现在,我们可以为应用程序构建一个Docker镜像。在项目目录中,运行:
docker build -t app .

这个命令最终会生成名为“app”的Docker镜像。现在,我们可以通过这个Docker镜像运行一个Docker的容器:
docker run -d -p 8080:4000 --name tutapp --link db:postgres app

以上命令可分解为:
  • -d 把启动的容器挂起放在后台运行。
  • -p 8080:4000 将容器内的端口4000(此应用程序需要的端口)映射到主机的端口8080。
  • --name tutapp 命名Docker容器为“tutapp”。
  • --link db:postgres 链接应用程序容器与之前创建的名为“db”的Postgres容器。


link参数可以保证我们的应用程序容器能访问一个名为$POSTGRES_PORT_5432_TCP_ADDR的环境变量。这个环境变量包含连接到Postgres DB时的主机地址。因此,我们必须确保我们的dbconf.yml文件里的host变量为:
db:
driver: postgres
open: host=$POSTGRES_PORT_5432_TCP_ADDR user=app dbname=testapp sslmode=disable

将演示应用程序的config.go文件的变量替换为该变量。

最后一步是为我们的应用程序迁移DB,因此在tutapp容器内与运行goose up
docker exec -it tutapp goose up

要访问的此程序,访问 http://localhost:8080 你应该看到此应用程序运行!

如果用户的Docker守护进程是在另一台机器(或虚拟机)上运行,用户应当将localhost更改为主机的地址。如果你是使用boot2docker在OS X或Windows,你可以使用命令boot2docker ip找到对应的IP地址

现在你成功运行了Golang应用程序并与在另一个Docker容器里的Postgres数据库通信。如果有什么不清楚或者如果不能运行,请留下了评论,我将第一时间完善!

原文链接:How to Dockerize a Golang Webapp With Postgres DB (翻译:田浩浩

===========================
译者介绍
田浩浩悉尼大学USYD硕士研究生,目前在珠海从事Android应用开发工作。业余时间专注Docker的学习与研究,希望通过DockerOne把最新最优秀的译文贡献给大家,与读者一起畅游Docker的海洋。

0 个评论

要回复文章请先登录注册