Docker部署Golang服務(wù)的實現(xiàn)步驟
不管是開發(fā)還是生產(chǎn)環(huán)境,通過 docker 方式部署服務(wù)都是一種不錯的選擇,能夠解決不同開發(fā)環(huán)境一致性的問題。
Dockerfile 構(gòu)建 Go 運用環(huán)境
在項目根目錄下添加 Dockerfile 文件:
FROM golang:alpine
# 在容器內(nèi)部設(shè)置環(huán)境變量
ENV GO111MODULE=on \
GOPROXY=https://goproxy.cn,direct \
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64
# 設(shè)置后續(xù)指令的工作目錄
WORKDIR /build
# 復(fù)制項目中的 go.mod 和 go.sum文件并下載依賴信息
COPY go.mod .
COPY go.sum .
RUN go mod download
# 將代碼復(fù)制到容器中
COPY . .
# 將代碼編譯成二進制可執(zhí)行文件
RUN go build -o go-api .
WORKDIR /dist
RUN cp /build/go-api .
COPY ./config ./config
# 需要運行的命令
ENTRYPOINT ["/dist/go-api", "/dist/config/env.yml"]
如果需要縮小鏡像大小,則可以用以下方式進行構(gòu)建
FROM golang:alpine AS builder
# 在容器內(nèi)部設(shè)置環(huán)境變量
ENV GO111MODULE=on \
GOPROXY=https://goproxy.cn,direct \
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64
# 設(shè)置后續(xù)指令的工作目錄
WORKDIR /build
# 復(fù)制項目中的 go.mod 和 go.sum文件并下載依賴信息
COPY go.mod .
COPY go.sum .
RUN go mod download
# 將代碼復(fù)制到容器中
COPY . .
# 將代碼編譯成二進制可執(zhí)行文件
RUN go build -o go-api .
# 創(chuàng)建一個小鏡像
#FROM scratch
FROM debian:stretch-slim
COPY ./config /config
# 從builder鏡像中把 /build/go-api 拷貝到當(dāng)前目錄
COPY --from=builder /build/go-api /
# 需要運行的命令
ENTRYPOINT ["/go-api", "config/env.yml"]
注:鏡像scratch沒有bash,會導(dǎo)致無法通過docker exec進入容器,建議直接改成debian:stretch-slim鏡像
構(gòu)建 docker 鏡像 go-web-app:
$ docker build -t go-web-app . # 查看鏡像 $ docker images
啟動容器來運行鏡像:
$ docker run -p 8888:8088 go-web-app # 后臺啟動 $ $ docker run -p 8888:8088 -d go-web-app # 查看容器 $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 959ee47f203b go-web-app "/go-api config/env.…" 23 seconds ago Up 22 seconds 0.0.0.0:8888->8088/tcp nostalgic_mclean
標(biāo)志位-p用來定義端口綁定,容器中g(shù)o服務(wù)端口為 8088,綁定到本機端口 8888,接下來就可以通過http://127.0.0.1:8888進行訪問了。
Mysql 容器
拉取 Mysql 鏡像:
# 拉取最新版本 mysql,也可以指定版本 $ docker pull mysql:latest # 查看鏡像 $ docker images
運行 Mysql 容器:
$ docker run --name mysql -p 8306:3306 -e MYSQL_ROOT_PASSWORD=root123456 -v ~/docker-data/mysql:/var/lib/mysql -d mysql:latest # 查看容器 $ docker ps -a
--name mysql-latest:容器命名為 mysql-latest-p 8306:3306:映射容器服務(wù)的3306端口到宿主機的8306端口,外部主機可以直接通過 宿主機ip:8306訪問到MySQL服務(wù)-e MYSQL_ROOT_PASSWORD=root123456:設(shè)置 MySQL 服務(wù) root 用戶密碼-v /Users/john/docker-data/mysql:/var/lib/mysql:表示將宿主機的/Users/john/docker-data/mysql卷映射到容器里的/var/lib/mysql卷中,為了把數(shù)據(jù)保存在宿主機中,防止容器刪掉就沒了-d:后臺運行mysql:latest:使用這個mysql鏡像
連通性測試:
進入 docker 容器連接 mysql:
# 進入容器 $ docker exec -it mysql-latest /bin/sh # 連接 mysql $ mysql -uroot -proot123456 -h 127.0.0.1 -P3306
或者本機可以通過 navicat 等工具進行連接。
Redis 容器
拉取 Redis 鏡像:
$ docker pull redis # 查看鏡像 $ docker images
運行 Redis 容器:
$ docker run --name redis -v ~/docker-data/redis:/usr/local/redis -p 6379:6379 -d redis:latest --requirepass "root123456" # 查看容器 $ docker ps -a
其他參數(shù)同mysql配置,--requirepass 用來設(shè)置 Redis 密碼
連通性測試:
直接在本地使用 redis-cli 測試 redis 連通性:
> redis-cli -h 127.0.0.1 -p 6379 127.0.0.1:6379> auth root123456 OK 127.0.0.1:6379> ping PONG 127.0.0.1:6379>
進入容器:
> docker exec -it redis /bin/sh # redis-cli -p 6379 127.0.0.1:6379> auth root123456 OK 127.0.0.1:6379> ping PONG 127.0.0.1:6379> exit # exit
修改配置
由于要連接不同容器內(nèi)的數(shù)據(jù)庫,需要修改項目數(shù)據(jù)庫配置HOST地址為容器名,這里以我的項目配置 env.yml為例子:
# MySQL 配置 mysql: # host: 127.0.0.1 # 服務(wù)器地址 host: mysql port: 3306 # 端口 db_name: test # 數(shù)據(jù)庫名稱 username: root # 數(shù)據(jù)庫用戶名 password: root123456 # 數(shù)據(jù)庫密碼 ... # Redis 配置 redis: # host: 127.0.0.1 # 地址 host: redis port: 6379 # 端口 db: 0 password: root123456 # 密碼
然后重新 build Go服務(wù)鏡像:
$ docker build -t go-web-app .
重新啟動容器,并使用--link關(guān)聯(lián)Mysql、Redis容器:
$ docker run --name go-api --link=mysql:mysql --link=redis:redis -p 8888:8088 -d go-web-app
注:使用這種方式構(gòu)建環(huán)境,每次都需要單獨啟動Mysql、Redis、go服務(wù)容器,并通過 --link關(guān)聯(lián)容器
到此這篇關(guān)于Docker部署Golang服務(wù)的實現(xiàn)步驟的文章就介紹到這了,更多相關(guān)Docker部署Go服務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
zabbix監(jiān)控docker應(yīng)用配置
今天通過本文給大家分享zabbix監(jiān)控docker容器的原理及部署的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-07-07
從零搭建到生產(chǎn)環(huán)境配置詳解Docker部署MongoDB的完整流程
在容器化技術(shù)日益普及的今天,使用?Docker?部署?MongoDB?已經(jīng)成為開發(fā)和生產(chǎn)環(huán)境的標(biāo)配方案,本文詳細(xì)介紹了使用Docker部署MongoDB的全過程,希望可以帶大家全面掌握?Docker?部署?MongoDB?的核心技能2026-05-05
CentOS 7下設(shè)置Docker代理(Linux下Systemd服務(wù)的環(huán)境變量配置)
本文給大家分享Linux下Systemd服務(wù)的環(huán)境變量配置方法,此示例將覆蓋默認(rèn)docker.service文件,對CentOS 7下設(shè)置Docker代理的相關(guān)知識感興趣的朋友跟隨小編一起看看吧2021-05-05

