為什么要寫這個?
在一個系統長大的過程中會經歷不斷重構升級來滿足商業的需求,而一個嚴謹的商業系統需要高效、穩定、可擴展,有時候還不得不考慮成本的問題。我希望能找到比較完整的開源解決方案來解決持續集成、監控報警、以及擴容和高可用性的問題。是學習和探索的過程分享給大家,也歡迎同行的人交流。
先來一個三步曲,我們將完成通過GitLab CI 自動部署 net core web api 到Docker 容器的一個示例。這是第一步,通過此文您將了解如何將net core web api 運行在Docker容器中。
-
在Docker 容中運行Asp.net Core web API
-
用Docker 5分鐘搭一套Gitlab 環境
-
用GitLab CI 完成 .Net Core API 的自動部署
以上所有示例將在Mac中完成。
本系列文章會優先發表于我的公眾號jessetalk, 會拆成更小篇幅更利于閱讀。除了技術還會有一些關于產品、技術管理、學習方法論的一些思考,歡迎大家關注。
如何在Docker容器中運行Asp.net Core web api
這是第一部份, 我們將對Docker進行一些初步的介紹,安裝以及基本的操作;然后我們會創建一個最簡單的 netcore web api 并讓它在Docker中運行。
Docker的安裝
當然Mac上的安裝是非常簡單的,只需要到Docker的官網上下載一個docker for mac的安裝包就可以了。安裝完之后,就會在頂部的狀態欄中看到Docker的圖標。
關于鏡像的問題
如果不使用國內鏡像的話,下載image將會非常的慢。在阿里云中可以申請一個自己的加速地址,速度是非常不錯的。進入阿里云控制臺-> 產品與服務-> 容器服務 下的鏡像倉庫控制臺 可以在Docker Hub鏡像站點中找到。
在Docker中配置鏡像:
安裝完之后可以在terminal中輸入docker info 來檢測是否安裝正常。
Docker的入門使用
下面介紹一些簡單的Docker命令,以便從來沒有實踐過Docker的同學來了解我們接下來要做的事情。
當我們剛開始安裝完Docker之后,本地是沒有任何的鏡像的。永遠的入門第一步,下載一個hello-world的鏡像然后運行它。
helloworld是鏡像的名稱,我們默認連接的是docker hub也就是官方提供的鏡像倉庫,當然我們也可以連接其它的甚至建立自己的鏡像倉庫。當本地沒有 helloworld這個鏡像的時候,Docker就會自動去下載這個鏡像到本地。
關于DockerFile
docker build命令在構建一個image的時候所需要的信息都在DockerFile中。比如我們接下來要運行的一個asp.net core api 的容器大概需要這樣幾步:
安裝并運行.net core web api
在Mac上安裝net core ,首先需要下載更新最新的OpenSSL

然后可以到官網下載net core 1.1 on MacOS,完成之后可以在命令行輸入 dotnet --version 來檢測當前的版本。
初始化項目并運行
通過3個命領我們可以完成初始化項目并運行的全過程: dotnet new|restore|run。 dotnet 框架默認提供一些初始化的項目模板,可以輸入dotnet new -all來查看。

我們可以用 dotnet new webapi 來初始化一個與文件夾名稱相同的 webapi項目,也可以在后面加 -n自定義一個項目名稱。然后接著在命令行中進入項目的目錄輸入 dotnet restore,最后用 dotnet run來運行這個web api 項目。

接著就可以在本地瀏覽這個api

到這里我們的dotnet core web api已經運行在本地了,接下來我們就要讓它運行在Docker中。
在Docker中運行dotnet core web api
上面我們已經講過DockerFile以及一個net core web api 中應該如何配置它。我們會把它放到項目的根目錄里。 可以用Visual studio for mac 打開整個web api項目。

接下來我們要做的就是把我們這個代碼構建成一個鏡像。

我們在terminal中進行項目的根目錄,輸入 docker build -t myA=apiimage .

完成之后輸入 docker images 可以查看到我們剛剛創建的鏡像

接下來我們就可以用 docker run 用剛剛這個鏡像啟動一個容器運行在host的 8080端口。

這個時候我們再訪問之前的api就需要通過8080端口,而此時的 api 已經是在容器中運行的。

