上篇文章我們進行了Docker的快速入門,基本命令的講解,以及簡單的實戰,那么本篇我們就來實戰一個真實的項目,看看怎么在產線上來通過容器技術來運行我們的項目,來達到學會容器間通信以及docker-compose學習以及docker網絡模型學習的目的。
二、項目描述
-
創建Todo應用,功能很簡單,實現創建Task關聯Task分類,以及更新Task的完成狀態的功能。
-
項目運行后的主界面如下:
三、啟動項目
-
因為是使用git管理的maven java項目,所以需要首先在服務器上安裝java、maven、git 三大件
-
Git入門教程傳送門:談談分布式版本管理工具Git
-
接着把github上的項目源碼clone到本地
git clone https://github.com/hafizzhang/mysql-spring-boot-todo.git
-
進入到項目根目錄
cd mysql-spring-boot-todo
-
使用maven命令進行打包項目並且使用docker命令進行build鏡像
mvn clean package docker:build
-
用容器啟動mysql 5.6版本
docker run --name mysql -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=tododb -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -d mysql:5.6
-
查看mysql日志輸出,確保mysql服務啟動沒有問題
docker logs mysql (因為上步中我們已經指定了運行mysql容器的名稱為mysql,所以這里可以直接用容器名查看日志)
-
用容器啟動todo鏡像
docker run -p 8080:8080 --name todo -d hafiz/todo-demo:1.0.0
-
查看todo容器的日志,觀察容器是否啟動成功
docker logs todo
我們會發現出現了以下錯誤:
這就說明了,同一個主機上的各個容器之間是相互隔離的,也就是他們直接不能直接相互訪問,那我們怎么解決這個問題呢?最簡單的辦法我們可以直接在啟動容器的時候指定--link參數把該容器鏈接到mysql容器上(雖說這種方式已經官方已經不推薦,但是對於同一個主機的不同容器間的通信卻是最簡單的,后面會介紹別的方式實現),這樣我們的目標容器todo就可以跟mysql源容器進行通信了,來,說干就干
docker rm -f todo 首先刪除已經存在的容器todo docker run -p 8080:8080 --name todo --link mysql -d hafiz/todo-demo:1.0.0
再查看todo容器啟動的日志,發現可以成功啟動了,然后打開瀏覽器輸入主機ip:8080可以看到todo的運行主界面
-
我們在todo主界面上添加一條記錄,然后通過mysql容器進行查看已經添加的記錄,如下:
docker exec -t -i mysql bash 進入到mysql容器 mysql -uuser -ppass 用戶名為user,密碼為pass select category, IF(complete,'true','false') complete, name from todo_item;
可以看到我們保存的記錄已經進到mysql中了
四、使用link實現Docker容器間的通信的原理
todo項目和mysql項目的啟動后通信模型如下:
那我們上面已經通過link方式實現了todo容器可以訪問相同主機的mysql容器,那么這種方式如何實現的呢?
我們查看todo容器的/etc/hosts文件就會明白了,如下:
可以看出link的工作原理是在todo的hosts文件中寫入mysql容器的地址信息
使用容器連接的好處
-
運行在同一主機的獨立容器間可以相互通訊
-
容器間建立一個安全通訊隧道而不需要暴露容器的任何端口
五、使用Docker Compose管理多個容器
為什么需要使用Docker Compose管理多個容器
答:當多個容器相互之間需要通訊時,手動配置容器間連接變得非常復雜,而且官方也已經不推薦使用了。
什么是Docker Compose
-
Docker Compose是一個定義和管理多個Docker容器的工具
-
它通過YAML文件定義Docker應用運行時的信息,如:端口、網絡等。
-
使用Docker Compose,一個簡單命令可以管理多個容器應用。
Docker Compose使用場景
-
快速構建開發環境
-
自動化測試環境
-
單一主機部署多個容器
安裝Docker Compose
如何使用Docker Compose
-
定義構建各個鏡像所需的Dockerfile文件
-
定義docker-compose.yml文件
-
在docker-compose.yml和Dockerfile文件所在的目錄下,通過
docker-compose up [-d]
啟動docker-compose.yml 所定義的多個Docker應用
深入了解Docker Compose
-
幾個重要的Docker Compose命令
-
docker-compose up
啟動YAML中定義的所有容器 -
docker-compose ps [-a]
查看[所有的]運行的容器 -
docker-compose logs containerId/containerName
查看運行的容器的日志 -
docker-compose stop containerId/containerName
停止運行的容器 -
docker-compose rm containerId/containername
刪除已停止的容器 -
docker-compose build
重新創建所有的鏡像
-
-
Tips
-
docker-compose只有在Docker鏡像不存在的時候才創建鏡像
-
更新Dockerfile后一定要執行docker-compose build重新創建鏡像才能生效
-
六、Docker網絡模型
docker daemon啟動以后,會默認創建一個名稱為docker0的網橋,容器默認情況下是通過這個docker0網橋來和主機進行通信的。
docker網絡模型有以下幾種分類:
1. None網絡模型
-
實現了最大限度的網絡隔離
-
容器間不能通過網絡通訊提供服務或者提供網絡服務
-
盡管None網絡模型可以提供非常好的安全隔離,但其適用場景非常有限
2. Bridge網絡模型(默認)
-
Bridge網絡模型下默認有兩個網絡接口:loopback和eth0
-
同一主機上相同bridge網絡的所有容器可以相互間通信
-
同一主機上不同bridge網絡上所有容器間不能直接通訊
-
不同主機間bridge網絡的容器不能直接通訊
-
演示:
docker run --rm -d --net bridge --name c1 imageName:imageTag sleep 1000 docker run --rm -d --net bridge --name c2 imageName:imageTag sleep 1000 docker exec -ti c1 ping c2 ip 顯示網絡訪問成功
3. Host網絡模型(和主機共享網絡)
-
Host網絡安全性相對於其他網絡模型如:None、Bridge較低
-
Host網絡跟主機共享網絡棧
-
所有主機可見的網絡接口對以Host網絡模型運行的容器均可見
-
容器間網絡不具有隔離性
-
由於使用Host網絡容器的請求無需經過docker0和Iptable的處理,它提供非常好的性能
-
演示:
docker run --rm -d --net host --name c1 imageName:imageTag sleep 1000 docker exec -ti c1 ping 主機ip
4. Overlay網絡模型
-
支持多主機間容器直接通訊
-
Swarm模式下使用overlay網絡模型無需外部鍵值存儲系統
-
非Swarm模式下使用overlay網絡模型需要外部鍵值存儲系統,如Consul等
-
docker network ls
產看當前所有的docker網絡 -
docker network create [-d] network-name
創建指定驅動的網絡-
-d選項可選,用來指定創建網絡使用的驅動類型,但好像只能創建bridge驅動的網絡
-
-
docker network rm network-name
刪除自定義網絡 -
docker network inspect network-name
查看指定docker網絡的信息 -
docker network connect network-name containerId/containerName
把指定的容器鏈接到指定的網絡上
七、使用Docker Compose管理網絡
-
默認執行docker-compose時將創建新網絡
-
新網絡名字以docker-compose.yml當前所在目錄名字跟默認driver的組合,比如當前目錄為test,則docker-compose.yml不指定具體網絡的時候,創建的網絡名稱為:test_default
-
可以創建自定義的網絡,在docker-compose.yml中自定義networks,如下圖的標注1
-
指定service使用特定的網絡,如下圖的標注2
八、如何在產線運行容器化的服務
我們要想在產線去運行容器集群,那我們首先需要COE(Container Orchestration Engine)工具。
1. COE的主要功能如下:
-
主機配置(Provisioning)
-
容器編排
-
自我修復
-
Scale up/down 容器
-
暴露服務給外界
-
服務發現
2. COE工具:
-
Docker Swarm Mode
-
原生集成Docker Engine的集群管理
-
去中心化的設計
-
聲明式服務模型
-
Scale up/down 服務
-
支持多主機網絡
-
服務發現
-
負載均衡
-
安全性高
-
支持滾動升級
-
-
Kubernates
-
Mesos/Marathon
-
高可用
-
支持有狀態服務
-
支持多種容器引擎
-
服務發現和負載均衡
-
健康檢測
-
事件訂閱
-
豐富的API支持
-
容器調度約束
-
-
Hashicorp Nomad
-
簡單且輕量級
-
多雲支持
-
維護簡單
-
支持混合工作負載
-
高可用
-
支持多區域多數據中心
-
3. COE選擇的准則
-
抽象程度(Level of abstraction):支持混合還是只支持基於容器的工作負載(Hybrid Workloads)
-
工具鏈(Tooling):編排工具相關生態圈,工具的集成程度
-
架構(Architecture): 是否支持高可用、高穩定性以及災難恢復
4. 如何選擇COE工具
-
是否支持企業DevOps框架和編排
-
是否提供豐富的API
-
集群支持主機數量大小
-
容器運行在什么平台?物理機、私有雲還是公有雲?
-
是否具有自我修復功能
-
是否提供服務負載均衡
-
如何Provision容器
-
運維復雜性高低
-
是否支持混合工作負載
-
生態圈發展是否成熟
-
社區是否活躍
5. 監控及指標
常用監控工具
-
Sensu
-
Prometheus
-
Grafana
-
Influxdb
-
Telegraf
-
Zabbix
-
cAdvisor
-
Sysdig
6. 日志
-
EFK(Elasticsearch Fluentd Kibana)
-
ELK (Elasticsearch Logstash Kibana)
-
Graylog
九、總結
通過本文,我們就知道如何讓同一主機上的不同容器進行通訊,如何進行docker 網絡的管理,Docker的網絡模型都有哪幾種?如何在docker-compose.yml文件中自定義docker網絡,如何給其中定義的service指定使用自定義的網絡?如何在產線運行容器化服務?如何選擇COE工具?以及容器化以后我們要注意的地方。對於不同主機間的容器通訊,本文沒有設計,以后有機會,我們再來慢慢談起。