概要
docker 1.12版本最大的改變在于集成了docker swarm,在docker engine下提供了 swarm 模式,這里主要說一下docker swarm。
docker engine本身只提供了容器技術,沒有解決集群環(huán)境下的容器編排和通信。docker swarm是一個容器編排管理工具,docker-engine在1.12版本之后集成了docker swarm,不需要再單獨安裝。
docker swarm的功能,舉個例子,有3臺機器都安裝了docker環(huán)境,稱為3臺docker節(jié)點。那么如何管理這3臺docker節(jié)點,并把容器以類似于負載均衡的模式分別部署到這3臺節(jié)點上,并讓這些分布在不同節(jié)點上的容器之間互相通信呢。這時候需要用到容器編排工具,常用的編排工具有Google開源的kubernetes、apache的mesos、docker公司的swarm。
kubernetes作為Google開源的工具,已經在Google的生產環(huán)境運行了多年,功能豐富并且穩(wěn)定可靠,目前有很多公司都在使用。docker在1.12版本之后內置了swarm模式,把容器編排以核心組件的模式集成到了docker engine中,并借鑒了kubernetes的成功經驗。
安裝docker
以centos7為例,這里附上官網的安裝文檔,docker官網實在太慢了。
使用yum安裝
- 更新yum源,
sudo yum update - 添加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的安裝到這里就結束了,下邊說一下在公司內網環(huán)境通過代理安裝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 `
把配置文件加載路徑指定到第一步創(chuàng)建的配置文件/etc/sysconfig/docker
3. 重啟docker守護進程
`sudo systemctl stop docker`
`sudo systemctl start docker`
4. 檢查配置是否生效
`ps -ef|grep docker`
如果配置生效,會在dockerd進程后邊加上剛才配置的參數。
### 啟動swarm模式 ###
只需要在一個docker節(jié)點上初始化swarm集群, 其他節(jié)點加入這個集群就行了。
選擇一臺docker節(jié)點作為swarm模式的leader,運行
`docker swarm init --advertise-addr 主機ip`
按照提示信息在其他節(jié)點上執(zhí)行命令加入swarm集群
在leader節(jié)點上執(zhí)行`docker node ls` 查看節(jié)點信息
### 創(chuàng)建集群網絡 ###
1. 在swarm集群中的任意一個節(jié)點上運行
`docker network ls` 查看當前網絡狀況
scope為**local**的網絡只能作用于本機,下邊創(chuàng)建swarm集群使用的網絡。
2. 運行 `docker network create --driver overlay my-network`
創(chuàng)建一個名為**my-network**的集群網絡
再次運行 `docker network ls`,可以看到剛才創(chuàng)建的**my-network** ,scope為**swarm**,這個網絡可以用于swarm模式,并讓多個節(jié)點上的容器可以互通。
在swarm中創(chuàng)建service時可以通過 `--network 網絡名稱` 指定使用的網絡。多個service如果使用同一個scope為swarm的network,可以通過service的名稱互相通信。
### docker swarm簡單使用 ###
下邊簡單介紹docker swarm的使用,有興趣的可以查看docker官方文檔進行深入了解。
**下邊的命令全部是在swarm的leader節(jié)點運行!!**
`docker service create --replicas 1 --name tomcat --publish 9090:8080 tomcat:latest`
這里創(chuàng)建了一個名為**tomcat** 的service,swarm把容器封裝為service,類似于kubernates中的pod,一個service是一個可供swarm調度的容器組合。
這里的**--replicas 1**指定了service的副本數。
**--publish 9090:8080**把容器中的8080端口發(fā)布到宿主機的9090端口
運行 `docker service ls` 查看當前的服務列表,可以看到有一個名為tomcat的服務。
運行 `docker service ps tomcat` 可以看到tomcat服務運行在哪個swarm節(jié)點,以及當前運行的狀態(tài)。
切換到tomcat服務運行的節(jié)點,運行 `docker ps` 可以看到容器的ID,以及端口映射的情況。
運行 `docker logs -f 容器ID` 查看tomcat運行日志。
tomcat啟動成功后,可以在瀏覽器中訪問tomcat主頁,地址是docker節(jié)點的ip(隨便哪一個節(jié)點都可以),**端口是9090**,是在創(chuàng)建服務時指定的publish。
上邊已經成功運行了一個tomcat服務,這里對這個服務進行擴展部署。
運行 `docker service scale tomcat=2` 把tomcat服務擴展為兩個實例。
運行 `docker service ls` 可以看到tomcat服務的replicas變成了**1/2**,第二個實例啟動成功之后會變?yōu)?*2/2**。
運行 `docker service ps tomcat` 查看兩個tomcat服務實例運行在哪個docker節(jié)點,以及運行狀態(tài)。
**swarm會自動在兩個service中做負載均衡**
swarm還有一些其他的命令,比如 `docker service rm service名稱` 刪除指定service,以及灰度發(fā)布等,具體使用請參照官方文檔,這里不再細說。
### swarm模式下需要注意的問題 ###
swarm只會在docker節(jié)點之間調度容器,不會調度容器使用的掛載卷volume。在用swarm部署數據庫的容器時,需要注意數據文件的問題?;蛘呒虞d了外部配置文件的容器,也需要注意配置文件的問題。
一種簡單的解決方式,是讓這些容器每次都被調度到相同的docker節(jié)點上。需要在創(chuàng)建service時指定**--constraint** 參數,比如 **--constraint 'node.hostname==myhost'** ,這樣創(chuàng)建的service只會被調度到主機名為**myhost**的docker節(jié)點。
另一種解決方式,使用docker volume插件,比如flocker。flocker可以在容器調度的時候,連同volume一起調度,這里不再細說,可以參照flocker的官網文檔。
### 最后 ###
這里只是對docker的安裝配置以及docker swarm的使用做了簡單介紹,想要有更深入的了解,請參照官方文檔,官方文檔是學習的最好途徑。docker只是微服務架構的開篇,想要實踐微服務,docker必不可少。
后續(xù)會陸續(xù)推出基于docker部署的微服務架構,使用spring cloud做微服務解決方案,基于docker的mysql和mongodb的部署,基于docker的rabbitmq和activemq消息中間件的部署,以及基于docker部署的kafka、elk日志收集統(tǒng)計等。