【实战】Docker+Golang+Postgres

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

原文发布时间为:2014-12-26
本文作者:田浩浩
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:【实战】Docker+Golang+Postgres
目录
相关文章
|
7月前
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
775 51
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
|
8月前
|
关系型数据库 数据库 PostgreSQL
docker 安装 Postgres 17.6
本文介绍如何通过Docker安装和配置PostgreSQL 17.6。内容包括拉取镜像、导出配置文件、运行容器并挂载数据与配置文件目录,以及进入容器使用psql操作数据库的完整步骤,便于持久化管理和自定义配置。
1466 3
docker 安装 Postgres 17.6
|
10月前
|
供应链 测试技术 开发者
用 Docker 轻松部署 ERPNext 15:多场景实战指南
ERPNext 15 是一款功能全面的开源企业资源规划系统,结合 Docker 容器化部署,具备高效、灵活、低成本等优势。适用于小微企业数字化起步、多分支机构协同办公、开发者测试环境搭建、短期项目管理及企业内部培训等多种场景。模块化设计支持按需扩展,满足不同规模企业需求,是实现高效企业管理的理想选择。
用 Docker 轻松部署 ERPNext 15:多场景实战指南
|
11月前
|
运维 监控 数据可视化
容器化部署革命:Docker实战指南
容器化部署革命:Docker实战指南
|
11月前
|
安全 Java Docker
Docker 部署 Java 应用实战指南与长尾优化方案
本文详细介绍了Docker容器化部署Java应用的最佳实践。首先阐述了采用多阶段构建和精简JRE的镜像优化技术,可将镜像体积减少60%。其次讲解了资源配置、健康检查、启动优化等容器化关键配置,并演示了Spring Boot微服务的多模块构建与Docker Compose编排方案。最后深入探讨了Kubernetes生产部署、监控日志集成、灰度发布策略以及性能调优和安全加固措施,为Java应用的容器化部署提供了完整的解决方案指南。文章还包含大量可落地的代码示例,涵盖从基础到高级的生产环境实践。
720 3
|
关系型数据库 MySQL 数据库
Docker Compose-实战
Docker Compose-实战
350 5
|
Ubuntu Linux Docker
Docker容器的实战讲解
这只是Docker的冰山一角,但是我希望这个简单的例子能帮助你理解Docker的基本概念和使用方法。Docker是一个强大的工具,它可以帮助你更有效地开发、部署和运行应用。
295 27
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
453 3
实战~如何组织一个多容器项目docker-compose
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
1448 8