寫給後端的Docker初級入門教程:實現高效率自動化部署

在上一篇文章面向後端的Docker初級入門教程:DockerFile 命令詳解 中,咱們比較詳細的講解了docker鏡像構建腳本DockerFile的使用和命令,DockerFile的出現讓構建Docker鏡像的過程更加直觀和高效,可是,和我以前大多數文章中所提到的那句疑問同樣。python

難道這些就是所有嗎?mysql

固然不是linux

本篇文章是Docker初級入門教程的第五篇,在前四篇,基礎篇 概念篇 實戰篇 以及DockerFile那篇,咱們從Docker是什麼,到使用DockerFile構建本身的鏡像,一步一步走來,我相信完整看完這些教程的人已經對Docker有了一個比較好的瞭解,並能夠處理一部分現實中遇到的實際問題,可是仍然還有許多問題有着更好的解決方式,本篇文章呢,我將爲你們介紹一個docker自動化部署神器,docker-compose,它可使咱們將傳統的那些繁瑣的docker操做指令作到自動化完成,並能夠控制多個容器,實現多個容器的批量啓動。git

不說廢話,直接看東西。github

docker-compose解決了什麼樣的問題?

若是你們以前瞭解過微服務架構的話,對docker-compose的自動化部署絕對是相見恨晚,這裏簡單提一下,微服務架構就是將傳統的單一服務拆分紅多個單一的小服務,從而實現了應用的橫向擴展,就拿一個大的電商平臺爲例,微服務就是將以前一個巨大的單體應用拆分紅多個服務,好比倉庫系統單獨出來做爲一個服務,訂單系統單獨做爲一個應用提供服務,這樣帶來的好處是咱們不須要像傳統的方式那樣升級整個服務器,而只須要根據特定業務的壓力狀況升級對應的服務器就好,好比雙十一訂單系統壓力比較大,我單獨把訂單系統的服務器升級了就好,而不須要升級整套系統的硬件配置。redis

可是因爲微服務各個服務間存在必定的依賴關係,好比SpringCloud裏面,Eureka做爲註冊中心,就是要先啓動的,要否則後面的服務啓動的時候鏈接不上註冊中心,註冊不上去可還行,而微服務落地到Docker中,大概就是下面這麼個啓動過程,運維人員須要依次輸入不少命令來確保各個服務按照正確的順序啓動:sql

docker run -d 服務A
docker run -d 服務B,必須在A以後啓動
複製代碼

要是隻有兩個服務還好說,若是十個八個咬咬牙也能接受,可是幾十個,幾百個服務呢?按照順序啓動的話,萬一哪一個沒整好,換來的就是運維人員的一句我操。簡直就是災難,因而docker-compose應運而生了,docker-compose和DockerFile有着殊途同歸之妙,只不過DockerFile是將鏡像的構建過程給封裝到了腳本里,而docker-compose則是能夠將鏡像的運行過程封裝到了特定的腳本里,這就意味這咱們能夠把各個容器的啓動順序整理好,寫到腳本里,運維工程師每次只須要運行這個腳本就好了,徹底不用依次執行run 命令啓動容器了。docker

爲何Docker-Compose被稱做大殺器,是由於它真的解決了痛點,知識點吶,朋友們,要考的。shell

docker-compose 安裝:

關於docker-compose安裝這塊,網上仍然有着很是多的教程,可是無一例外三個字,太麻煩,本次依然延續傳統,只說最簡單的那一種,首先確保電腦上安裝了python3 和 docker後端

不用yum?

答:此次先不用,pip安裝更好用

爲啥不用python2 ? 愛python2用戶表示強烈譴責

答:我用pip2裝了一下,死活裝不上,pip3 一會兒就行了,因此我推薦pip3.

注:不會裝python3 的朋友,算了,我也順便寫上去吧。另外,確保你的服務器已經裝好了docker。

打開linux終端,輸入如下命令:

##安裝python3
yum install python3

#pip方式安裝docker-compose,pip會自動尋找和你主機上docker版本相匹配的docker-compose版本
pip3 install docker-compose 
複製代碼

查看是否安裝成功,在終端輸入:

docker-compose version
複製代碼

若是顯示出版本的話,則表明docker-compose在咱們這臺機器上已經算是按照成功了。對了,個人版本是1.24.1。

docker-compose 實戰:

首先新建一個文件夾,不建也行,防止一會找不到本身把yml文件放哪了,對了,docker-compose的腳本格式是yaml文件格式,不瞭解的朋友能夠下去補補,默認文件名是docker-compose.yml或者docker-compose.yaml

在新建的文件夾裏新建一個docker-compose.yml文件,輸入如下內容,這裏咱們仍然以tomcat爲例:

mytomcat:
 image: tomcat
 ports:
 - "8086:8080"
複製代碼

而後咱們在當前目錄(記得必定要是docker-compose.yml文件所在的目錄哦,docker-compose默認是從當前目錄搜索的) 輸入:

docker-compose up ##根據yml文件啓動容器
複製代碼

而後,屏幕冒出來一大堆tomcat的日誌輸出,ctrl+c退出的話整個容器都退出了,這是由於默認的docker-compose up命令是前臺啓動的,容器內的日誌輸出都會在前臺輸出,相似於docker run -it

若是想要容器從後臺啓動,只須要在後面加一個 -d 就好了,以下:

docker-compose up -d
複製代碼

若是啓動成功,會顯示

[root@iZbp1d7upppth01hp demo]# docker-compose up -d
Starting demo_mytomcat_1 ... done
複製代碼

此時再執行docker ps,會發現咱們的tomcat已經正常啓動了,名字是demo_mytomcat_1 ,分別對應文件夾,容器名,以及編號,若是再啓動一次,新的tomcat容器名字就會變成demo_mytomcat_2

docker-compose構建腳本詳解:

既然容器已經運行成功了,那麼接下來咱們便深刻了解一下docker-compose.yml 文件應該遵循的格式是如何的。

首先第一層:

  • mytomcat :咱們聲明構建的容器的名稱,一個yaml文件能夠定義多個容器。

而後是:

  • image :咱們構建的鏡像來源,這裏是tomcat鏡像,若是須要指定版本,能夠寫成tomcat:8 這種格式

    這個時候有人可能要問了,我若是想用我本身定義的鏡像怎麼辦?一樣是能夠的,只須要寫成以下這種格式便可:

    mytomcat:
     bulid: . #若是是 . docker-compose 便會在當前目錄找DockerFile 文件,執行構建鏡像而後啓動,鏡像名字是 當前目錄_mytomcat
     ports:
     - "8086:8080"
    複製代碼
  • ports: 至關於docker run 的 -p 參數,用來映射端口。列出端口的時候能夠不帶引號,可是像遇到56:56這種狀況的時候,YAML會把它解析爲60爲基數的六十進制數字,因此強烈建議你們在寫的時候加上引號。

就這麼點?沒了?不是,一樣咱們能夠在yml腳本里面執行諸如設置環境變量,容器卷,連接,命令等操做。

  • environment:至關於docker run 命令的 -e 參數,用來設置環境變量。

  • volumes:至關於docker rum 命令的 -v 參數,用於配置數據卷,用法以下:

    mytomcat:
     image: tomcat
     ports:
     - "8086:8080"
     volumes: 
     - ./data:/data #把當前目錄下的data文件夾掛載到容器內的data文件夾中
    複製代碼
  • **links:**至關於docker run 命令中的 --link 參數,用來連接兩個容器,links支持連接多個容器,用法以下:

    mytomcat:
     image: tomcat
     ports:
     - "8086:8080"
     links:
     -redis #連接到redis容器
     -mysql #連接到mysql容器,若是隻須要連接一個容器,刪掉一個就好了
     volumes: 
     - ./data:/data #把當前目錄下的data文件夾掛載到容器內的data文件夾中
    複製代碼
  • command: 使用 command 能夠覆蓋容器啓動後默認執行的命令。

  • container_name: 若是不想使用默認生成的 <項目名稱><服務名稱><序號> 格式名稱,可使用container_name選項來自定義容器名稱。

