【实战】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
目录
相关文章
|
3月前
|
Docker 容器
电子书阅读分享《4天实战 轻松玩转docker》
电子书阅读分享《4天实战 轻松玩转docker》
123 3
|
4月前
|
Arthas Java 测试技术
Docker 环境中 Spring Boot 应用的 Arthas 故障排查与性能优化实战
Docker 环境中 Spring Boot 应用的 Arthas 故障排查与性能优化实战
|
3月前
|
分布式计算 Java Linux
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
Docker 是一套构建在 Linux 内核之上的高级工具,旨在帮助开发人员和运维人员更轻松地交付应用程序和依赖关系,实现跨系统和跨主机的部署。使用安全且轻量级的容器环境来实现这一目标。容器可以手动创建,也可以通过编写 Dockerfile 自动创建。开发人员和运维人员可以将应用程序及其依赖打包到容器中,实现应用程序的可移植性和环境一致性。
105 5
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
|
8天前
|
JavaScript 前端开发 Docker
全栈开发实战:结合Python、Vue和Docker进行部署
【4月更文挑战第10天】本文介绍了如何使用Python、Vue.js和Docker进行全栈开发和部署。Python搭配Flask创建后端API,Vue.js构建前端界面,Docker负责应用的容器化部署。通过编写Dockerfile,将Python应用构建成Docker镜像并运行,前端部分使用Vue CLI创建项目并与后端交互。最后,通过Nginx和另一个Dockerfile部署前端应用。这种组合提升了开发效率,保证了应用的可维护性和扩展性,适合不同规模的企业使用。
|
4月前
|
前端开发 应用服务中间件 数据库
Docker-docker-compose学习笔记(yaml,实战)
Docker-docker-compose学习笔记(yaml,实战)
221 0
|
29天前
|
Unix Docker 容器
【超强图解Docker常见命令与实战】
【超强图解Docker常见命令与实战】
50 0
|
2月前
|
Java Linux Docker
Docker入门到实战
Docker入门到实战、Centos7安装Docker
|
2月前
|
Cloud Native Go 数据安全/隐私保护
自定义Docker镜像推送到Docker Hub实战
自定义Docker镜像推送到Docker Hub实战
77 2
自定义Docker镜像推送到Docker Hub实战
|
2月前
|
KVM 虚拟化 Android开发
DP读书:鲲鹏处理器 架构与编程(十二)鲲鹏软件实战案例Docker+KVM的部署
DP读书:鲲鹏处理器 架构与编程(十二)鲲鹏软件实战案例Docker+KVM的部署
52 1
|
3月前
|
Linux Docker Python
Python实战技术 - Python虚拟隔离环境 和 Docker技术
Python实战技术 - Python虚拟隔离环境 和 Docker技术
196 0