上篇文章咱們進行了Docker的快速入門,基本命令的講解,以及簡單的實戰,那麼本篇咱們就來實戰一個真實的項目,看看怎麼在產線上來經過容器技術來運行咱們的項目,來達到學會容器間通訊以及docker-compose學習以及docker網絡模型學習的目的。html
建立Todo應用,功能很簡單,實現建立Task關聯Task分類,以及更新Task的完成狀態的功能。java
項目運行後的主界面以下:mysql
由於是使用git管理的maven java項目,因此須要首先在服務器上安裝java、maven、git 三大件git
傳送門:Centos7下Java開發基本環境搭建github
Git入門教程傳送門:談談分佈式版本管理工具Gitspring
接着把github上的項目源碼clone到本地sql
git clone https://github.com/hafizzhang/mysql-spring-boot-todo.git
進入到項目根目錄docker
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中了
todo項目和mysql項目的啓動後通訊模型以下:
那咱們上面已經經過link方式實現了todo容器能夠訪問相同主機的mysql容器,那麼這種方式如何實現的呢?
咱們查看todo容器的/etc/hosts文件就會明白了,以下:
能夠看出link的工做原理是在todo的hosts文件中寫入mysql容器的地址信息
使用容器鏈接的好處
運行在同一主機的獨立容器間能夠相互通信
容器間創建一個安全通信隧道而不須要暴露容器的任何端口
爲何須要使用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 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網絡管理命令
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.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工具?以及容器化之後咱們要注意的地方。對於不一樣主機間的容器通信,本文沒有設計,之後有機會,咱們再來慢慢談起。