Docker教程:Docker Compose入門

2022-01-31 雲技術


了解如何使用Docker的本地服務配置和部署工具來測試和調試多容器應用程式。

容器意味著在現代軟體堆棧中提供組件隔離。 將資料庫放在一個容器中,將Web應用程式放在另一個容器中,並且可以將它們全部縮放,管理,重新啟動並獨立換出。 但是開發和測試一個多容器應用程式並不像一次使用一個容器。

Docker Compose由Docker創建,用於簡化開發和測試多容器應用程式的過程。 這是一個令人想起Docker客戶端的命令行工具,它接收一個特殊格式的描述符文件,將應用程式從多個容器中組裝出來,並在單個主機上一起運行。 (Docker Swarm或Kubernetes等工具在多臺主機上部署多容器應用程式。)

在本教程中,我們將逐步介紹定義和部署一個簡單的多容器Web服務應用程式所需的步驟。 雖然Docker Compose通常用於開發和測試,但它也可用於部署生產應用程式。 為了討論這個問題,我們將專注於開發和測試場景。

Docker Compose示例

最小的Docker Compose應用程式由三個組件組成:

1. 要構建的每個容器鏡像的Dockerfile。

2. Docker Compose將用於從這些鏡像啟動容器並配置其服務的YAML文件docker-compose.yml。

3. 構成應用程式本身的文件。

在我們的示例中,我們將創建一個測試Web消息系統,使用Bottle web框架以Python編寫,並配置為將數據存儲在Redis中。 如果在生產應用程式中使用,這將是可怕的不安全和不切實際(更不用說動力不足!)。 但關鍵是要展示這些作品是如何融合在一起的,並為你提供一個可以自己進一步充實的骨架。