5分鐘快速用Docker部署你自己的GitLab
在掌握了Docker的基本用法之后,我們需要了解如何把GitLab通過Docker跑起來。
Gitlab的安裝與配置
sudo docker run --detach \
--hostname 127.0.0.1 \
--publish 443:443 --publish 80:80 --publish 2222:22 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab:Z \
--volume /srv/gitlab/logs:/var/log/gitlab:Z \
--volume /srv/gitlab/data:/var/opt/gitlab:Z \
gitlab/gitlab-ce:latest
我們用到的參數列表: docker run 的參數配置可以查看官方文檔。

在運行安裝腳本之前,我們所使用的volume路徑需要授權給docker。

可能會遇到的問題
我在安裝及配置的時候遇到了兩個問題,可能有人也會遇到。
- GitLab 一直在重啟(跑不起來)
- SSH連接不上
SSH連接的問題我們下面有一小節會講,這里我簡單說一下第一個問題。當我運行腳本之后通過 docker ps 查看當前正在運行的容里面并沒有看到 gitlab這個容器,通過 ps -a顯示所有容器時發現它的狀態一直是 starting 或者 restarting。 這個時候我們可以使用 docker logs 來查看當前容器的運行日志。
Preparing services...
Starting services...
/opt/gitlab/embedded/bin/runsvdir-start: line 24: ulimit: pending signals: cannot modify limit: Operation not permitted
/opt/gitlab/embedded/bin/runsvdir-start: line 37: /proc/sys/fs/file-max: Read-only file system
Configuring GitLab package...
Configuring GitLab...
================================================================================
Error executing action `run` on resource 'ruby_block[directory resource: /var/opt/gitlab/git-data/repositories]'
================================================================================
通過 docker logs 可以方便大家來論斷錯誤,一切正常還好,如果一旦出現問題,新手是很懵圈的。這個時候可能通過google 查找錯誤日志,多數情況下都能找到正確答案,我遇到的是個權限不足的問題, 在這個鏈接里面有完整的討論,解決辦法就是執行下面這句命令之后就可以正常啟行了。
sudo chmod 2770 /srv/gitlab/data/git-data/repositories
SSH 連接GitLab
如果對于SSH不是很了解的同學可以看看阮一峰寫的兩篇關于
SSH原理與運用的文章,非常的不錯。 我們直接開始嘗試用SSH連接我們本地的gitlab。
首先我們需要得到一個SSH Key,輸入
如果出現 ssh-rsa打頭的字符,說明本地已經有了SSH Key那我們可以直接拿來用,如果沒有則需要我們自己創建一個SSH Key。
創建SSH Key
輸入以下命令創建一個SSH Key。
ssh-keygen -t rsa -C "your.email@example.com" -b 4096
完成之后可以再輸入 上面的cat命令 或者pbcopy直接復制生成的ssh key。
pbcopy < ~/.ssh/id_rsa.pub
在GitLab中賬號-》設置中找到 SSH Keys中添加這個Key即可。

、
SSH 連接 2222 端口
正常情況下你已經可以通過git命令來連接我們部署的gitlab,但這里不一樣的是我們把容器的 22端口映射到了 host的 2222上,我們需要指定端口來進連接。
ssh -p 2222 git@127.0.0.1
同時還需要更改GitLab的配置文件中的 ssh端口,否則GitLab中為我們生成的項目連接地址會連接不上。/gitlab/config/gitlab.rb
gitlab_rails['gitlab_shell_ssh_port'] = 2222
到這里我們已經完成了GitLab的部署,可以將我們之前的net core api 項目提交到代碼庫,都是一些常規的操作,這里就不做過多的說明了。
由于篇符的原因,這里先寫前面兩部份(博客園的編輯器寫長文的時候經常崩潰....) 。我們成功地將.net core api運行到了docker容器中,也部署了一套git環境。 Gitlab CI 是Gitlab 8.0以后引進的,目的是更好的支持持續集成,我們第三部分將給大家介紹如果用Gitlab CI 做到在代碼提交之后自動部署最新的代碼到Docker容器。
本系列文章會優先發表于我的公眾號jessetalk, 會拆成更小篇幅更利于閱讀。除了技術還會有一些關于產品、技術管理、學習方法論的一些思考,歡迎大家關注。