1. 程式人生 > >邊緣化搭建 DotNet Core 2.1 自動化釋出和部署(下)

邊緣化搭建 DotNet Core 2.1 自動化釋出和部署(下)

寫在前面

   本篇文章是上一篇邊緣化搭建 DotNet Core 2.1 自動化釋出和部署(上)的後續操作,本文主要講解如何開啟Docker Remote API,開啟Remote API後的許可權安全問題。配置Jenkins構建專案,並在雲伺服器上構建成功。廢話不多說,我們一起來動手操作吧。

先決條件

1.一臺Debain 9系統 x86 伺服器 硬體環境:1核2G 40G硬碟。

2. x86伺服器成功安裝並執行Docker環境(本文不闡述安裝過程,讀者可查閱參考文獻)

2.根據上一篇邊緣化搭建 DotNet Core 2.1 自動化釋出和部署(上)搭建好的邊緣計算環境 

開啟Docker Remote API

  Remote API主要用於遠端訪問Docker守護程序從而下達指令的。 因此,我們在啟動Docker守護程序時,需要新增-H引數並指定開啟的訪問埠。 通常,我們可以通過編輯守護程序的配置檔案來實現。不過對於不同作業系統而言,守護程序啟動的配置檔案也不盡相同。但是現在我們不需要去改動系統原有的配置檔案,通過drop-in file方式進行覆蓋配置,所以在不改動系統配置檔案的方式下,我們的覆蓋配置檔案的路徑基本保持一致。

建立 override.conf

  我們需要在x86伺服器上建立 override.con 配置檔案。

$ mkdir -p /etc/systemd/system/docker.service.d/
$ nano override.conf

編輯 override.conf 

  1.將以下內容加入到override.conf檔案

[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

測試Remote API

$ curl http://your ip:2375/info 

  測試成功將返回如下資訊:

 

開啟 Remote API 安全認證

  到目前位置,我們已經在x86伺服器開啟Docker Remote API來控制Docker服務。但是,細心的讀者應該已經發現,在這個連線訪問的過程中並沒有安全認證機制,也就是說任何人只要知道Remote API地址和埠都可以控制Docker 服務,然而這樣將會大大增加了服務的風險。接下來筆者將告訴大家如何為Remote API新增認證機制。

生成證書

  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 ,為了各位讀者能順利進行教程操作,請跟筆者一起使用相同的域名。

配置 override.conf 

  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

測試 Remote API 安全認證

  測試的使用記得一定要使用域名進行訪問,如果沒有設定域名解析,可以通過修改本地的host的方式進行實現。

curl https://master:2376/info --cert /root/master/cert.pem --key /root/master/key.pem --cacert /root/master/ca.pem

建立Jenkins專案

  接下來,我們進入使用樹莓派搭建好的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 [email protected]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