天天看點

Docker與Docker-compose

作者:魔法小木瓜
Docker與Docker-compose

docker

1. docker是什麼

  • Docker是使用Go語言實作的,基于Linux核心的cgroup,namespace,以及AUFS類的Union FS等技術,對程序進行封裝隔離,屬于作業系統層面的虛拟化技術。由于隔離的程序獨立于宿主和其它的隔離的程序,是以也稱其為容器。
  • Docker在容器的基礎上,進行了進一步的封裝,從檔案系統、網絡互聯到程序隔離等等,極大的簡化了容器的建立和維護。使得Docker技術比虛拟機技術更為輕便、快捷。Docker 将應用程式與該程式的依賴,打包在一個檔案裡面。運作這個檔案,就會生成一個虛拟容器。程式在這個虛拟容器裡運作,就好像在真實的實體機上運作一樣。有了Docker,就不用擔心環境問題了。Docker 容器其實就是拉取相應的鏡像并啟動它,可以了解成虛拟機,這個容器便是一個基于Linux的獨立的 “作業系統" 了。容器技術使用宿主作業系統的底層核心,比如Ubuntu的鏡像檔案僅包含必要的依賴,整體大小非常小。相對于完整的 Ubuntu系統鏡像的 2GB+ 的大小,Ubuntu 容器的鏡像檔案僅74MB。
  • 總體來說,Docker 的接口相當簡單,使用者可以友善地建立和使用容器,把自己的應用放入容器。容器還可以進行版本管理、複制、分享、修改,就像管理普通的代碼一樣。

2. 為什麼要用docker

  • 更高效地利用系統資源: 由于容器不需要進行硬體虛拟以及運作完整作業系統等額外開銷,Docker對系統資源的使用率更高。
  • 更快速地啟動時間: 傳統的虛拟機技術啟動應用服務往往需要數分鐘,而Docker容器應用,由于直接運作于宿主核心,無需啟動完整的作業系統,是以可以做到秒級、甚至毫秒級的啟動時間。大大的節約了開發、測試、部署的時間。
  • 一緻的運作環境: 開發過程中一個常見的問題是環境一緻性問題。由于開發環境、測試環境、生産環境不一緻,導緻有些 bug 并未在開發過程中被發現。而Docker的鏡像提供了除核心外完整的運作時環境,確定了應用運作環境一緻性,進而不會再出現 「這段代碼在我機器上沒問題啊」 這類問題。
  • 持續傳遞和部署: 對開發和運維(DevOps)人員來說,最希望的就是一次建立或配置,可以在任意地方正常運作。使用 Docker 可以通過定制應用鏡像來實作持續內建、持續傳遞、部署。開發人員可以通過 Dockerfile 來進行鏡像建構,并結合持續內建(Continuous Integration) 系統進行內建測試,而運維人員則可以直接在生産環境中快速部署該鏡像,甚至結合持續部署(Continuous Delivery/Deployment) 系統進行自動部署。而且使用 Dockerfile 使鏡像建構透明化,不僅僅開發團隊可以了解應用運作環境,也友善運維團隊了解應用運作所需條件,幫助更好的生産環境中部署該鏡像。
  • 更輕松地遷移:由于 Docker 確定了執行環境的一緻性,使得應用的遷移更加容易。Docker 可以在很多平台上運作,無論是實體機、虛拟機、公有雲、私有雲,甚至是筆記本,其運作結果是一緻的。是以使用者可以很輕易地将在一個平台上運作的應用,遷移到另一個平台上,而不用擔心運作環境的變化導緻應用無法正常運作的情況。
  • 更輕松的維護和擴充:Docker 使用的分層存儲以及鏡像的技術,使得應用重複部分的複用更為容易,也使得應用的維護更新更加簡單,基于基礎鏡像進一步擴充鏡像也變得非常簡單。此外,Docker 團隊同各個開源項目團隊一起維護了一大批高品質的 官方鏡像,既可以直接在生産環境使用,又可以作為基礎進一步定制,大大地降低了應用服務的鏡像制作成本。

3. docker基本概念

  • 鏡像(Image): 作業系統分為核心和使用者空間。對于Linux而言,核心啟動後,會挂載root檔案系統為其提供使用者空間支援。而Docker鏡像(Image),就相當于是一個root檔案系統。比如官方鏡像 ubuntu:18.04 就包含了完整的一套Ubuntu 18.04 最小系統的 root 檔案系統。Docker鏡像是一個特殊的檔案系統,除了提供容器運作時所需的程式、庫、資源、配置等檔案外,還包含了一些為運作時準備的一些配置參數(如匿名卷、環境變量、使用者等)。鏡像不包含任何動态資料,其内容在建構之後也不會被改變。
  • 容器(Container):鏡像( Image )和容器( Container )的關系,就像是面向對象程式設計中的類 和 執行個體 一樣,鏡像是靜态的定義,容器是鏡像運作時的實體。容器可以被建立、啟動、停止、删除、暫停等。容器的實質是程序,但與直接在宿主執行的程序不同,容器程序運作于屬于自己的獨立的 命名空間。是以容器可以擁有自己的 root 檔案系統、自己的網絡配置、自己的程序空間,甚至自己的使用者 ID 空間。容器内的程序是運作在一個隔離的環境裡,使用起來,就好像是在一個獨立于宿主的系統下操作一樣。這種特性使得容器封裝的應用比直接在宿主運作更加安全。
  • 倉庫(Repository): 鏡像建構完成後,可以很容易地在目前主控端上運作,但是,如果需要在其它伺服器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry 就是這樣的服務。Docker Registry 公開服務私有 Docker Registry:除了使用公開服務外,使用者還可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 鏡像,可以直接使用作為私有 Registry 服務。

4. Docker-compose

Compose是一個用于定義和運作多容器Docker應用程式的工具。使用Compose,您可以使用一個YAML檔案來配置應用程式的服務。然後,使用一個指令建立并啟動配置中的所有服務。

Docker與Docker-compose

docker-compose

4.1 差別與聯系

  • docker是自動化建構鏡像,并啟動鏡像。 docker compose是自動化編排容器。
  • docker是一個供開發和運維人員開發,測試,部署和運作應用的容器平台。這種用linux container部署應用的方式叫容器化。
  • docker-compose是一個用于運作和管理多個容器化應用的工具。
  • docker是基于Dockerfile得到images,啟動的時候是一個單獨的container。
  • docker-compose是基于docker-compose.yml,通常啟動的時候是一個服務,這個服務通常由多個container共同組成,并且端口,配置等由docker-compose定義好。
  • 兩者都需要安裝,但是要使用docker-compose,必須已經安裝docker。

4.2 docker-compose特點

  • 提供工具用于定義和運作多個docker容器應用
  • 使用yaml檔案來配置應用服務(docker-compse.yml)
  • 可以通過一個簡單的指令docker-compse up可以按照依賴關系啟動所有服務
  • 可以通過一個簡單的指令docker-compose down停止所有服務
  • 當一個服務需要的時候,可以很簡單地通過--scale進行擴容