1. 程式人生 > >Docker三十分鐘快速入門(下)

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

confirm base 描述 源碼 load maven pass 監控工具 yml

一、背景

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

二、項目描述

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

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

    技術分享圖片

三、啟動項目

  • 因為是使用git管理的maven java項目,所以需要首先在服務器上安裝java、maven、git 三大件

  • JDK1.8的安裝教程傳送門:

  • Maven的安裝教程傳送門:

  • Git安裝直接使用以下命令:

    yum -y install git

    Git入門教程傳送門:http://www.cnblogs.com/hafiz/p/7472318.html

  • 接著把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

  • 官方的安裝方式

      sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
      sudo chmod +x /usr/local/bin/docker-compose 給docker-compose執行權限
      docker-compose --version 測試安裝是否成功,成功的話打印出docker-compose的版本信息

    這種方式貌似需要FQ能連接到外網

  • 使用python-pip進行安裝

    傳送門:https://www.cnblogs.com/YatHo/p/7815400.html

    如果在文中的第4步pip install -upgrade pip 和安裝docker-compose出現There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590) 錯誤,解決辦法如下:

      pip install -upgrade pip --trusted-host pypi.python.org
      pip install -U docker-compose --trusted-host pypi.python.org

    安裝完成以後可以使用docker-compose --version 來測試安裝是否成功

如何使用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網絡管理命令

  • 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工具?以及容器化以後我們要註意的地方。對於不同主機間的容器通訊,本文沒有設計,以後有機會,我們再來慢慢談起。

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