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數據庫通信。如果有什么不清楚或者如果不能運行,請留下了評論,我將第一時間完善!
原文鏈接
來自:http://dockerone.com/article/87
本文由用戶 b4c2 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!