寫(xiě)在前面
本篇文章是上一篇邊緣化搭建 DotNet Core 2.1 自動(dòng)化發(fā)布和部署(上)的后續(xù)操作悉盆,本文主要講解如何開(kāi)啟Docker Remote API,開(kāi)啟Remote API后的權(quán)限安全問(wèn)題送淆。配置Jenkins構(gòu)建項(xiàng)目帜羊,并在云服務(wù)器上構(gòu)建成功系吭。廢話不多說(shuō)咙鞍,我們一起來(lái)動(dòng)手操作吧。
先決條件
1.一臺(tái)Debain 9系統(tǒng) x86 服務(wù)器 硬件環(huán)境:1核2G 40G硬盤(pán)切距。
2. x86服務(wù)器成功安裝并運(yùn)行Docker環(huán)境(本文不闡述安裝過(guò)程朽缎,讀者可查閱參考文獻(xiàn))
2.根據(jù)上一篇邊緣化搭建 DotNet Core 2.1 自動(dòng)化發(fā)布和部署(上)搭建好的邊緣計(jì)算環(huán)境
開(kāi)啟Docker Remote API
Remote API主要用于遠(yuǎn)程訪問(wèn)Docker守護(hù)進(jìn)程從而下達(dá)指令的。 因此蔚舀,我們?cè)趩?dòng)Docker守護(hù)進(jìn)程時(shí)饵沧,需要添加-H參數(shù)并指定開(kāi)啟的訪問(wèn)端口。 通常赌躺,我們可以通過(guò)編輯守護(hù)進(jìn)程的配置文件來(lái)實(shí)現(xiàn)狼牺。不過(guò)對(duì)于不同操作系統(tǒng)而言,守護(hù)進(jìn)程啟動(dòng)的配置文件也不盡相同礼患。但是現(xiàn)在我們不需要去改動(dòng)系統(tǒng)原有的配置文件是钥,通過(guò)drop-in file方式進(jìn)行覆蓋配置,所以在不改動(dòng)系統(tǒng)配置文件的方式下缅叠,我們的覆蓋配置文件的路徑基本保持一致悄泥。
創(chuàng)建 override.conf
我們需要在x86服務(wù)器上創(chuàng)建 override.conf 配置文件肤粱。
$ mkdir -p /etc/systemd/system/docker.service.d/
$ nano override.conf
編輯 override.conf
1.將以下內(nèi)容加入到override.conf文件
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2376
2.重啟Docker服務(wù)
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker.service
測(cè)試Remote API
$ curl http://your ip:2375/info
測(cè)試成功將返回如下信息:
開(kāi)啟 Remote API 安全認(rèn)證
到目前位置鸥鹉,我們已經(jīng)在x86服務(wù)器開(kāi)啟Docker Remote API來(lái)控制Docker服務(wù)灸异。但是,細(xì)心的讀者應(yīng)該已經(jīng)發(fā)現(xiàn)喇聊,在這個(gè)連接訪問(wèn)的過(guò)程中并沒(méi)有安全認(rèn)證機(jī)制凯楔,也就是說(shuō)任何人只要知道Remote API地址和端口都可以控制Docker 服務(wù)虐骑,然而這樣將會(huì)大大增加了服務(wù)的風(fēng)險(xiǎn)垂寥。接下來(lái)筆者將告訴大家如何為Remote API添加認(rèn)證機(jī)制。
生成證書(shū)
1.新建一個(gè)命名為 createSSL.sh 的 Shell 腳本文件戏仓。
$ sudo nano createSSL.sh
2.在 createSSL.sh 文件中加入以下代碼:
復(fù)制代碼
#!/bin/bash
set -e
if [ -z $1 ];then
? ? ? ? echo "input file location"
? ? ? ? exit 0
fi
VAR=$1?
mkdir -p $1
cd $1
openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=$VAR" -sha256 -new -key server-key.pem -out server.csr
echo subjectAltName = DNS:$VAR,IP:127.0.0.1 > extfile.cnf
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
rm -v client.csr server.csr
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem
復(fù)制代碼
3.執(zhí)行生成證書(shū)操作嗓奢。
$ sh createSSL.sh master
第一個(gè)ca-key.perm 生成時(shí)可能需要你輸入一個(gè)密碼讼撒,隨便就可以了,只要記得住。此處略有坑根盒,不能一路回車(chē)钳幅,$VAR 輸入的參數(shù)必須是域名,這波操作是在配置jenkins docker插件時(shí)發(fā)現(xiàn)的炎滞。筆者使用的域名是:master 敢艰,為了各位讀者能順利進(jìn)行教程操作,請(qǐng)跟筆者一起使用相同的域名册赛。
配置 override.conf
1.將生成的ca.pem, server-cert.pem, server-key.pem 文件復(fù)制到 /root/.docker 目錄下钠导。當(dāng)然此目錄并非固定的,讀者可以根據(jù)自己的心情來(lái)存放其他的目錄路徑森瘪。目錄存放的路徑絕對(duì)不能錯(cuò)牡属,否者docker.service 將會(huì)啟動(dòng)不了。
$ mkdir -p /root/.docker
$ cp {ca,server-cert,server-key}.pem /root/.docker/
2.最終 /etc/systemd/system/docker.service.d/override.conf 文件內(nèi)容如下:
復(fù)制代碼
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -D -H tcp://0.0.0.0:2376 --tlsverify --tlscacert=/root/.docker/ca.pem --tlscert=/root/.docker/server-cert.pem --tlskey=/root/.docker/server-key.pem
復(fù)制代碼
3.重啟Docker服務(wù)
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker.service
測(cè)試 Remote API 安全認(rèn)證
測(cè)試的使用記得一定要使用域名進(jìn)行訪問(wèn)扼睬,如果沒(méi)有設(shè)置域名解析逮栅,可以通過(guò)修改本地的host的方式進(jìn)行實(shí)現(xiàn)。
curl https://master:2376/info --cert /root/master/cert.pem --key /root/master/key.pem --cacert /root/master/ca.pem
創(chuàng)建Jenkins項(xiàng)目
接下來(lái)窗宇,我們進(jìn)入使用樹(shù)莓派搭建好的Jenkins系統(tǒng)新建項(xiàng)目措伐,并通過(guò) docker-compose 方式啟動(dòng)項(xiàng)目。Let's do it
下載證書(shū)
通過(guò)SSH連接樹(shù)莓派后军俊,將x86服務(wù)器上生成的 ca.pem侥加,server-cert.pem,server-key.pem 證書(shū)下載到樹(shù)莓派 /var/jenkins_home/cert/master 目錄蝇完。
$ sudo mkdir -p /var/jenkins_home/cert/master
$ sudo scp rtdsoft@192.168.6.200:/home/loongle/master/{cert,key,ca}.pem /var/jenkins_home/cert/master
新建任務(wù)
1.構(gòu)建一個(gè)自由風(fēng)格的軟件項(xiàng)目
2.設(shè)置源碼地址官硝,為了方便各位讀者,筆者已經(jīng)新建一個(gè)項(xiàng)目代碼倉(cāng)短蜕,讀者可以直接使用這個(gè)倉(cāng)氢架,快速跑一遍流程。git 地址:https://gitee.com/wenalu/Rpi-MvcTest.git
3.設(shè)置構(gòu)建觸發(fā)器朋魔,讓項(xiàng)目可以定時(shí)輪詢倉(cāng)庫(kù)岖研,執(zhí)行自動(dòng)構(gòu)建,本次配置的參數(shù)為2分鐘獲取一次警检。
4.新增構(gòu)建孙援,選擇執(zhí)行Shell,并填寫(xiě)以下腳本內(nèi)容
復(fù)制代碼
#!/bin/bash
# 獲取短版本號(hào)
docker ps
pwd
ls
echo ----------------------------------------
whoami
echo ----------------------------------------
GITHASH=`git rev-parse --short HEAD`
echo ---------------Docker Three------------------
docker-compose --tlsverify \
? --tlscacert=/usr/local/jenkins/cert/master/ca.pem \
? --tlscert=/usr/local/jenkins/cert/master/cert.pem \
? --tlskey=/usr/local/jenkins/cert/master/key.pem \
? -H=master:2376 \
? -f ./docker-compose.yml -f ./docker-compose.override.yml? -p dockercompose4255153253317384266 down --rmi local --remove-orphans
?
?
docker-compose --tlsverify \
? --tlscacert=/usr/local/jenkins/cert/master/ca.pem \
? --tlscert=/usr/local/jenkins/cert/master/cert.pem \
? --tlskey=/usr/local/jenkins/cert/master/key.pem \
? -H=master:2376 \
? -f ./docker-compose.ci.build.yml -p dockercompose4255153253317384266 config
?
?
docker-compose --tlsverify \
? --tlscacert=/usr/local/jenkins/cert/master/ca.pem \
? --tlscert=/usr/local/jenkins/cert/master/cert.pem \
? --tlskey=/usr/local/jenkins/cert/master/key.pem \
? -H=master:2376 \
? -f ./docker-compose.ci.build.yml -p dockercompose4255153253317384266 up --build
echo ---------------Publishing...------------------
docker-compose --tlsverify \
? --tlscacert=/usr/local/jenkins/cert/master/ca.pem \
? --tlscert=/usr/local/jenkins/cert/master/cert.pem \
? --tlskey=/usr/local/jenkins/cert/master/key.pem \
? -H=master:2376 \
? -f "./docker-compose.yml" -f "./docker-compose.override.yml"? -p dockercompose4255153253317384266 up -d --build
復(fù)制代碼
注意事項(xiàng)
請(qǐng)各位讀者在填寫(xiě)執(zhí)行Shell內(nèi)容時(shí)注意 -H=master:2376 扇雕,master的含義是生成證書(shū)使用的域名拓售,亦是在上篇博文中,啟動(dòng) Jenkins 添加 --add-host 解析參數(shù)镶奉,筆者填寫(xiě)的解析IP:192.168.6.200础淤,所以最后筆者訪問(wèn)master將會(huì)指向6.200的機(jī)器崭放。當(dāng)然,讀者若使用的是云服務(wù)器鸽凶,并且配置了域名解析币砂,那么只需要將 master 改成解析的域名即可,不需要在啟動(dòng) Jenkins 添加 --add-host 參數(shù)玻侥。請(qǐng)各位讀者謹(jǐn)記决摧,避免踩坑。為了方便各位讀者凑兰,重貼啟動(dòng) Jenkins 代碼掌桩,請(qǐng)按需修改啟動(dòng)參數(shù)。
復(fù)制代碼
$ sudo docker run --name=jenkins --restart=always --add-host master:192.168.6.200 -p 8080:8080 -p 50000:50000 -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/bin/docker -v /var/jenkins_home:/usr/local/jenkins/ -d auto-jenkins
復(fù)制代碼
測(cè)試
當(dāng)各位讀者的構(gòu)建結(jié)果最后輸出的信息最終和筆者保持一致的時(shí)候票摇,那么整個(gè)流程就跑完了拘鞋。
寫(xiě)在后面
至此,本篇內(nèi)容已經(jīng)全部完畢了矢门,博文中可能有很多表述不太專業(yè)的地方,還請(qǐng)各位讀者指點(diǎn)交流灰蛙。其實(shí)本文章標(biāo)題有另外一個(gè)《「窮」式搭建 DotNet Core 2.1 自動(dòng)化發(fā)布和部署》祟剔,后來(lái)考慮很久不用這個(gè)標(biāo)題是因?yàn)楸旧碜约簩儆谶@個(gè)行業(yè)的專業(yè)人士,不能用比較庸俗的詞來(lái)表述這篇文章摩梧,所以才有現(xiàn)在的這個(gè)標(biāo)題物延。很開(kāi)心我終于寫(xiě)完了,寫(xiě)這一大章的內(nèi)容真的挺不容易仅父,也挺佩服那些堅(jiān)持下來(lái)叛薯,寫(xiě)了那么多博文的作者是怎么走過(guò)來(lái)的。為他們對(duì)社區(qū)作出的貢獻(xiàn)喝彩吧笙纤。大吉大利耗溜,今晚吃雞
參考文獻(xiàn)
https://docs.docker.com/install/linux/docker-ce/debian/
https://success.docker.com/article/how-do-i-enable-the-remote-api-for-dockerd
https://blog.csdn.net/laodengbaiwe0838/article/details/79340805