你的應用可能須要不少個服務,好比web服務,數據庫服務,緩存服務等等。咱們能夠把這些服務放到單獨的容器裏面,若是手工去配置這些服務會有些麻煩,docker compose能夠幫咱們解決這個問題。 咱們能夠建立一個compose文件,在這個文件上面描述你都須要哪些服務,服務使用什麼鏡像、數據卷、網絡等等,而後再用一條命令就能夠管理、啓動全部的服務。html
compose文件用的yml格式,docker規定了一些指令,使用它們能夠去設置對應的東西,它主要分爲了3個區域:nginx
先建立一個文件夾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的服務。瀏覽器
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
網絡決定了服務之間以及服務和外界之間如何去通訊,在執行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網絡中,因此不能。
volumes:
nest:
driver: local
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>