Docker compose學習筆記

1、compose

compose 做用

你的應用可能須要不少個服務,好比web服務,數據庫服務,緩存服務等等。咱們能夠把這些服務放到單獨的容器裏面,若是手工去配置這些服務會有些麻煩,docker compose能夠幫咱們解決這個問題。 咱們能夠建立一個compose文件,在這個文件上面描述你都須要哪些服務,服務使用什麼鏡像、數據卷、網絡等等,而後再用一條命令就能夠管理、啓動全部的服務。html

compose 文件

compose文件用的yml格式,docker規定了一些指令,使用它們能夠去設置對應的東西,它主要分爲了3個區域:nginx

  • services:是服務,在它下面能夠定義應用須要的一些服務,每一個服務都有本身的名字、使用的鏡像、掛載的數據卷、所屬的網絡、依賴哪些其餘服務等等;
  • networks:是應用的網絡,在它下面能夠定義應用的名字、使用的網絡類型等等;
  • volumes:是數據卷,在它下面能夠定義的數據卷(名字等等),而後掛載到不一樣的服務下去使用;

2、Services

先建立一個文件夾beck-docker,並在裏面新建docker-compose.yml文件,而後使用version指定一下compose使用的版本號。web

mkdir sample
cd sample
echo "version: '2'">docker-compose.yml

定義服務

在應用裏須要定義的服務,能夠放到services下面。好比,咱們去定義一個dog的服務,使用nginx鏡像,指定主機上的8080端口映射到容器中得80端口,也就是nginx的http的訪問端口。docker

services: 
  dog: 
    image: nginx
    ports: 
      - "8080:80"

以一樣的方式,定義一個cat的服務,一樣使用nginx鏡像,而後指8081端口對應80端口。數據庫

services: 
  cat: 
    image: nginx
    ports: 
      - "8081:80"
須要注意的是,cat與dog要在同一個級別,還有ports是個數組,能夠指定多個端口映射關係, 每一個端口一行。

啓動服務

定義好服務之後,在項目的目錄啓動這些服務,能夠執行:數組

docker-compose up

這樣會啓動,在compose文件下定義的全部服務。因爲這是第一次啓動這個服務,因此能夠看到它是creating,也就是去建立相關的東西。首先會建立這個服務使用的網絡,這裏是叫作「sample_default」的網絡,而後是dog和cat的服務,這些網絡和服務的名字,默認會加上一個前綴,因爲在建立應用的時候沒有指定名字,因此會默認使用項目目錄的名字,後面還有一個數字的後綴。最後會有一個「Attaching to …」,將網絡應用到服務上。 啓動成功後,在瀏覽器訪問一下。8080對應的是dog的服務,8081是cat的服務。瀏覽器

回到終端,能夠看到服務的訪問日誌,日誌的開頭會有服務的名字,標誌着日誌是從哪一個服務來的。
若是但願服務在後臺運行,可使用-d選項(也就是detach):
docker-compose up -d

服務的生命週期

查看正在運行的服務緩存

docker-compose ps

中止一個服務bash

docker-compose stop [服務名]

若是後面不加服務名,會中止全部的服務網絡

啓動一個服務

docker-compose start [服務名]

若是後面不加服務名,會啓動全部的服務

查看服務運行的log

docker-compose logs -f [服務名]

若是後面不加服務名,會顯示全部的服務log

進入服務容器中

docker-compose exec {服務名} bash

刪除服務

docker-compose rm [服務名]

若是後面不加服務名,會刪除全部的服務

注意這個docker-compose rm不會刪除應用的網絡和數據卷。查看一下網絡,能夠看到應用建立的網絡「sample_default」,若是要刪除全部的這些,可使用:
docker-compose down

3、Networks

網絡決定了服務之間以及服務和外界之間如何去通訊,在執行docker-compose up的時候,docker會默認建立一個默認的網絡,建立的服務也會默認地屬於這個默認網絡。服務和服務之間,可使用服務的名字進行通訊。也能夠本身建立網絡,並將服務屬於到這個網絡之中,這樣服務之間能夠相互通訊,而外界就不可以與這個網絡中的服務通訊,能夠保持隔離性。 經過如下指令查看網絡

docker-compose network ls

經過如下執行測試dog和cat服務的網路是否聯通

docker-compose exec dog ping cat

自定義網絡

一、在networks中先定義一個名爲animal,類型爲bridge的網絡:

networks:
  animal:
    driver: bridge

二、讓dog和cat服務使用這個網絡:

  dog: 
    image: nginx
    ports: 
      - "8080:80"
    networks:
      - "animal"
  cat: 
    image: nginx
    ports:
      - "8081:80"
    networks:
      - "animal"

三、再增長一個叫pig的服務,使用默認網絡,來體現於自定義網絡的隔離性:

  pig:
    image: nginx
    ports:
      - "8082:80"
    networks:
      - "default"

四、從新啓動應用

docker-compose restart

五、測試cat服務,與dog服務和pig服務的網絡連通性:

docker-compose exec cat ping dog
docker-compose exec cat ping pig
由於cat與dog同在animal網絡,因此能夠經過名字鏈接,而pig在default網絡中,因此不能。

4、Volumes

在compose文件中,還能夠指定一些有名字的數據卷,讓服務去使用。方法是:在與networks同級的地方,添加volumes,接着是數據卷的名字,下面使用driver去指定數據卷的類型。
volumes:
  nest:
    driver: local
定義好數據卷後,就將這個數據卷交給一個服務去使用。能夠用volumes給服務指定須要使用的數據卷,冒號左邊是數據卷名稱,冒號右邊是掛載到的docker對應目錄位置。
  dog: 
    image: nginx
    ports: 
      - "8080:80"
    networks:
      - "animal"
    volumes:
      - "nest:/mnt"

  cat: 
    image: nginx
    ports:
      - "8081:80"
    networks:
      - "animal"
    volumes:
      - "nest:/mnt"

回到終端,執行docker-compose restart,下面測試一下數據卷。

docker-compose exec dog bash
cd /mnt
touch data1
ls
exit

docker-compose exec cat bash
cd /mnt
ls

由於cat與dog服務都使用nest的數據卷,因此在dog中/mnt目錄下建立的data1,在cat服務的/mnt目錄下能夠看到。

指定位置的數據卷

dog和cat都是一個web服務,如今我想將主機的某一個位置當作是服務的一個內容,那麼咱們能夠去創一個指定位置的數據卷。首先能夠在當前目錄,建立./web文件夾,在裏面建立個index.html。

mkdir web
touch index.html

編輯內容:

<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <title>sample</title>
  </head>
  <body>
hello~~~~~
  </body>
</html>

 

從新啓動一下docker-compose restart, 訪問dog服務和cat的服務。

相關文章
相關標籤/搜索