#Docker:組合
###定義服務
vi docker-compose.yml
```
version: '2'
services:
phoenix:
image: nginx
ports:
- "8080:80"
dragon:
image: nginx
ports:
- "8081:80"
```
###啟動服務
```
// 啟動服務
docker-compose up
// 通過瀏覽器訪問 http://192.168.99.100:8080/ http://192.168.99.100:8081/
// 回到終端,這里會顯示容器里面的一些日志,每條日志的前面會標注一下這個日志來自哪一個服務容器,ctrl+c可以停止它們,這些服務我們可以讓它在后臺去運行
docker-compose up -d
// 查看一下正在運行的容器
docker ps
```
###服務的生命周期
```
// 查看應用的服務
docker-compose ps
// 停止phoenix服務
docker-compose stop phoenix
// 停止所有在docker-compose.yml文件中定義的服務
docker-compose stop
// 重新啟動phoenix服務
docker-compose start phoenix
// 啟動所有服務
docker-compose start
// 查看服務的日志
docker-compose logs
// 持續跟蹤服務日志的變化
docker-compose logs -f
// 登錄到phoenix服務容器中
docker-compose exec phoenix bash
// 要刪除應用的服務需要先把它們都停止掉
docker-compose stop
// 刪除所有服務的容器
docker-compose rm
// 注意rm不會刪除掉創建的網絡還有數據卷
docker network ls
// 這里的ninghaodocker_default就是我們的應用創建一個網絡
// 如果想要刪除所有的這些東西的話,可以使用
docker-compose down
docker network ls
```
###網絡
網絡決定了服務之間還有外界跟服務之間怎么樣去進行溝通,在執行docker-compose up的時候,docker會給我們創建一個默認的網絡,所有的服務也會屬于這個默認的網絡,服務跟服務之間可以使用服務的名字進行相互的通信,我們也可以創建自己的網絡,然后讓指定的服務加入到我們自己創建的這些網絡里面,那么這樣的話屬于這個網絡的服務之間可以進行通信,網絡以外的服務就不能夠去跟它們進行通信了, 這樣的話會對這個服務有一個隔離的作用,讓應用更安全一些
```
docker-compose up -d
docker-compose exec phoenix bash
ping dragon
exit
docker-compose exec dragon bash
ping phoenix
```
###定義網絡
```
version: '2'
services:
phoenix:
image: nginx
ports:
- "8080:80"
networks:
- "fairyland"
dragon:
image: nginx
ports:
- "8081:80"
networks:
- "fairyland"
monkey:
image: nginx
ports:
- "8082:80"
networks:
- "default"
networks:
fairyland:
driver: bridge
```
```
// 重新啟動服務
docker-compose up -d
docker-compose exec phoenix bash
ping dragon
ping monkey
// dragon能ping通,monkey不能ping通
```
###命名的數據卷
```
version: '2'
services:
phoenix:
image: nginx
ports:
- "8080:80"
networks:
- "fairyland"
volumes:
- nest:/mnt
dragon:
image: nginx
ports:
- "8081:80"
networks:
- "fairyland"
volumes:
- nest:/mnt
monkey:
image: nginx
ports:
- "8082:80"
networks:
- "default"
networks:
fairyland:
driver: bridge
volumes:
nest:
driver: local
```
```
docker-compose up -d
docker-compose exec phoenix bash
cd /mnt
touch phoenix_data_1
ls
exit
docker-compose exec dragon bash
cd /mnt
ls
```
###指定位置的數據卷
docker-compose.yml
```
version: '2'
services:
phoenix:
image: nginx
ports:
- "8080:80"
networks:
- "fairyland"
volumes:
- nest:/mnt
- ./app/web:/usr/share/nginx/html
dragon:
image: nginx
ports:
- "8081:80"
networks:
- "fairyland"
volumes:
- nest:/mnt
- ./app/web:/usr/share/nginx/html
monkey:
image: nginx
ports:
- "8082:80"
networks:
- "default"
networks:
fairyland:
driver: bridge
volumes:
nest:
driver: local
```

index.html
```
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello Docker</title>
</head>
<body>
Hello Docker!
</body>
</html>
```

```
docker-compose up -d
```

.env 用來解決上面的報錯
```
COMPOSE_CONVERT_WINDOWS_PATHS=1
```
瀏覽器訪問 http://192.168.99.100:8080/ 和 http://192.168.99.100:8081/


注意:指定位置的數據卷需要在C:\Users目錄下,因為VirtualBox只對這個目錄有訪問權限
