続・Dockerコンテナに外部ネットワークからアクセスできるように環境構築しました(CentOS7)

Dockerコンテナに外部ネットワークからアクセスできるように環境構築しました(CentOS7) | 雑誌の住人
※この記事は上記の記事と連動したものとなってます

先日、上記のDockerに関する記事を書きました。その時は「外部ネットワークからコンテナにアクセス可能にする」という目的は果たせていたんですが、コンテナをbridge接続で外部ネットワークからアクセスする方法がなんかイケてないかったんです。

しかし、記事を書き終わって次の日に「docker networkコマンドでもっと簡単にできるんじゃん!!!」という事に気が付きました。docker networkコマンドに関するそれっぽい記事を何度も見た記憶があったのですが、書いてあることが理解できなくて、一番実現可能そうなアジャイル株式会社さんの記事を更新するような形で実現させたんですよね……。いやー記事書いてる時はさっぱり気が付かなかったのですが、記事を書き終わった途端に気が付くというアホさw

という訳でdocker networkコマンドを使ったbridge接続のやり方を色々と整理してみました。前の記事のスクリプトのやつは参考にしなくていいからね!!!

docker networkコマンドについて

docker networkコマンドは、dockerコンテナのIPやネットワークを自由自在に設定するコマンドです。dockerをインストールして起動した直後にdocker network lsコマンドを実行すると、以下のように見えるはずです。

[root@server]# docker network ls
NETWORK ID    NAME    DRIVER   SCOPE
cefc00469ddf  bridge  bridge   local
eaf8ee608c23  host    host     local
515e8bd296be  none    null     local

ここに、構築するネットワークに必要なdocker networkを作成します。作成コマンドは、docker network create です。以下のコマンドをそのままコピペすればdocker networkが作れます。

[root@server]# docker network create \
    --driver bridge \
    --subnet 192.168.1.0/24 \
    --gateway 192.168.1.1 \
    --opt "com.docker.network.bridge.name"="br0" \
    bridge2

上記コマンドの各オプションを説明します。

— driver
 ネットワークのタイプを設定するところです。今回はbridge接続にするのでbridgeを指定しますが、他にもhostやらoverlayなどの種類があるようです。構築したいネットワークに合わせて調べて選択してみてください。

–subnet
 ネットワークアドレスとサブネットマスクを指定します。

–geteway
 今回のネットワークは192.168.1.0/24で、gateway に使うIPは192.168.1.1なので、そのように指定します。

–opt
 ここは、前記事で作成したbridge interfaceのbr0を使用すると宣言する設定です。br0じゃない名前で bridge interface 作った時はそれに合わせてください。

最終行の[bridge2]
 ここに書いてあるbridge2は、docker network の名前です。単なる名前なので、管理しやすい名前を付けましょう。

docker network createコマンドを実行した後に、docker network lsコマンドを実行すると、以下のようにbridge2が追加されているのが確認できます。

[root@server]# docker network ls
NETWORK ID    NAME    DRIVER   SCOPE
cefc00469ddf  bridge  bridge   local
0355c7e1c5f4  bridge2 bridge   local
eaf8ee608c23  host    host     local
515e8bd296be  none    null     local

作ったbridge2の設定を確認するコマンドはdocker network inspect です。

[root@216server ~]# docker network inspect bridge2
[
    {
        "Name": "bridge2",
        "Id": "0355c7e1c5f41f10e855da438e909e8f5fe03d20293349702e3e9778112979e0",
        "Created": "2019-06-11T18:14:57.330164551+09:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.1.0/24",
                    "Gateway": "192.168.1.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.name": "br0"
        },
        "Labels": {}
    }
]

Name、Subnet、Gateway、Optionのbridge interface名あたりが指定したものと間違ってなければOKです。

Docker Networkを指定してコンテナの起動

次は、docker network createで作成した docker networkを指定して、コンテナを起動します。起動する時のコマンドは以下です。

[root@server]# docker run --net=bridge2 --ip=192.168.1.10 --privileged -d --name test centos:centos7 /sbin/init

–net=”bridge2″のところが、先ほど作ったbrdge2のネットワークを使ってコンテナを起動する、という意味になっています。コンテナ事態のIPは、–ip=192.168.1.10のところで指定します。

テナを起動する、という意味になっています。コンテナ事態のIPは、–ip=192.168.1.10のところで指定します。

これで自分の構築したいネットワークとIPを指定して、bridge接続できました。自分で作成したdocker networkを指定してコンテナを起動することで、起動時にはちゃんと外部ネットワークからコンテナIPに疎通が可能になります。

前の記事を参考にしてくださってスクリプトを試した方、docker networkコマンドを使うのが断然分かりやすいので、こちらをお試しください!