---
# System prepended metadata

title: 第8章 Docker 網路模式介紹
tags: [network, docker, '2021']

---

# 第8章 Docker 網路模式介紹

![](https://i.imgur.com/Os55KSn.png)


> 介紹4種常見的網路模式 

- none = 不能向內或向外連
- bridge = 會把容器放在 bridge network 中, 不同 bridge network 不互通相反的同一個 bridge network 中就可互通，可以連外網
- container = 會跟 bridge 要一個 bridge network 讓它們共享同一個 bridge network 
- host = 跟 Linux VM 要空間就可以跟主機上的其它程序溝通

## 實作 None 

```
docker pull alpine
docker images
docker network ls
docker run -d --network none --name none-mode alpine tail -f /dev/null
docker network inspect none
docker container ls

// 測試與外界溝通
docker exec -it container_id /bin/sh 進去 shell 後
ip addr ls
ping 8.8.8.8 (google) 會顯示 Network unreachable 代表 連不到
```

## 實作 Bridge

```
docker network ls
docker network create --driver bridge my-bridge
docker network ls

// 觀察這個network
docker network inspect my-bridge

// 建立 container 到 bridge
docker run -d --network my-bridge --name brige-mode001 alpine tail -f /dev/null

docker network inspect my-bridge 會在 containers 裡面多剛剛新增的 
docker exec -it container_id /bin/sh
ip addr ls
ping 8.8.8.8

// 建立第二個 container 到 bridge
docker run -d --network my-bridge --name brige-mode002 alpine tail -f /dev/null

docker container ls
docker network insepect my-bridge
docker exec -it container_id /bin/sh
ip addr ls
ping 8.8.8.8
ping 另一個在相同network 的ip

// 建立第三個 container 到不同bridge
docker network create --driver bridge their-bridge
docker network ls
docker run -d --network their-bridge --name brige-mode003 alpine tail -f /dev/null
docker network inspect their-bridge
docker exec -it container_id /bin/sh
ip addr ls 
ping 8.8.8.8
ping 不同 network 的 ip

// 加入其它 network 中
docker network connet my-bridge(network) brige-mode003 (將container 加入到新的 bridge)
docker network inspect my-brdige
docker exec -it container_id /bin/sh
ping 共同網路底下的其它 container id

```

## 實作 Container

> 複製現有的 container 設定


```
docker container ls
docker run -d --network container:brige-mode001(拷貝 brige-mode001 設定) --name container-mode001 alpine tail -f /dev/null
docker container ls
docker network inpsect my-bridge // 不會出現新的container 因為只是複製所以不會新增任何東西
docker exec -it container_id /bin/sh
ip addr ls (會發現與複製的那一個 ip 一樣)
```

## 實作 Host

> 我們的 container 不在是 container 那一層而是直接當成 vm linux host 一模一樣


```
docker run -d --network host --name my-apache xxx/test01
docker build -t xxxx/my-apache
docker images
docekr run -d --network host --name my-apache xxx/my-apache
docker container ls
docker network inspect host
docker container ls
docker exec -it container_id /bin/sh
ip addr ls
192.xxx.xxx.xxx (linux vm ip)
netstat -tulpn
exit 
echo $(docker-machine ip)
```

```dockerfile=
FROM alpine:latest
ENV myworkdir /var/www/localhost/htdocs/
ARG whoami=Jake
WORKDIR ${myworkdir}
RUN apk --update add apache2
RUN rm -rf /var/cache/apk/*
RUN echo "<h3>I am ${whoami}. I am taking this great Docker Course. Round 01</h3>" >> index.html
RUN echo "<h3>I am ${whoami}. I am taking this great Docker Course. Round 02</h3>" >> index.html
RUN echo "<h3>I am ${whoami}. I am taking this great Docker Course. Round 03</h3>" >> index.html
COPY ./content.txt ./
RUN ls -l ./
RUN cat ./content.txt >> index.html
ENTRYPOINT ["http", "-D", "FOREGROUND"]
```

###### tags: `2021`  `docker` `network`


{%hackmd BJrTq20hE %}
