【实战】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
目录
相关文章
|
2月前
|
运维 监控 安全
构建高效自动化运维体系:Ansible与Docker的协同实战
【5月更文挑战第25天】 在当今快速迭代的软件发布环境中,自动化运维成为确保部署效率和可靠性的关键。本文通过深入分析Ansible和Docker技术,探索它们如何协同工作以构建一个高效的自动化运维体系。文章不仅介绍了Ansible的配置管理功能和Docker容器化的优势,还详细阐述了将两者结合的实践策略,旨在帮助读者理解并实现更智能、更灵活的基础设施管理。
|
26天前
|
jenkins 持续交付 开发者
利用Docker容器化部署应用的实战指南
【6月更文挑战第27天】本文详述Docker应用部署,涵盖Docker基本概念、安装、镜像制作及运行。通过编写Dockerfile构建镜像,使用`docker build`、`run`、`push`及`stop`命令管理。集成CI/CD工具如Jenkins,实现自动化构建、测试和部署,提升开发效率与部署质量。Docker助力轻量级、可移植的微服务架构。
|
27天前
|
NoSQL Redis Docker
Docker再学习 - 实战
Docker再学习 - 实战
20 1
|
2月前
|
前端开发 API 数据库
【Docker专栏】Docker Compose实战:编排多容器应用
【5月更文挑战第7天】Docker Compose是Docker的多容器管理工具,通过YAML文件简化多容器应用部署。它能一键启动、停止服务,保证开发、测试和生产环境的一致性。安装后,创建`docker-compose.yml`文件定义服务,如示例中的web和db服务。使用`docker-compose up -d`启动服务,通过`docker-compose ps`、`stop`、`down`和`logs`命令管理服务。
【Docker专栏】Docker Compose实战:编排多容器应用
|
2月前
|
Cloud Native 测试技术 数据库
【云原生之Docker实战】使用Docker部署flatnotes笔记工具
【5月更文挑战第17天】使用Docker部署flatnotes笔记工具
111 8
|
2月前
|
监控 安全 Cloud Native
【云原生之Docker实战】使用Docker部署Ward服务器监控工具
【5月更文挑战第11天】使用Docker部署Ward服务器监控工具
108 4
|
2月前
|
Cloud Native 安全 Linux
【云原生之Docker实战】使用Docker部署mBlog微博系统
【5月更文挑战第10天】使用Docker部署mBlog微博系统
42 2
|
2月前
|
运维 Linux Docker
Docker详解(十一)——Docker容器CPU资源限额实战Docker详解
Docker详解(十一)——Docker容器CPU资源限额实战
84 5
|
2月前
|
存储 缓存 监控
【Docker 专栏】Docker 容器性能调优实战
【5月更文挑战第8天】本文探讨了Docker容器的性能调优技巧,包括理解容器性能指标(如CPU、内存、网络和磁盘I/O)并进行相应调优。重点讲述了CPU和内存的限制设置,网络配置优化以及磁盘I/O性能提升方法。通过实例展示了如何解决高CPU使用率问题,强调了根据应用需求进行调优的重要性,以实现更高效、稳定的容器运行。
【Docker 专栏】Docker 容器性能调优实战
|
2月前
|
Kubernetes Cloud Native Go
Golang深入浅出之-Go语言中的云原生开发:Kubernetes与Docker
【5月更文挑战第5天】本文探讨了Go语言在云原生开发中的应用,特别是在Kubernetes和Docker中的使用。Docker利用Go语言的性能和跨平台能力编写Dockerfile和构建镜像。Kubernetes,主要由Go语言编写,提供了方便的客户端库与集群交互。文章列举了Dockerfile编写、Kubernetes资源定义和服务发现的常见问题及解决方案,并给出了Go语言构建Docker镜像和与Kubernetes交互的代码示例。通过掌握这些技巧,开发者能更高效地进行云原生应用开发。
95 1