---
# System prepended metadata

title: Docker的網路-Docker Compose yaml網路寫法

---

# Docker的網路-Docker Compose yaml網路寫法(external與internal篇)

雖然今天加班比較晚，還是要比照鐵人精神，完成今天的挑戰...

Docker Compose yaml的起手式，我想從編輯器開始。

不是為了混一篇文章的量XD而是實際撰寫上，常常因為yaml的層級跟空白，而發生無法正常運作的問題。

![](https://hackmd.io/_uploads/ByLRVhFkp.png)

這邊推薦使用vs code的docker extension，就可以提供Dockerfile還有Docker compose yaml的一些語法輔助。

有關Docker Compose yaml比較完整的說明，可以看以下官方文件：

https://docs.docker.com/compose/compose-file/06-networks/

網路的元件宣告還算簡單

```
version: "3"
services:
  ubuntu:
    image: tedyang/ubuntu:1120912
    networks:
      - outside
networks:
  outside:
    external: true
```

我們先來玩一下一個簡單範例，上面的範例就是用vs code跟參考官方範例寫成的。

後面我會花一點時間整理docker compose文件的結構跟語法的特色。

這邊試著run看看

> docker-compose -f docker-compose.yaml -p ubuntutest up 

![](https://hackmd.io/_uploads/BJI-dnF1T.png)

官方文件有說明，external代表是在不在這邊管network物件，所以如果outside這個物件沒有先建立好，這邊會出現錯誤

我們先把network物件outside建立起來看看
> docker network create outsude

再執行一次
> docker-compose -f docker-compose.yaml -p ubuntutest up 

ok了

我們看一下internal跟external的差異：
> docker network ls

![](https://hackmd.io/_uploads/rkIzKnFkp.png)

差異很簡單，external就是要先額外建好，internal代表docker compose執行同時，會建立一個project-name_network-object的網路物件。

這邊有發現一個狀況：

![](https://hackmd.io/_uploads/rkvlcht1a.png)

我重複執行了：
> docker-compose -f docker-compose.yaml -p ubuntutest2 up
> docker-compose -f docker-compose.yaml -p ubuntutest2 up
> docker-compose -f docker-compose.yaml -p ubuntutest2 up

還是只有一個container在運作，相同container name。

這跟使用docker run --name這種方式不同，我整理如下：

1. docker run --name NAME，NAME是容器名稱，不可重複。
2. docker-compose up -p projectname，projectname-servicename-1為容器名稱，多次執行會不斷重啟container。

### 特別狀況

剛剛只展示將project都寫一樣，執行時就會不斷重啟，但如果我進入compose yaml修改service name，但project name一樣，舊的service name的container會造成以下訊息：

![](https://hackmd.io/_uploads/Hk5VshYy6.png)

可以看到多次執行會出現 
WARN[0000] Found orphan containers ([ubuntutest2-ubuntu-1]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.

如果確定舊的service不要使用了，可以照它的指示移除孤兒container

> docker-compose -f docker-compose.yaml -p ubuntutest2 up --remove-orphans

![](https://hackmd.io/_uploads/B1KDhnF1a.png)

後面會再更深入做docker compose生命週期的管理，然後會建議怎樣改service name或project name，或是使用docker-compose up /down來做重新deploy，不過我們還是著重在network的管理上喔。