要一次獲得所有部分,請下載並將此docker-compose-example.zip(http://www.infoworld.com/cms/mediaResource/asset?id=156685)文件解壓縮到工作目錄中。 將需要安裝最新版本的Docker; 我使用了17.12.01版本,這是當時最新的穩定版本。 請注意,本教程應該適用於Docker for Windows,Docker for Mac以及Docker的傳統Linux版本。

包中包含的Dockerfile非常簡單:

FROM python:3
ENV PYTHONBUFFERED 1
ADD . /code
ADD requirements.txt /code/
WORKDIR /code
RUN pip install -r requirements.txt
CMD python app.py

這組命令描述了一個使用stock python:3鏡像作為其基礎的鏡像,並使用兩個文件(都包含在.zip包中):requirements.txt和app.py. 前者被Python用來描述應用程式的依賴關係; 後者是Python應用程式本身。

docker-compose.yml文件的元素值得仔細檢查:

version: 『3』

services:

 redis:

   image: redis

 web:

   build: .

   command: python3 app.py

   volumes:

     - .:/code

   ports:

     - 「8000:8000」

   depends_on:

     - redis

version行指定要使用的Docker Compose文件格式的版本。 Docker Compose經過了多次修訂,每次修訂都與特定版本的Docker引擎相關聯; 版本3是本文的最新版本。

services部分定義了此特定容器堆棧使用的各種服務。 在這裡,我們定義了兩個服務:redis(使用redis容器映像運行Redis服務)和web(我們的Python應用程式)。 每個服務描述符都提供有關服務的詳細信息:

1. build:描述構建時應用的配置。它可以只是一個路徑名,如這裡所示,或者它可以提供諸如Dockerfile之類的細節(而不是目錄中的默認Dockerfile)或參數在構建過程中傳遞給Dockerfile。

2. command:啟動容器時運行的命令。這將覆蓋容器的Dockerfile中提供的CMD語句(如果有的話)。

3. volumes:要為此服務裝入的卷的任何路徑。您還可以將卷指定為頂級配置選項,並在docker-compose.yml文件中重複使用跨多個容器定義的卷。

4. ports:容器的埠映射。您可以使用如此處所示的簡單格式,或更詳細的描述使用哪種協議的格式。

5. depends_on:描述服務之間的依賴關係的順序。在這裡,因為Web依賴於Redis,所以當Docker Compose啟動應用程式時,必須首先調用Redis。

服務中還有更多可用的選項,但這幾個足以讓一個基本項目開始。

基本的Docker Compose命令

將示例應用程式解壓到工作目錄後,下一步就是構建它並使其作為單個基本實例運行。 通過這個過程,我們可以了解Docker Compose的大部分主要命令,並了解它們在項目上下文中的使用方式。

請注意,所有這些命令都從包含docker-compose.yml文件的目錄以及該項目的其他文件運行。

docker-compose build

第一個使用新的Compose項目運行的命令build,根據項目的Dockerfile為需要從頭開始構建的項目組裝任何圖像。 在這種情況下,依賴於圖像的項目的任何部分(Redis)都不在此處處理。

構建過程的結果會回傳給控制臺。 如果一切順利,你應該在鍵入時在本地鏡像列表中看到新鏡像:

為我們的示例應用程式成功運行docker-compose構建的輸出。 請注意Dockerfile中的每個步驟是如何詳細記錄的。

docker-compose up

up命令設置網絡並從堆棧中的所有映像啟動容器,如docker-compose.yml文件中所述。 請注意,如果需要本地不存在的鏡像,則會在此階段停用。

容器運行後,將看到正在運行的容器的詳細信息回傳到控制臺。 控制臺仍然連接到容器,因此您可以通過按Ctrl-C來停止正在運行的應用程式堆棧。

應用程式啟動完成後,將Web瀏覽器指向http:// localhost:8000。 將看到一個原始消息應用程式的網頁,允許您為三個人(David,Krista和Adi)中的任何一個人留言並閱讀發送給他們的消息。 Web前端由Python腳本提供; 數據在Redis中被保存為簡單的鍵值對。

docker-compose down

down命令取消用於運行應用程式的容器和網絡組件。 運行docker-compose之後按Ctrl-C可終止所有運行的實例,但不執行任何清理。 當您希望停止並刪除通過運行創建的網絡,卷和映像時(例如,在一天的測試會話結束時,或者清除桌面以使用新應用程式時),可以使用它。

docker-compose up --no-start

如果你想設置一個Docker Compose應用程式,但你不想啟動它(例如,如果你想以非交互方式運行它)使用--no-start而不是剛剛啟動。 最初,Docker Compose有一個叫做create的命令來執行這個功能,但它已經被棄用了,以支持使用--no-start標誌。

docker-compose up --scale

如果你想在啟動應用程式時啟動多個服務副本,則可以使用deploy在Docker Compose文件中聲明它,或者在運行Compose時使用--scale開關。 我們的應用程式不需要此功能,但當你需要測試運行多個服務實例的應用程式的行為時,--scale開關可派上用場。

docker-compose start/restart/stop/pause/unpause

啟動,重新啟動和停止命令允許啟動,重新啟動或停止已使用up -–no --start命令準備好的Docker Compose應用程式。 在執行時,他們立即將控制臺的控制權交還給用戶,而不是將控制臺附加到容器上。 暫停和取消暫停命令允許您暫停和繼續執行容器,而不是完全停止或重新啟動它們。

額外的Docker Compose命令

其他一些Docker Compose命令對調試或監視正在運行的應用程式很有用:

• config:驗證並轉儲用於當前項目的Docker Compose文件。 這會讓你在嘗試構建或部署過程之前清除它包含的任何可能的錯誤。

• events:流式傳輸到項目中每個容器的控制臺事件。 使用--json標誌將結果列印為JSON(對於ad hoc管道到文件中很有用)。

• port:在正在運行的服務實例上列印埠綁定的公共埠。 如果您需要發現連接哪個埠以獲取服務,這很有用。

最後,許多其他命令(如exec,images,logs,kill,rm,ps,pull,push和top)都會與你在Docker主客戶端中找到的相同功能相呼應。

Docker Compose和分布式應用程式包

一旦你創建了使用Docker Compose創建的多容器應用程式,下一步就將投入生產。正如Dockerfile可以內置到映像中以創建容器一樣,Docker Compose文件可以內置到映像中以創建整個應用程式堆棧。

Docker的最新版本引入了分布式應用程式包或DAB的概念。這個特性仍然被認為是實驗性的,可以讓你從Docker Compose文件創建一個DAB,該文件可以作為分布式多容器應用程式部署到Docker Swarm集群。

要生成DAB,首先將創建的容器圖像推送到註冊表,以便稍後可由任何運行應用程式的系統獲取它們。然後使用Compose文件在目錄中運行docker-compose包。這將產生一個可以部署到Docker Swarm或其他支持DAB格式的服務的映像。

如何進行下一步將取決於你計劃如何部署生產應用程式。例如,Docker Swarm就像Docker Enterprise一樣直接接受Docker Compose應用程式。另一方面,Kubernetes不支持Docker Compose格式,但有工具可將Docker Compose文件轉換為Kubernetes Resources文件並生成其他Kubernetes工件。

無論你的生產目的地是什麼,當你繼續開發多容器Docker應用程式時,你創建的Docker Compose文件將繼續對測試有用,這也是最重要的。

相關閱讀:

2018年「微服務」已死?

如何使用 Docker Compose 來構建一套開發環境

為Docker和Kubernetes提供的4個第三方安全工具

Kubernetes可以做哪些容器編排

Kubernetes和容器將統治雲?

2018年Kubernetes 四大趨勢預測

Kubernetes 1.9 新特性,支持 IPv6

如何開始Kubernetes第一步

更多文章請關注

相關焦點

  • 帶你Windows下玩轉Docker和Docker-compose
    前言文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/bin392328206/six-finger絮叨
  • Windows系統(離線)中安裝和使用Docker、Docker-compose
    本文將介紹如何在Windows系統(離線)中安裝和使用Docker、Docker-compose。該項目的Github地址為:https://github.com/percent4/windowns_install_docker。
  • Istio入門實戰與架構原理——使用Docker Compose搭建Service Mesh
    $ docker-compose -f istio.yaml up -d用命令docker-compose -f istio.yaml ps看一下是不是所有組件正常運行。你可能(大概率)會看到pilot的狀態是Exit 255。
  • 使用Docker-Compose搭建高可用redis哨兵集群
    文件組織格式如下redis-sentinel├── redis│   └── docker-compose.yml└── sentinel ├── docker-compose.yml ├── sentinel1.conf
  • 史上講解最好的 Docker 教程,從入門到精通
    鏡像為什麼分層1.8.2 可寫的容器層1.8.3 容器層的細節說明1.9 使用docker運行zabbix-server1.9.1 容器間的互聯1.9.2 啟動zabbix容器1.9.3 關於zabbix API1.10 docker 倉庫(registry)1.10.1 創建一個普通倉庫1.10.2 帶basic認證的倉庫1.11 docker-compose編排工具1.11.1 安裝docker-compose1.11.2
  • python測試開發django-180.docker-compose部署django+mysql環境
    多個容器部署的時候可以用到docker-compose 進行容器編排。docker-compose環境準備使用 python3 的 pip3 安裝 docker-compose 命令行工具pip3 install docker-compose安裝的版本Version: 1.29.2# pip3 show docker-composeName: docker-composeVersion
  • Docker(一):Docker入門教程
    本文詳細解釋介紹Docker入門相關內容,後期重點關注Docker在微服務體系中的使用。在了解Docker之前我們先考慮幾個問題:1、Docker是什麼?2、為什麼要使用Docker,它有什麼優勢?帶著這些問題我們來看看下面的內容。什麼是Docker?Docker 是世界領先的軟體容器平臺。開發人員利用 Docker 可以消除協作編碼時「在我的機器上可正常工作」的問題。
  • 10 分鐘帶你從入門到精通的 Docker 小白實戰教程
    而這時,就輪到 docker-compose 登場了~docker-compose 是 Docker 官方提供的一個 Docker 管理工具。若你是通過桌面端的 Docker 安裝包安裝的 Docker,它是會默認為你安裝 docker-compose 的。
  • 史上講解最好的Docker教程,從入門到精通(建議收藏的教程)
    9.1 容器間的互聯9.2 啟動zabbix容器9.3 關於zabbix API10 docker 倉庫(registry)10.1 創建一個普通倉庫10.2 帶basic認證的倉庫11 docker-compose編排工具11.1 安裝docker-compose
  • 使用 Docker 搭建 Laravel 本地環境
    克隆 laradocklaradock 官方文檔:http://laradock.io/laradock github:https://github.com/laradock/laradocklaradock 是一個包含全功能用於 docker 的 PHP 運行環境,使用 docker-compose 方式部署。
  • 如何 Docker 化 Python Django 應用程式 | Linux 中國
    在本教程中,我將逐步向你展示在 Ubuntu 16.04 中如何為現有的 Django 應用程式創建 docker 鏡像。我們將學習如何 docker 化一個 Python Django 應用程式,然後使用一個 docker-compose 腳本將應用程式作為容器部署到 docker 環境。
  • Docker命令大全及Dockerfile詳解(附示例)
    Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然後發布到任何流行的 Linux或Windows 機器上,也可以實現虛擬化
  • Docker 極簡入門教程
    Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?docker build -t jartto-docker-demo .
  • Docker 入門教程 - 2021 最新版(上)
    現在,打開終端並執行 docker --version 和 docker-compose --version 以驗證是否安裝成功。執行 docker --version 和 docker-compose --version 命令以確保安裝成功。
  • Docker 入門萬字詳解!新手也能看懂!
    編排工具1.11.1 安裝 docker-compose安裝 docker-compose# 下載pip軟體yum install -y python2-pip# 下載 docker-composepip install docker-compose
  • Docker 命令自動補全?要的
    #變成了docker container run ...他說,本來對 Docker 命令就不熟悉,這下感覺更加混亂了。docker <Management Command> <Sub-Command <Opts/Args>>這樣以後我們使用命令只需要先關注 Management Commands 就可以了,那後續的子命令還是不知道怎麼用,還要一點點查詢嘛?
  • 經驗總結 | Docker 使用筆記
    0x00 前言平時在使用 Docker 時,經常會碰到忘記相關命令的情況,因此平時忘記一個就會記錄一個,經過多年的記錄,Docker 相關的筆記已經記錄了不少。最近
  • Docker 極簡入門教程,傻瓜都能看懂!
    具體這裡不再介紹,更多Docker系列教程可以關注公眾號Java技術棧搜索閱讀。Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
  • docker ,jenkins自動部署
    可做數據恢復使用docker run -d -u root -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/bin/docker -v /var/jenkins_home:/var/jenkins_home jenkinsdocker run -d -u root
  • WSL2 安裝 Docker
    啟動並檢驗安裝是否成功# 啟動 docker 服務sudo service docker start # 注意:有的Linux系統時通過`systemctl start docker`啟動# 列印docker系統詳細信息docker info