Docker三十分鐘快速入門(下)

1、背景

  上篇文章咱們進行了Docker的快速入門,基本命令的講解,以及簡單的實戰,那麼本篇咱們就來實戰一個真實的項目,看看怎麼在產線上來經過容器技術來運行咱們的項目,來達到學會容器間通訊以及docker-compose學習以及docker網絡模型學習的目的。html

2、項目描述

  • 建立Todo應用,功能很簡單,實現建立Task關聯Task分類,以及更新Task的完成狀態的功能。java

  • 項目運行後的主界面以下:mysql

    

3、啓動項目

  • 由於是使用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中了

4、使用link實現Docker容器間的通訊的原理

todo項目和mysql項目的啓動後通訊模型以下:

  

那咱們上面已經經過link方式實現了todo容器能夠訪問相同主機的mysql容器,那麼這種方式如何實現的呢?

咱們查看todo容器的/etc/hosts文件就會明白了,以下:

  

能夠看出link的工做原理是在todo的hosts文件中寫入mysql容器的地址信息

使用容器鏈接的好處

  • 運行在同一主機的獨立容器間能夠相互通信

  • 容器間創建一個安全通信隧道而不須要暴露容器的任何端口

5、使用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從新建立鏡像才能生效

6、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網絡管理命令

  • 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 把指定的容器連接到指定的網絡上

7、使用Docker Compose管理網絡

  • 默認執行docker-compose時將建立新網絡

  • 新網絡名字以docker-compose.yml當前所在目錄名字跟默認driver的組合,好比當前目錄爲test,則docker-compose.yml不指定具體網絡的時候,建立的網絡名稱爲:test_default

  • 能夠建立自定義的網絡,在docker-compose.yml中自定義networks,以下圖的標註1

  • 指定service使用特定的網絡,以下圖的標註2

    

8、如何在產線運行容器化的服務

咱們要想在產線去運行容器集羣,那咱們首先須要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

9、總結

  經過本文,咱們就知道如何讓同一主機上的不一樣容器進行通信,如何進行docker 網絡的管理,Docker的網絡模型都有哪幾種?如何在docker-compose.yml文件中自定義docker網絡,如何給其中定義的service指定使用自定義的網絡?如何在產線運行容器化服務?如何選擇COE工具?以及容器化之後咱們要注意的地方。對於不一樣主機間的容器通信,本文沒有設計,之後有機會,咱們再來慢慢談起。

相關文章
相關標籤/搜索