docker内部から外部ネットワークへ接続できないようにしたい

docker内部から外部ネットワークへの通信が発生することが望ましくないケースがあるときに使う備忘メモ

## 最初からネットワーク遮断する場合

最初からネットワーク遮断する場合はdocker起動時に`--network=none`オプションを付ける方法が良いと思われる

> [ネットワークから遮断したDockerコンテナを立ち上げたい](https://scrapbox.io/nwtgck/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%8B%E3%82%89%E9%81%AE%E6%96%AD%E3%81%97%E3%81%9FDocker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%81%9F%E3%81%84)


```bash:--network=noneオプションを付ける
$ docker run -it --network=none ubuntu:18.04

## 上記の後、apt updateは失敗する（意図通り、外部ネットワークへ接続できないようにできている）
$ apt update -y
Err:1 http://security.ubuntu.com/ubuntu bionic-security InRelease
  Temporary failure resolving 'security.ubuntu.com'
...
W: Some index files failed to download. They have been ignored, or old ones used instead.
```

```bash:--network=noneオプションを付けない
$ docker run -it ubuntu:18.04

## 上記の後、apt updateは成功する
$ apt update -y
Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
...
Fetched 24.0 MB in 7s (3525 kB/s)                                                                                                                                                                          
Reading package lists... Done
Building dependency tree       
Reading state information... Done
All packages are up to date.
```

## 途中からネットワーク遮断する場合

途中からネットワーク遮断する場合は`docker network disconnect`を使う方法が良いと思われる

> [コンテナのネットワーク](http://docs.docker.jp/v19.03/engine/tutorials/networkingcontainers.html)

```bash:例
docker network disconnect bridge ${CONTAINER_NAME}
```

```bash:
# 普通に起動させると apt update -y が成功する
$ docker run -it --name ubuntu ubuntu:18.04 cat &
$ docker exec -it ubuntu bash
$ apt update -y
Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
...
Fetched 24.0 MB in 7s (3525 kB/s)                                                                                                                                                                          
Reading package lists... Done
Building dependency tree       
Reading state information... Done
All packages are up to date.

# docker network disconnect すると、意図通り、外部ネットワークへ接続できないようになる
$ exit
$ docker network disconnect bridge ubuntu
$ docker exec -it ubuntu bash
$ apt update -y
Err:1 http://security.ubuntu.com/ubuntu bionic-security InRelease
  Temporary failure resolving 'security.ubuntu.com'
...
W: Some index files failed to download. They have been ignored, or old ones used instead.
```

尚、ネットワークに繋げるには`docker network connect`を使う

```bash:例
docker network connect bridge ${CONTAINER_NAME}
```

# 参考
[ネットワークから遮断したDockerコンテナを立ち上げたい](https://scrapbox.io/nwtgck/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%8B%E3%82%89%E9%81%AE%E6%96%AD%E3%81%97%E3%81%9FDocker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%81%9F%E3%81%84)
[Docker network 概論](https://qiita.com/TsutomuNakamura/items/ed046ee21caca4a2ffd9)
[docker network disconnectコマンドの使い方（実例付）](https://www.memotansu.jp/docker/899/)
[コンテナのネットワーク](http://docs.docker.jp/v19.03/engine/tutorials/networkingcontainers.html)
> コンテナを切断（disconnect）し、ネットワークからコンテナを取り外せます。切断にはネットワーク名とコンテナ名を指定します。あるいは、コンテナ ID も使えます。この例では、名前を指定する方が速いです。
> $ docker network disconnect bridge networktest