app產(chǎn)品網(wǎng)站建設(shè)沈陽(yáng)線上教學(xué)
本文目錄
- 1. Dokcer-compose
- 回顧下Docker知識(shí)
- 編寫docker-compose.yaml
- 運(yùn)行docker
- 2. 部署go服務(wù)
- 編寫dockerfile
1. Dokcer-compose
這里簡(jiǎn)單先用一下win版本的Docker,后期開發(fā)好了部署的時(shí)候再移植到服務(wù)器下進(jìn)行docker部署。
輸入命令docker-compose version
就可以看到已經(jīng)裝好的docker版本了,順便裝一個(gè)dockerdesktop。
回顧下Docker知識(shí)
Docker 是一個(gè)開源的應(yīng)用容器引擎,它通過(guò)容器技術(shù)來(lái)實(shí)現(xiàn)輕量級(jí)的虛擬化。容器允許開發(fā)者將應(yīng)用及其所有依賴包打包到一個(gè)可移植的容器中,以便在任何環(huán)境中一致地運(yùn)行。
Docker Compose 是 Docker 官方提供的一個(gè)工具,用于定義和運(yùn)行多容器的 Docker 應(yīng)用。通過(guò) Compose
,用戶可以使用 YAML 文件來(lái)定義多個(gè) Docker 容器的服務(wù)、網(wǎng)絡(luò)、存儲(chǔ)卷等配置,并通過(guò)一個(gè)命令(docker-compose up
)啟動(dòng)所有定義好的服務(wù)。
Dockerfile 是用來(lái)構(gòu)建 Docker 鏡像的文件,包含創(chuàng)建鏡像的步驟和指令,可以與 Docker Compose 配合使用,在 Compose 中定義服務(wù)時(shí)使用自定義的 Docker 鏡像。
編寫docker-compose.yaml
目前需要部署Mysql、Redis、Etcd、User、Api服務(wù),所以需要編寫一下Docker方便以后啟動(dòng)。
創(chuàng)建一個(gè)docker-compose.yaml
文件,然后進(jìn)行容器編排。
version: '3'
services:mysql:container_name: mysql8image: mysql:${MYSQL_VERSION}restart: alwaysports:- 3309:3306environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: msprojectvolumes:- ${MYSQL_DIR}/data:/var/lib/mysql- ${MYSQL_DIR}/conf:/etc/mysql/conf.d/- ${MYSQL_DIR}/logs:/logscommand:--default-authentication-plugin=mysql_native_password--character-set-server=utf8mb4--collation-server=utf8mb4_general_ci--explicit_defaults_for_timestamp=true--lower_case_table_names=1
這里大致講一下進(jìn)行了什么操作,回顧下之前學(xué)過(guò)的docker容器。
首先定義容器名稱,container_name: mysql8
,定義了容器的名稱為 mysql8,可以通過(guò)這個(gè)名稱來(lái)管理MySQL容器。
image: mysql:${MYSQL_VERSION}
該配置使用指定版本的MySQL鏡像,${MYSQL_VERSION}
是一個(gè)變量,表示MySQL的版本號(hào)。該變量的實(shí)際值在運(yùn)行時(shí)會(huì)由環(huán)境變量提供。
3309:3306
將容器的3306端口(MySQL默認(rèn)端口)映射到主機(jī)的3309端口??梢酝ㄟ^(guò)主機(jī)的3309端口訪問(wèn)容器中的MySQL服務(wù)。
MYSQL_DATABASE
: msproject 創(chuàng)建一個(gè)名為msproject的數(shù)據(jù)庫(kù)。
${MYSQL_DIR}/data:/var/lib/mysql
將主機(jī)上 ${MYSQL_DIR}/data
目錄映射到容器的 /var/lib/mysql
目錄,這是MySQL存儲(chǔ)數(shù)據(jù)的位置。
${MYSQL_DIR}/conf:/etc/mysql/conf.d/
將主機(jī)上 ${MYSQL_DIR}/conf
目錄映射到容器的 /etc/mysql/conf.d/
,用于配置MySQL。
${MYSQL_DIR}/logs:/logs
將主機(jī)上 ${MYSQL_DIR}/logs
目錄映射到容器的 /logs 目錄,用于存儲(chǔ)MySQL的日志。
然后是Redis的持久化。
Redis:container_name: redis6image: redis:${REDIS_VERSION}restart: alwaysvolumes:- ${REDIS_DIR}/data:/data- ${REDIS_DIR}/conf/redis.conf:/etc/redis/redis.confports:- ${REDIS_PORT}:6379command: redis-server /etc/redis/redis.conf
Etcd持久化。
Project-User:container_name: project-userimage: project-user:latestports:- 8080:8080- 8881:8881
User服務(wù)持久化。
Etcd:container_name: etcd3image: bitnami/etcd:${ETCD_VERSION}deploy:replicas: 1restart_policy:condition: on-failureenvironment:- ALLOW_NONE_AUTHENTICATION=yesprivileged: truevolumes:- ${ETCD_DIR}/data:/bitnami/etcd/dataports:- ${ETCD_PORT}:2379- 2380:2380
上面我們有一些需要環(huán)境提供的參數(shù),這里需要在.env
環(huán)境編寫。
MYSQL_VERSION=8.0.20
MYSQL_DIR=D:\GoProject\msproject-data\mysql
MYSQL_PORT=3309
REDIS_VERSION=6.2.7
REDIS_PORT=6379
REDIS_DIR=D:\GoProject\msproject-data\redis
ETCD_VERSION=3.5.6
ETCD_PORT=2379
ETCD_DIR=D:\GoProject\msproject-data\etcd
此外還需要在redis下來(lái)配置.conf文件
,D:\GoProject\msproject-data\redis\conf
# 任意ip可訪問(wèn)
bind 0.0.0.0
# 自定義啟動(dòng)端口
port 6379
# rdb或aof文件存儲(chǔ)位置
dir /data
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfilename "appendonly.aof"
運(yùn)行docker
我們?cè)陧?xiàng)目路徑下直接docker-compose up -d
,-d的作用是后臺(tái)啟動(dòng),然后直接等待拉取啟動(dòng)即可。
在desktop中能看到幫我們拉取的鏡像。
以及啟動(dòng)的容器。
通過(guò)redis試試是否能夠添加成功。
CREATE TABLE `ms_member` (`id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '系統(tǒng)前臺(tái)用戶表',`account` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用戶登陸賬號(hào)',`password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '登陸密碼',`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '用戶昵稱',`mobile` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手機(jī)',`realname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '真實(shí)姓名',`create_time` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '創(chuàng)建時(shí)間',`status` tinyint(1) NULL DEFAULT 0 COMMENT '狀態(tài)',`last_login_time` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上次登錄時(shí)間',`sex` tinyint(0) NULL DEFAULT 0 COMMENT '性別',`avatar` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '頭像',`idcard` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '身份證',`province` int(0) NULL DEFAULT 0 COMMENT '省',`city` int(0) NULL DEFAULT 0 COMMENT '市',`area` int(0) NULL DEFAULT 0 COMMENT '區(qū)',`address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所在地址',`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '備注',`email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '郵箱',`dingtalk_openid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '釘釘openid',`dingtalk_unionid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '釘釘unionid',`dingtalk_userid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '釘釘用戶id',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用戶表' ROW_FORMAT = COMPACT;
我們把準(zhǔn)備好的表,在mysql中導(dǎo)入。
這樣服務(wù)就跑起來(lái)了,我們來(lái)看看現(xiàn)在etcd是否能用。
分別把user服務(wù)和api服務(wù)跑起來(lái),然后看看前端是否能夠正常請(qǐng)求。
驗(yàn)證無(wú)誤,現(xiàn)在把mysql、redis、etcd遷移到docker上了,查詢r(jià)edis也能夠查詢到記錄的驗(yàn)證碼!
2. 部署go服務(wù)
需要把go服務(wù)也編譯打包成鏡像,然后運(yùn)行起來(lái)。下面是一個(gè)編譯的腳本。
chcp 65001
@echo off
:loop
@echo off&color 0A
cls
echo,
echo 請(qǐng)選擇要編譯的系統(tǒng)環(huán)境:
echo,
echo 1. Windows_amd64
echo 2. linux_amd64set/p action=請(qǐng)選擇:
if %action% == 1 goto build_Windows_amd64
if %action% == 2 goto build_linux_amd64:build_Windows_amd64
echo 編譯Windows版本64位
SET CGO_ENABLED=0
SET GOOS=windows
SET GOARCH=amd64
go build -o project-user/target/project-user.exe project-user/main.go
go build -o project-api/target/project-api.exe project-api/main.go
:build_linux_amd64
echo 編譯Linux版本64位
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build -o project-user/target/project-user project-user/main.go
go build -o project-api/target/project-api project-api/main.go
在腳本下執(zhí)行build
命令,然后進(jìn)行編譯,這里我們需要編譯linux版本,放到docker中去。
編寫dockerfile
寫dockerfile是為了編譯成鏡像。
FROM alpine
WORKDIR /Initial
COPY ./target/project-user .
COPY ./config/config-docker.yaml .
RUN mkdir config && mv config-docker.yaml config/config.yaml
EXPOSE 8080 8881
ENTRYPOINT ["./project-user"]
FROM alpine
指定了構(gòu)建鏡像所使用的基礎(chǔ)鏡像為 alpine,這是一個(gè)非常輕量的 Linux 發(fā)行版。使用 alpine 作為基礎(chǔ)鏡像,可以減小鏡像的體積,因?yàn)?alpine 鏡像通常非常小,只有幾十兆。
WORKDIR /Initial
設(shè)置容器內(nèi)的工作目錄為 /Initial。工作目錄是指在容器中運(yùn)行命令時(shí)默認(rèn)的目錄。如果該目錄不存在,WORKDIR 會(huì)創(chuàng)建它。
COPY ./target/project-user .
將本地系統(tǒng)中的 ./target/project-user 文件復(fù)制到 Docker 容器中的當(dāng)前工作目錄(即 /Initial)中。
COPY ./config/config-docker.yaml .
將本地系統(tǒng)中的 ./config/config-docker.yaml 文件復(fù)制到 Docker 容器的當(dāng)前工作目錄(/Initial)中。此文件通常用于存儲(chǔ)容器中應(yīng)用的配置文件。
RUN mkdir config && mv config-docker.yaml config/config.yaml
,首先在在容器的當(dāng)前工作目錄中創(chuàng)建一個(gè)名為 config 的新目錄。然后mv config-docker.yaml config/config.yaml:將之前復(fù)制到容器中的 config-docker.yaml 文件重命名為 config/config.yaml 并移動(dòng)到新創(chuàng)建的 config 目錄中。
EXPOSE 8080 8881
告知 Docker 容器將暴露端口 8080 和 8881,意味著容器運(yùn)行時(shí),這些端口將會(huì)被開放,并允許主機(jī)或其他容器與之通信。需要注意的是,EXPOSE 僅是一個(gè)聲明,它不會(huì)自動(dòng)將端口映射到主機(jī)上,實(shí)際的端口映射需要通過(guò) docker run -p 或 docker-compose.yml
配置來(lái)完成。
ENTRYPOINT ["./project-user"]
指定容器啟動(dòng)時(shí)的默認(rèn)命令。ENTRYPOINT 設(shè)置容器運(yùn)行時(shí)的入口點(diǎn),容器啟動(dòng)后,會(huì)執(zhí)行 ./project-user 這個(gè)命令。通常,ENTRYPOINT 用來(lái)指定容器的主進(jìn)程。在這里,./project-user 是容器內(nèi)的一個(gè)可執(zhí)行文件,它會(huì)在容器啟動(dòng)時(shí)運(yùn)行。
然后我們需要把原來(lái)config文件復(fù)制一份改為config-docker.yaml
文件,并且需要修改配置代碼。原本我們的server地址是127.0.0.1,這是本地回環(huán)地址,任何綁定在 127.0.0.1 上的服務(wù)只能在本地機(jī)器上訪問(wèn),不能從其他機(jī)器或者網(wǎng)絡(luò)中訪問(wèn)
需要改為0.0.0.0,綁定到 0.0.0.0 上的服務(wù)將接受來(lái)自所有網(wǎng)絡(luò)接口(包括外部網(wǎng)絡(luò)接口)的請(qǐng)求。這意味著服務(wù)不僅能接受本地機(jī)器的請(qǐng)求,還能接受來(lái)自其他機(jī)器或容器的請(qǐng)求。
server:name: "project-user"addr: "0.0.0.0:8080"
zap:debugFileName: "/logs/debug/project-debug.log"infoFileName: "/logs/info/project-info.log"warnFileName: "/logs/error/project-error.log"maxSize: 500,maxAge: 28,MaxBackups: 3
redis:host: "redis6"port: 6379password: ""db: 0
grpc:addr: "0.0.0.0:8881"name: "user"version: "1.0.0"weight: 2
etcd:addrs:- "etcd3:2379"
也就是說(shuō),在 Docker 容器中,通常容器中的服務(wù)是通過(guò) 容器的網(wǎng)絡(luò)接口 與其他容器或主機(jī)進(jìn)行通信的。如果你將應(yīng)用綁定到 127.0.0.1,那么它將只能接受來(lái)自容器內(nèi)部(即容器的網(wǎng)絡(luò)棧)或者本地機(jī)器的請(qǐng)求,而不能接受外部請(qǐng)求。這對(duì)多容器應(yīng)用或需要外部訪問(wèn)的服務(wù)(如 Web 服務(wù)、gRPC 服務(wù)等)會(huì)構(gòu)成問(wèn)題。
同時(shí)還要對(duì)redis和etcd的容器名設(shè)定好,已經(jīng)起來(lái)的容器名稱是redis6和etcd3,我們需要對(duì)應(yīng)設(shè)置好。
并且在docker-compoose.yaml的文件下,加入U(xiǎn)ser相關(guān)配置。
Project-User:container_name: project-userimage: project-user:latestports:- 8080:8080- 8881:8881
然后再寫一個(gè)run.bat的腳本,一起來(lái)打包運(yùn)行。
chcp 65001
cd project-user
docker build -t project-user:latest .
cd ..
docker-compose up -d
chcp 65001
用于 設(shè)置命令行的字符編碼 為 UTF-8(65001 是 UTF-8 編碼的代碼頁(yè))。
docker build -t project-user:latest .
構(gòu)建 Docker 鏡像的命令。-t project-user:latest
:這是為構(gòu)建出來(lái)的 Docker 鏡像指定一個(gè)標(biāo)簽(-t 參數(shù)),標(biāo)簽為 project-user:latest。latest 是鏡像的版本標(biāo)簽,意味著這是最新版本的鏡像。.
:指的是當(dāng)前目錄(即 project-user 目錄
)。構(gòu)建過(guò)程會(huì)查找當(dāng)前目錄下的 Dockerfile 文件,使用 Dockerfile 中的指令
來(lái)構(gòu)建鏡像。
docker-compose up -d
也就是cd到上層目錄之后,會(huì)根據(jù)當(dāng)前目錄下的 docker-compose.yml 文件來(lái)啟動(dòng)定義的服務(wù)。docker-compose.yml 文件通常包含一個(gè)或多個(gè)服務(wù)(如 Web 服務(wù)、數(shù)據(jù)庫(kù)服務(wù)等)的配置。
然后我們來(lái)run這個(gè)bat腳本,然后等待運(yùn)行即可。(這個(gè)過(guò)程需要魔法,不然會(huì)失敗,這個(gè)點(diǎn)大家自行解決即可。)
嗯,魔法也不行,魔法只能pull,但是不能構(gòu)建dockerfile,會(huì)一直提示報(bào)錯(cuò),這里還需要添加docker的鏡像地址。
{"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://docker.registry.cyou/","https://docker-cf.registry.cyou/","https://dockercf.jsdelivr.fyi/","https://docker.jsdelivr.fyi/","https://dockertest.jsdelivr.fyi/","https://mirror.aliyuncs.com/","https://dockerproxy.com/","https://mirror.baidubce.com/","https://docker.m.daocloud.io/","https://docker.nju.edu.cn/","https://docker.mirrors.sjtug.sjtu.edu.cn/","https://docker.mirrors.ustc.edu.cn/","https://mirror.iscas.ac.cn/","https://docker.rainbond.cc/","https://jq794zz5.mirror.aliyuncs.com"]}
這里我們?cè)赿ocker引擎里面設(shè)置即可。
現(xiàn)在再重新run.bat
這個(gè)腳本,就可以構(gòu)造我們user的鏡像,并且運(yùn)行全部的docker compose了。
這個(gè)時(shí)候我們也能看到user鏡像了。
現(xiàn)在啟動(dòng)就可以不用通過(guò)本地goland用go run 命令啟動(dòng)服務(wù)了,已經(jīng)在容器里面跑起來(lái)了。
通過(guò)命令docker logs -f project-user
可以查看對(duì)應(yīng)的docker容器日志。
然后在本地啟動(dòng)api服務(wù),在前端發(fā)送請(qǐng)求,驗(yàn)證成功。
此時(shí)user容器的日志也已更新。
如果后續(xù)改動(dòng)了代碼,需要驗(yàn)證的話,步驟就是先運(yùn)行命令build.bat
命令,build對(duì)應(yīng)的linux版本。也就是先編譯Go程序?yàn)閘inux版本。
然后運(yùn)行run.bat
腳本,重新編譯鏡像并運(yùn)行容器。這樣等待重新生效即可。
后續(xù)如何在linux下查看占用的端口情況,這里有兩個(gè)命令:
netstat -tulnpss -tuln