【实战】Docker+Golang+Postgres

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

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

你可以在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

时间: 2024-10-02 16:09:11

【实战】Docker+Golang+Postgres的相关文章

Docker与Golang的巧妙结合_docker

Docker与Golang的巧妙结合 [编者的话]这是一个展示在使用Go语言时如何让Docker更有用的提示与技巧的简辑.例如,如何使用不同版本的Go工具链来编译Go代码,如何交叉编译到不同的平台(并且测试结果!),或者如何制作真正小的容器镜像. 下面的文章假定你已经安装了Docker.不必是最新版本(这篇文章不会使用Docker任何花哨的功能). 没有go的Go ...意思是:"不用安装go就能使用Go" 如果你写Go代码,或者你对Go语言有一点点兴趣,你肯定要安装了Go编译器和Go

Docker与Golang的巧妙结合

本文讲的是Docker与Golang的巧妙结合[编者的话]这是一个展示在使用Go语言时如何让Docker更有用的提示与技巧的简辑.例如,如何使用不同版本的Go工具链来编译Go代码,如何交叉编译到不同的平台(并且测试结果!),或者如何制作真正小的容器镜像. 下面的文章假定你已经安装了Docker.不必是最新版本(这篇文章不会使用Docker任何花哨的功能). 没有go的Go ...意思是:"不用安装go就能使用Go" 如果你写Go代码,或者你对Go语言有一点点兴趣,你肯定要安装了Go编译

Docker 探秘

What is Docker? Docker is the world's leading software containerization platform. What is a Container? A standardized unit of software,Package software into standardized units for development, shipment and deployment. Containers isolate software from

Docker快速入门以及环境配置详解_docker

前言 数据科学开发环境配置起来让人头疼,会碰到包版本不一致.错误信息不熟悉和编译时间漫长等问题.这很容易让人垂头丧气,也使得迈入数据科学的这第一步十分艰难.而且这也是一个完全不常见的准入门槛. 还好,过去几年中出现了能够通过搭建孤立的环境来解决这个问题的技术.本文中我们就要介绍的这种技术名叫Docker.Docker能让开发者简单.快速地搭建数据科学开发环境,并支持使用例如Jupyter notebooks等工具进行数据探索. 简介 Docker 最初 dotCloud 公司内部的一个业余项目

docker network performance reduce by nat module & kvm vs docker vs localhost

在测试docker下postgresql性能时, 发现的一个DNAT转换后的网络性能问题. 首先附上KVM,DOCKER,本机的几组测试数据(测试数据仅供参考, 有兴趣的朋友可以自己测试一下) :  注意在测试连接超出物理核心数后, docker的性能开始严重下降. (可能有优化手段解决这个问题)  TPS 16连接IP, 16连接UNIX SOCK, 48连接UNIX SOCK, 96连接UNIX SOCK docker DNAT 29662 docker 174089.814292 2574

docker 开发常用命令总结

Docker 常用命令总结,镜像下载,到docker容器创建,常用docker命令的 增删查 1.镜像下载,从hub.docker.com中下载最新版本的postgres docker pull postgres 2.首次启动一个容器,名称为--name docker-postgresql,把容器/root文件挂在到 ~/codehub下 -v ~/codehub:/root:ro,设置postgres密码为123456-e POSTGRES_PASSWORD=123456 docker run

备份基于Docker的PostgreSQL数据库

本文讲的是,[编者的话]本文属于基础入门类文章,作者介绍了如何备份基于Docker的PostgreSQL数据库.通过本文你可以学习到Docker容器的构建以及运行命令,并带你复习Docker容器的基本原理. 我发现,很多初学者都很关心Docker能否解决现有的一些问题,当然之前的解决方案也仍可以用.所以这篇文章的主题是使用Docker备份你的关系型数据库.我会通过具体的例子来介绍如何使用Docker来备份PostgreSQL. 如果你有一个运行在Docker中的PostgreSQL服务,我想说能

使用Docker搭建SonarQube检测代码质量

SonarQube 简介 Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量 可以通过插件形式,支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言的代码质量管理与检测. 本文记录怎么使用docker安装SonarQube和使用SonarQube检测自己的代码. 1.获取 postgresql 的镜像 $ docker pull postgres 2.启动 postgresql $ docke

Dockerfile RUN, CMD & ENTRYPOINT

在使用Dockerfile创建image时, 有几条指令比较容易混淆, RUN, CMD, ENTRYPOINT. RUN是在building image时会运行的指令, 在Dockerfile中可以写多条RUN指令. CMD和ENTRYPOINT则是在运行container 时会运行的指令, 都只能写一条, 如果写了多条, 则最后一条生效. CMD和ENTRYPOINT的区别是:  CMD在运行时会被command覆盖, ENTRYPOINT不会被运行时的command覆盖, 但是也可以指定.