寫給後端的Docker初級入門教程:實現高效率自動化部署
在上一篇文章面向後端的Docker初級入門教程:DockerFile 命令詳解 中,我們比較詳細的講解了docker映象構建指令碼DockerFile的使用和命令,DockerFile的出現讓構建Docker映象的過程更加直觀和高效,但是,和我之前大多數文章中所提到的那句疑問一樣。
難道這些就是全部嗎?
當然不是
本篇文章是Docker初級入門教程的第五篇,在前四篇,基礎篇 概念篇 實戰篇 以及DockerFile那篇,我們從Docker是什麼,到使用DockerFile構建自己的映象,一步一步走來,我相信完整看完這些教程的人已經對Docker有了一個比較好的瞭解,並可以處理一部分現實中遇到的實際問題,但是仍然還有許多問題有著更好的解決方式,本篇文章呢,我將為大家介紹一個docker自動化部署神器,docker-compose,它可以使我們將傳統的那些繁瑣的docker操作指令做到自動化完成,並可以控制多個容器,實現多個容器的批量啟動。
不說廢話,直接看東西。
docker-compose解決了什麼樣的問題?
如果大家之前瞭解過微服務架構的話,對docker-compose的自動化部署絕對是相見恨晚,這裡簡單提一下,微服務架構就是將傳統的單一服務拆分成多個單一的小服務,從而實現了應用的橫向擴充套件,就拿一個大的電商平臺為例,微服務就是將之前一個巨大的單體應用拆分成多個服務,比如倉庫系統單獨出來作為一個服務,訂單系統單獨作為一個應用提供服務,這樣帶來的好處是我們不需要像傳統的方式那樣升級整個伺服器,而只需要根據特定業務的壓力情況升級對應的伺服器就好,比如雙十一訂單系統壓力比較大,我單獨把訂單系統的伺服器升級了就好,而不需要升級整套系統的硬體配置。
但是由於微服務各個服務間存在一定的依賴關係,比如SpringCloud裡面,Eureka作為註冊中心,就是要先啟動的,要不然後面的服務啟動的時候連線不上註冊中心,註冊不上去可還行,而微服務落地到Docker中,大概就是下面這麼個啟動過程,運維人員需要依次輸入很多命令來確保各個服務按照正確的順序啟動:
docker run -d 服務A
docker run -d 服務B,必須在A之後啟動
複製程式碼
要是隻有兩個服務還好說,如果十個八個咬咬牙也能接受,但是幾十個,幾百個服務呢?按照順序啟動的話,萬一哪個沒整好,換來的就是運維人員的一句我操。簡直就是災難,於是docker-compose應運而生了,docker-compose和DockerFile有著異曲同工之妙,只不過DockerFile是將映象的構建過程給封裝到了腳本里,而docker-compose則是可以將映象的執行過程封裝到了特定的腳本里,這就意味這我們可以把各個容器的啟動順序整理好,寫到腳本里,運維工程師每次只需要執行這個指令碼就行了,完全不用依次執行run 命令啟動容器了。
為什麼Docker-Compose被稱作大殺器,是因為它真的解決了痛點,知識點吶,朋友們,要考的。
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行不行
歡迎點贊,關注我,有你好果子吃(滑稽)