Docker部署Golang服務(wù)的實(shí)現(xiàn)步驟
不管是開發(fā)還是生產(chǎn)環(huán)境,通過 docker 方式部署服務(wù)都是一種不錯(cuò)的選擇,能夠解決不同開發(fā)環(huán)境一致性的問題。
Dockerfile 構(gòu)建 Go 運(yùn)用環(huán)境
在項(xiàng)目根目錄下添加 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ù)制項(xiàng)目中的 go.mod 和 go.sum文件并下載依賴信息 COPY go.mod . COPY go.sum . RUN go mod download # 將代碼復(fù)制到容器中 COPY . . # 將代碼編譯成二進(jìn)制可執(zhí)行文件 RUN go build -o go-api . WORKDIR /dist RUN cp /build/go-api . COPY ./config ./config # 需要運(yùn)行的命令 ENTRYPOINT ["/dist/go-api", "/dist/config/env.yml"]
如果需要縮小鏡像大小,則可以用以下方式進(jìn)行構(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ù)制項(xiàng)目中的 go.mod 和 go.sum文件并下載依賴信息 COPY go.mod . COPY go.sum . RUN go mod download # 將代碼復(fù)制到容器中 COPY . . # 將代碼編譯成二進(jìn)制可執(zhí)行文件 RUN go build -o go-api . # 創(chuàng)建一個(gè)小鏡像 #FROM scratch FROM debian:stretch-slim COPY ./config /config # 從builder鏡像中把 /build/go-api 拷貝到當(dāng)前目錄 COPY --from=builder /build/go-api / # 需要運(yùn)行的命令 ENTRYPOINT ["/go-api", "config/env.yml"]
注:鏡像scratch
沒有bash,會(huì)導(dǎo)致無法通過docker exec
進(jìn)入容器,建議直接改成debian:stretch-slim
鏡像
構(gòu)建 docker 鏡像 go-web-app
:
$ docker build -t go-web-app . # 查看鏡像 $ docker images
啟動(dòng)容器來運(yùn)行鏡像:
$ docker run -p 8888:8088 go-web-app # 后臺(tái)啟動(dòng) $ $ 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,綁定到本機(jī)端口 8888,接下來就可以通過http://127.0.0.1:8888
進(jìn)行訪問了。
Mysql 容器
拉取 Mysql 鏡像:
# 拉取最新版本 mysql,也可以指定版本 $ docker pull mysql:latest # 查看鏡像 $ docker images
運(yùn)行 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
端口到宿主機(jī)的8306
端口,外部主機(jī)可以直接通過 宿主機(jī)ip:8306
訪問到MySQL服務(wù)-e MYSQL_ROOT_PASSWORD=root123456
:設(shè)置 MySQL 服務(wù) root 用戶密碼-v /Users/john/docker-data/mysql:/var/lib/mysql
:表示將宿主機(jī)的/Users/john/docker-data/mysql
卷映射到容器里的/var/lib/mysql
卷中,為了把數(shù)據(jù)保存在宿主機(jī)中,防止容器刪掉就沒了-d
:后臺(tái)運(yùn)行mysql:latest
:使用這個(gè)mysql鏡像
連通性測(cè)試:
進(jìn)入 docker 容器連接 mysql:
# 進(jìn)入容器 $ docker exec -it mysql-latest /bin/sh # 連接 mysql $ mysql -uroot -proot123456 -h 127.0.0.1 -P3306
或者本機(jī)可以通過 navicat 等工具進(jìn)行連接。
Redis 容器
拉取 Redis 鏡像:
$ docker pull redis # 查看鏡像 $ docker images
運(yùn)行 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 密碼
連通性測(cè)試:
直接在本地使用 redis-cli
測(cè)試 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>
進(jìn)入容器:
> 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ù)庫,需要修改項(xiàng)目數(shù)據(jù)庫配置HOST地址為容器名,這里以我的項(xiàng)目配置 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 .
重新啟動(dòng)容器,并使用--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)境,每次都需要單獨(dú)啟動(dòng)Mysql、Redis、go服務(wù)容器,并通過 --link
關(guān)聯(lián)容器
到此這篇關(guān)于Docker部署Golang服務(wù)的實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)Docker部署Go服務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Go項(xiàng)目與Docker結(jié)合實(shí)現(xiàn)高效部署深入探究
- docker如何安裝部署golang應(yīng)用程序
- 詳解如何在Docker部署Go程序
- Docker部署Go項(xiàng)目發(fā)布鏡像到倉庫
- 云原生Docker部署Django和mysql項(xiàng)目全過程
- 使用docker部署django的詳細(xì)步驟
- Docker部署golang環(huán)境詳解
- 如何使用Docker部署Go Web應(yīng)用的實(shí)現(xiàn)
- centos8使用Docker部署Django項(xiàng)目的詳細(xì)教程
- 基于Docker鏡像部署go項(xiàng)目的方法步驟
相關(guān)文章
Docker 拉取 oracle 11g鏡像配置的詳細(xì)教程
這篇文章主要介紹了Docker 拉取 oracle 11g鏡像配置的詳細(xì)教程,包括一些拉去鏡像命令、創(chuàng)建容器、啟動(dòng)容器的相關(guān)知識(shí),需要的朋友可以參考下2021-09-09docker中psql數(shù)據(jù)庫備份與恢復(fù)詳解
在本篇文章里小編給大家整理的是關(guān)于docker中psql數(shù)據(jù)庫基本操作內(nèi)容,需要的朋友們可以學(xué)習(xí)參考下。2020-02-02docker --link容器互聯(lián)的實(shí)現(xiàn)
–link可以通過容器名互相通信,容器間共享環(huán)境變量,本文主要介紹了docker --link容器互聯(lián)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Docker Compose環(huán)境變量與配置文件管理全解析
這篇文章主要介紹了Docker Compose環(huán)境變量與配置文件管理全解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2025-04-04docker安裝nginx實(shí)現(xiàn)對(duì)springboot項(xiàng)目的負(fù)載均衡的操作方法
這篇文章主要介紹了docker安裝nginx實(shí)現(xiàn)對(duì)springboot項(xiàng)目的負(fù)載均衡的操作方法,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-06-06docker版es、milvus、minio啟動(dòng)命令詳解
這篇文章主要介紹了docker版es、milvus、minio啟動(dòng)命令詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11idea使用docker插件一鍵部署項(xiàng)目的操作方法
這篇文章主要介紹了idea使用docker插件一鍵部署項(xiàng)目的操作方法,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-04-04使用portainer連接遠(yuǎn)程docker的教程
Portainer是一個(gè)輕量級(jí)的docker環(huán)境管理UI,可以用來管理docker宿主機(jī)和docker swarm集群,這篇文章主要介紹了使用portainer連接遠(yuǎn)程docker的方法,需要的朋友可以參考下2020-03-03