本篇文章是上一篇邊緣化搭建 DotNet Core 2.1 自動化發佈和部署(上)的後續操做,本文主要講解如何開啓Docker Remote API,開啓Remote API後的權限安全問題。配置Jenkins構建項目,並在雲服務器上構建成功。廢話很少說,咱們一塊兒來動手操做吧。html
1.一臺Debain 9系統 x86 服務器 硬件環境:1核2G 40G硬盤。linux
2. x86服務器成功安裝並運行Docker環境(本文不闡述安裝過程,讀者可查閱參考文獻)git
2.根據上一篇邊緣化搭建 DotNet Core 2.1 自動化發佈和部署(上)搭建好的邊緣計算環境 docker
Remote API主要用於遠程訪問Docker守護進程從而下達指令的。 所以,咱們在啓動Docker守護進程時,須要添加-H參數並指定開啓的訪問端口。 一般,咱們能夠經過編輯守護進程的配置文件來實現。不過對於不一樣操做系統而言,守護進程啓動的配置文件也不盡相同。可是如今咱們不須要去改動系統原有的配置文件,經過drop-in file方式進行覆蓋配置,因此在不改動系統配置文件的方式下,咱們的覆蓋配置文件的路徑基本保持一致。api
咱們須要在x86服務器上建立 override.conf 配置文件。安全
$ mkdir -p /etc/systemd/system/docker.service.d/ $ nano override.conf
1.將如下內容加入到override.conf文件bash
[Service] ExecStart= ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2376
2.重啓Docker服務服務器
$ sudo systemctl daemon-reload $ sudo systemctl restart docker.service
$ curl http://your ip:2375/info
測試成功將返回以下信息:curl
到目前位置,咱們已經在x86服務器開啓Docker Remote API來控制Docker服務。可是,細心的讀者應該已經發現,在這個鏈接訪問的過程當中並無安全認證機制,也就是說任何人只要知道Remote API地址和端口均可以控制Docker 服務,然而這樣將會大大增長了服務的風險。接下來筆者將告訴你們如何爲Remote API添加認證機制。tcp
1.新建一個命名爲 createSSL.sh 的 Shell 腳本文件。
$ sudo nano createSSL.sh
2.在 createSSL.sh 文件中加入如下代碼:
#!/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
3.執行生成證書操做。
$ sh createSSL.sh master
第一個ca-key.perm 生成時可能須要你輸入一個密碼,隨便就能夠了,只要記得住。此處略有坑,不能一路回車,$VAR 輸入的參數必須是域名,這波操做是在配置jenkins docker插件時發現的。筆者使用的域名是:master ,爲了各位讀者能順利進行教程操做,請跟筆者一塊兒使用相同的域名。
1.將生成的ca.pem, server-cert.pem, server-key.pem 文件複製到 /root/.docker 目錄下。固然此目錄並不是固定的,讀者能夠根據本身的心情來存放其餘的目錄路徑。目錄存放的路徑絕對不能錯,否者docker.service 將會啓動不了。
$ mkdir -p /root/.docker $ cp {ca,server-cert,server-key}.pem /root/.docker/
2.最終 /etc/systemd/system/docker.service.d/override.conf 文件內容以下:
[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
3.重啓Docker服務
$ sudo systemctl daemon-reload $ sudo systemctl restart docker.service
測試的使用記得必定要使用域名進行訪問,若是沒有設置域名解析,能夠經過修改本地的host的方式進行實現。
curl https://master:2376/info --cert /root/master/cert.pem --key /root/master/key.pem --cacert /root/master/ca.pem
接下來,咱們進入使用樹莓派搭建好的Jenkins系統新建項目,並經過 docker-compose 方式啓動項目。Let's do it
經過SSH鏈接樹莓派後,將x86服務器上生成的 ca.pem,server-cert.pem,server-key.pem 證書下載到樹莓派 /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
1.構建一個自由風格的軟件項目
2.設置源碼地址,爲了方便各位讀者,筆者已經新建一個項目代碼倉,讀者能夠直接使用這個倉,快速跑一遍流程。git 地址:https://gitee.com/wenalu/Rpi-MvcTest.git
3.設置構建觸發器,讓項目能夠定時輪詢倉庫,執行自動構建,本次配置的參數爲2分鐘獲取一次。
4.新增構建,選擇執行Shell,並填寫如下腳本內容
#!/bin/bash # 獲取短版本號 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
請各位讀者在填寫執行Shell內容時注意 -H=master:2376 ,master的含義是生成證書使用的域名,亦是在上篇博文中,啓動 Jenkins 添加 --add-host 解析參數,筆者填寫的解析IP:192.168.6.200,因此最後筆者訪問master將會指向6.200的機器。固然,讀者若使用的是雲服務器,而且配置了域名解析,那麼只須要將 master 改爲解析的域名便可,不須要在啓動 Jenkins 添加 --add-host 參數。請各位讀者謹記,避免踩坑。爲了方便各位讀者,重貼啓動 Jenkins 代碼,請按需修改啓動參數。
$ 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
當各位讀者的構建結果最後輸出的信息最終和筆者保持一致的時候,那麼整個流程就跑完了。
至此,本篇內容已經所有完畢了,博文中可能有不少表述不太專業的地方,還請各位讀者指點交流。其實本文章標題有另一個《「窮」式搭建 DotNet Core 2.1 自動化發佈和部署》,後來考慮好久不用這個標題是由於自己本身屬於這個行業的專業人士,不能用比較庸俗的詞來表述這篇文章,因此纔有如今的這個標題。很開心我終於寫完了,寫這一大章的內容真的挺不容易,也挺佩服那些堅持下來,寫了那麼多博文的做者是怎麼走過來的。爲他們對社區做出的貢獻喝彩吧。大吉大利,今晚吃雞
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