等,固然,docker-compose支持的命令確定不止這幾個,可是上面這幾個命令無一例外是咱們常常會用的,至於其餘的好比日誌什麼的,我這裏就不一一列舉了,須要的時候去網上搜索就能夠了。

前面有提到過,一個yml腳本是能夠同時定義多個容器的,若是須要定義多個容器,直接另起一行寫就好了,不過,必定要注意yaml文件自己的縮進格式

mytomcat01:
    image: tomcat
    ports:
       - "8086:8080"
       
mytomcat02:
    image: tomcat
    ports:
       - "8087:8080"
複製代碼

固然,這個時候可能有人還有一個疑問,yml文件必需要是docker-compose.yml這個名字嗎,我要是想用另一個名字好比 xswl.yml 怎麼辦,固然是能夠的,只須要加上 -f 選項 而後指定 yml文件的路徑就能夠了。

docker-compose -f xswl.yml up -d
複製代碼

docker-compose命令:

到這裏,咱們的構建腳本常見的命令已經說的差很少了,固然,包括yml文件,這些都是針對docker 容器來進行操做的,而docker-compose這個軟件如docker同樣自己也提供了不少的命令供咱們使用:

  • up: 啓動全部在compose文件中定義的容器,而且把它們的日誌信息聚集到一塊兒,一般搭配 -d 使用
  • ps: 獲取由Compose管理的容器的狀態信息。
  • run: 啓動一個容器,並容許一個一次性的命令,被連接的容器會同時啓動。
  • bulid: 從新建造由DockerFile所構建的鏡像,除非鏡像不存在,不然up命令不會執行構建已經存在的鏡像的命令,經常在須要更新鏡像時使用build這個命令。
  • logs :聚集由Compose管理的容器產生的日誌信息,並以彩色輸出。
  • stop: 中止容器。
  • rm: 刪除已經中止的容器,記得不要忘了加上 -v 來刪除任何由Docker管理的數據卷。

若是說我忽然不想用docker-compose這個軟件了,能夠執行

docker-compose stop #中止docker-compose
複製代碼

若是說我又忽然想用了,能夠執行:

docker-compose start 或者 docker-compose up #重啓相同的容器
複製代碼

至於更加細緻入微的騷操做,你們能夠去docker官網參觀學習,那麼多命令,我實在是寫不完(沒時間寫,並且有的命令我也沒見過)

下面開始技術總結:

本篇文章呢,咱們經過使用docker-compose實現了docker容器的高效自動化部署,同時對相關經常使用命令作了簡單的解釋,不得不說,docker-compose仍是有點香的,並且以後的教程勢必會用到docker-compose會愈來愈多,仍是但願你們好好看看這篇文章的,由於一個一個啓動實在是太慢了,並且因爲我用的是學生服務器,全部不少牛X的容器我壓根啓動不起來,這個也沒有辦法演示了,下一篇文章呢,我將帶你們一步一步使用ELK構建一個日誌中心。

最後,很是感謝閱讀本篇文章的小夥伴們,可以幫助到大家對於我來講是一件很是開心的事兒,若是有什麼疑問或者批評歡迎留言到本篇文章下方,有時間的話我會一一回復。

韓數的學習筆記目前已經悉數開源至github,必定要點個star啊啊啊啊啊啊啊

萬水千山老是情,給個star行不行

韓數的開發筆記

歡迎點贊,關注我,有你好果子吃(滑稽)

相關文章
相關標籤/搜索