涉及技術 Spring boot + Docker + Swarm mode + docker-registry + Rancher + Jenkins
在安裝以前,建議先多看下docker的相關文檔,理解它的結構原理node
(推薦一本書,Docker-從入門到實踐)linux
3臺centOS機器,內核版本不低於3.10(docker運行環境要求內核版本不低於3.10),3臺機器先都分別叫test01(安裝相關工具),test02(部署應用容器),test03(鏡像私服倉庫,若是使用公共倉庫,能夠忽略這臺機器)。nginx
由於博主這邊的機器都是基於centOS,因此今天就講centOS安裝docker的步驟,其它的另請百度。spring
若是是新機器,以前沒有裝過就能夠忽略這一步。docker
使用如下命令卸載舊版本:json
$ sudo yum remove docker \
docker-client \
複製代碼
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engines複製代碼
在測試或開發環境中 Docker 官方爲了簡化安裝流程,提供了一套便捷的安裝腳本,依次在三臺機器上進行這套腳本安裝:ubuntu
$ curl -fsSL get.docker.com -o get-docker.sh 複製代碼
$ sudo sh get-docker.sh --mirror Aliyun 數組
$ sudo systemctl enable docker
$ sudo systemctl start docker
複製代碼
默認狀況下, docker 命令會使用 Unix socket 與 Docker 引擎通信。而只有 root 用戶和 docker 組的用戶才能夠訪問 Docker 引擎的 Unix socket。出於安全考慮,通常 Linux 系統上不會直接使用 root 用戶。所以,更好地作法是將須要使用 docker 的用戶加入 docker 用戶組。tomcat
創建 docker 組:安全
$ sudo groupadd docker
複製代碼
將當前用戶加入 docker 組:
$ sudo usermod -aG docker $USER
複製代碼
退出當前終端並從新登陸
$ docker run hello-world
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world ca4f61b1923c: Pull complete Digest: sha256:be0cd392e45be79ffeffa6b05338b98ebb16c87b255f48e297ec7f98e123905c Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://cloud.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/複製代碼
若能正常輸出以上信息,則說明安裝成功
國內從 Docker Hub 拉取鏡像有時會遇到困難,此時能夠配置鏡像加速器
Docker 官方提供的中國 registry mirror https://registry.docker-cn.com
七牛雲加速器 https://reg-mirror.qiniu.com/
DaoCloud加速 https://www.daocloud.io/mirror
Docker 1.12 Swarm mode 已經內嵌入 Docker 引擎,成爲了 docker 子命令 docker swarm 。請注意與舊的 Docker Swarm 區分開來。
Swarm mode 內置 kv 存儲功能,提供了衆多的新特性,好比:具備容錯能力的去中心化設 計、內置服務發現、負載均衡、路由網格、動態伸縮、滾動更新、安全傳輸等。使得 Docker 原生的 Swarm 集羣具有與 Mesos、Kubernetes 競 的實力。
Swarm 是使用 SwarmKit 構建的 Docker 引擎內置(原生)的集羣管理和編排工具。使用 Swarm 集羣以前須要瞭解如下幾個概念。
運行 Docker 的主機能夠主動初始化一個 Swarm 集羣或者加入一個已存在的 Swarm 集羣, 這樣這個運行 Docker 的主機就成爲一個 Swarm 集羣的節點 ( node ) 。節點分爲管理 ( manager ) 節點和工做 ( worker ) 節點。
管理節點用於 Swarm 集羣的管理, docker swarm 命令基本只能在管理節點執行(節點退出 集羣命令 docker swarm leave 能夠在工做節點執行)。一個 Swarm 集羣能夠有多個管理節 點,但只有一個管理節點能夠成爲 leader , leader 經過 raft 協議實現。
工做節點是任務執行節點,管理節點將服務 ( service ) 下發至工做節點執行。管理節點默認 也做爲工做節點。你也能夠經過配置讓服務只運行在管理節點。
來自 Docker 官網的這張圖片形象的展現了集羣中管理節點與工做節點的關係。
任務 ( Task )是 Swarm 中的最小的調度單位,目前來講就是一個單一的容器。
服務 ( Services ) 是指一組任務的集合,服務定義了任務的屬性。服務有兩種模式:
replicated services 按照必定規則在各個工做節點上運行指定個數的任務。
global services 每一個工做節點上運行一個任務
兩種模式經過 docker service create 的 --mode 參數指定。
來自 Docker 官網的這張圖片形象的展現了容器、任務、服務的關係。
建立一個包含一個管理節點和兩個工做節點的最小 Swarm 集羣。
咱們準備把test01機器看成集羣的管理節點,首先在test01上使用 docker swarm init 初始化一個 Swarm 集羣。
$ docker swarm init --advertise-addr 192.*.*.*
而後輸入如下內容
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.To add a worker to this swarm, run the following command:
docker swarm join \ --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743o
jnwacrr2e7c \ 192.*.*.*:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the i
nstructions.複製代碼
執行 docker swarm init 命令的節點自動成爲管理節點。
上一步咱們初始化了一個 Swarm 集羣,擁有了一個管理節點,下面咱們繼續分別在test02,test03兩個 Docker 主機做爲工做節點,並加入到集羣中。
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743o jnwacrr2e7c \
192.168.99.100:2377複製代碼
查看集羣
通過上邊的兩步,咱們已經擁有了一個最小的 Swarm 集羣,包含一個管理節點和兩個工做節 點。
使用 docker node ls 查看集羣。
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
03g1y59jwfg7cf99w4lt0f662 worker2 Ready Active
9j68exjopxe7wfl6yuxml7a7j worker1 Ready Active
dxn1zf6l61qsb1josjja83ngz * manager Ready Active Leader複製代碼
若是沒有須要使用私有鏡像倉庫的需求,能夠忽略此步驟。
前面講到我這邊有3臺機器,此次我準備把鏡像安裝在test03機器上,執行如下命令,會啓動一個registry容器,該容器用於提供私有倉庫的服務
docker run --name docker-registry -d -p 5000:5000 registry
複製代碼
{"repositories":[]}
複製代碼
此時鏡像倉庫已經安裝完成,不過若是在其它機器test01,test02機器上進行把鏡像往私服上推的時候就會提示https的錯誤,由於正常狀況下,應用服務器推送鏡像到倉庫用的是https,此處咱們經過命令行來測試推送用的是普通的http,因此須要修改docker的啓動參數,使之容許以http協議工做;
而後此時你在網上搜鏡像倉庫支持http協議會搜出不少種解決方式,大多數都是講先改/etc/default/docker文件,增長一行
DOCKER_OPTS="--secure-registry 192.*.*.*:5000"
複製代碼
而後再修改/lib/systemd/system/docker.service文件,增長
EnvironmentFile=-/etc/default/docker
ExecStart=/usr/bin/dockerd -H複製代碼
通過測試,這種方法沒有用,具體緣由應該和docker版本有關係。
後找到另外一種方法,在test01,test02上修改/etc/docker/daemon.json文件,增長
"insecure-registries":["10.*.*.206:5000"]複製代碼
而後執行下面的命令重啓docker服務生效配置
systemctl daemon-reload;service docker restart
複製代碼
執行命令docker pull tomcat,從docker hub上下載最新版本的tomcat鏡像,下載以後用命令docker images找到該鏡像的id;而後執行下面命令給該鏡像添加一個帶私有倉庫ip的TAG:
docker tag 3dcfe809147d 192.168.119.148:5000/tomcat
複製代碼
再執行docker images查看鏡像的信息,會出現一個新的鏡像,REPOSITORY是10.*.*.*:5000/tomcat
而後執行下面命令推送鏡像:
docker push 10.*.*.*:5000/tomcat
複製代碼
推送成功以後,再返回到test03(鏡像私服機器)執行curl -X GET http://127.0.0.1:5000/v2/_catalog,看能不能看到剛纔推送上來的鏡像,若是能看到就表明整個docker鏡像私服就安裝配置完成。
Rancher是一個開源的企業級容器管理平臺,這裏就先很少作介紹,官網地https://www.cnrancher.com/
安裝方式:官網有個快速入門文檔,安裝起來也比較簡單,參考地址https://www.cnrancher.com/docs/rancher/v2.x/cn/overview/quick-start-guide/。
照着這個文檔安裝,執行到第4步登陸rancher就能夠。我這邊在test01機器上安裝的rancher,版本是v1.6.22,而後test01機器端口只放開了80端口,而後就在test01的nginx上配置了代理,域名是http://rancher.ngmm001.com
下面主要講下rancher配置的步驟:
訪問http://rancher.ngmm001.com,登陸進來以後找到環境管理,點擊添加環境:
環境模版選擇Swarm,而後點擊建立。
環境建立號以後,切換到剛纔的環境,而後找到基礎架構--->主機--->添加主機
而後把下面生成出來的腳本拷出來,這裏有個前提,由於我這邊rancher安裝的機器只開放了80端口,而後經過nginx作的代理,域名是http://rancher.ngmm001.com,而後它本身生成出來的腳本是經過ip加端口,因此就對了這段腳本作了修改,修改以下(加黑部分爲修改地方):
sudo docker run --rm --privileged --add-host rancher.ngmm001.com:10.171.173.20 -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher rancher/agent:v1.2.11 http://rancher.ngmm001.com/v1/scripts/783A8F43B494C806F646:1514678400000:XosZa0a4FVTAwaS0WdRTV52i7U
而後把這個腳本,分別在須要test02,test03機器上執行,執行成功以後就能夠在主機列表中看到對應的機器,以及機器運行的一些狀況監控,和docker容器的狀態
這一步成功以後,環境搭建這部就算完成了80%,後面的幾篇文章會持續更新安裝jenkins,和以及怎麼把spring boot項目部署在這套環境中