安裝docker並運行docker swarm模式

概要

docker 1.12版本最大的改變在於集成了docker swarm,在docker engine下提供了 swarm 模式,這裏主要說一下docker swarm。
docker engine自己只提供了容器技術,沒有解決集羣環境下的容器編排和通訊。docker swarm是一個容器編排管理工具,docker-engine在1.12版本以後集成了docker swarm,不須要再單獨安裝。
docker swarm的功能,舉個例子,有3臺機器都安裝了docker環境,稱爲3臺docker節點。那麼如何管理這3臺docker節點,並把容器以相似於負載均衡的模式分別部署到這3臺節點上,並讓這些分佈在不一樣節點上的容器之間互相通訊呢。這時候須要用到容器編排工具,經常使用的編排工具備Google開源的kubernetes、apache的mesos、docker公司的swarm。
kubernetes做爲Google開源的工具,已經在Google的生產環境運行了多年,功能豐富而且穩定可靠,目前有不少公司都在使用。docker在1.12版本以後內置了swarm模式,把容器編排以核心組件的模式集成到了docker engine中,並借鑑了kubernetes的成功經驗。node

安裝docker

以centos7爲例,這裏附上官網的安裝文檔,docker官網實在太慢了。
使用yum安裝mysql

  1. 更新yum源,sudo yum update
  2. 添加docker的yum倉庫
sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
    ```
3. 安裝docker-engine,`sudo yum install docker-engine`
4. 啓動docker守護進程,`sudo systemctl start docker`  

docker的安裝到這裏就結束了,下邊說一下在公司內網環境經過代理安裝docker須要注意的問題。  
1. 首先讓機器能經過代理上網  
修改/etc/profile,增長`export http_proxy=代理用戶名:密碼@代理地址:端口`  
使修改生效,`source /etc/profile`
2. 配置yum使用代理  
`vim /etc/yum.conf` 增長`proxy=http://代理用戶名:密碼@代理地址:端口`  

通過這兩步以後,就能夠在內網經過代理安裝docker了。
### 配置docker ###
打開docker遠程管理端口2375,並配置docker hub國內倉庫。  
1. 新建docker配置文件  
`vim /etc/sysconfig/docker`  
增長  
`DOCKER_OPTS="-H unix:///var/run/docker.sock -H 0.0.0.0:2375 --registry-mirror=國內倉庫地址"`  
若是須要經過代理訪問還須要增長  
`HTTP_PROXY=http://代理用戶名:密碼@代理地址:端口`  
2. 啓動docker守護進程時加載配置文件  
`vim /lib/systemd/system/docker.servic`  
修改ExecStart配置爲  
`ExecStart=/usr/bin/dockerd $DOCKER_OPTS`  
在[Service]中增長配置文件路徑的配置  
`EnvironmentFile=-/etc/sysconfig/docker `  
把配置文件加載路徑指定到第一步建立的配置文件/etc/sysconfig/docker  
3. 重啓docker守護進程  
`sudo systemctl stop docker`  
`sudo systemctl start docker`
4. 檢查配置是否生效  
`ps -ef|grep docker`  
若是配置生效,會在dockerd進程後邊加上剛纔配置的參數。  

### 啓動swarm模式 ###
只須要在一個docker節點上初始化swarm集羣, 其餘節點加入這個集羣就好了。  
選擇一臺docker節點做爲swarm模式的leader,運行  
`docker swarm init --advertise-addr 主機ip`  
按照提示信息在其餘節點上執行命令加入swarm集羣  
在leader節點上執行`docker node ls` 查看節點信息  

### 建立集羣網絡 ###
1. 在swarm集羣中的任意一個節點上運行  
`docker network ls` 查看當前網絡情況  
scope爲**local**的網絡只能做用於本機,下邊建立swarm集羣使用的網絡。  
2. 運行 `docker network create --driver overlay my-network`  
建立一個名爲**my-network**的集羣網絡  
再次運行 `docker network ls`,能夠看到剛纔建立的**my-network** ,scope爲**swarm**,這個網絡能夠用於swarm模式,並讓多個節點上的容器能夠互通。  
在swarm中建立service時能夠經過 `--network 網絡名稱` 指定使用的網絡。多個service若是使用同一個scope爲swarm的network,能夠經過service的名稱互相通訊。

### docker swarm簡單使用 ###
下邊簡單介紹docker swarm的使用,有興趣的能夠查看docker官方文檔進行深刻了解。  
**下邊的命令所有是在swarm的leader節點運行!!**  
`docker service create --replicas 1 --name tomcat --publish 9090:8080 tomcat:latest`  
這裏建立了一個名爲**tomcat** 的service,swarm把容器封裝爲service,相似於kubernates中的pod,一個service是一個可供swarm調度的容器組合。  
這裏的**--replicas 1**指定了service的副本數。  
**--publish 9090:8080**把容器中的8080端口發佈到宿主機的9090端口

運行 `docker service ls` 查看當前的服務列表,能夠看到有一個名爲tomcat的服務。  
運行 `docker service ps tomcat` 能夠看到tomcat服務運行在哪一個swarm節點,以及當前運行的狀態。  

切換到tomcat服務運行的節點,運行 `docker ps` 能夠看到容器的ID,以及端口映射的狀況。  
運行 `docker logs -f 容器ID` 查看tomcat運行日誌。  

tomcat啓動成功後,能夠在瀏覽器中訪問tomcat主頁,地址是docker節點的ip(隨便哪個節點均可以),**端口是9090**,是在建立服務時指定的publish。 

上邊已經成功運行了一個tomcat服務,這裏對這個服務進行擴展部署。  
運行 `docker service scale tomcat=2` 把tomcat服務擴展爲兩個實例。  
運行 `docker service ls` 能夠看到tomcat服務的replicas變成了**1/2**,第二個實例啓動成功以後會變爲**2/2**。  
運行 `docker service ps tomcat` 查看兩個tomcat服務實例運行在哪一個docker節點,以及運行狀態。  

**swarm會自動在兩個service中作負載均衡**  

swarm還有一些其餘的命令,好比 `docker service rm service名稱` 刪除指定service,以及灰度發佈等,具體使用請參照官方文檔,這裏再也不細說。

### swarm模式下須要注意的問題 ###
swarm只會在docker節點之間調度容器,不會調度容器使用的掛載卷volume。在用swarm部署數據庫的容器時,須要注意數據文件的問題。或者加載了外部配置文件的容器,也須要注意配置文件的問題。  
一種簡單的解決方式,是讓這些容器每次都被調度到相同的docker節點上。須要在建立service時指定**--constraint** 參數,好比 **--constraint 'node.hostname==myhost'** ,這樣建立的service只會被調度到主機名爲**myhost**的docker節點。  
另外一種解決方式,使用docker volume插件,好比flocker。flocker能夠在容器調度的時候,連同volume一塊兒調度,這裏再也不細說,能夠參照flocker的官網文檔。

### 最後 ###
這裏只是對docker的安裝配置以及docker swarm的使用作了簡單介紹,想要有更深刻的瞭解,請參照官方文檔,官方文檔是學習的最好途徑。docker只是微服務架構的開篇,想要實踐微服務,docker必不可少。

後續會陸續推出基於docker部署的微服務架構,使用spring cloud作微服務解決方案,基於docker的mysql和mongodb的部署,基於docker的rabbitmq和activemq消息中間件的部署,以及基於docker部署的kafka、elk日誌收集統計等。
相關文章
相關標籤/搜索