ポートフォーワードしないでdockerコンテナに接続する

Table of Content

はじめに

dockerのコンテナにアクセスするには、ポートフォーワードして接続するのが一般的です。

Ubuntuでは「libnss-docker」というパッケージがあり、インストールすることによって「コンテナ名.docker」でコンテナのIPアドレスの名前解決ができ、コンテナに直接アクセスすることが出来ます。

なお、コンテナの名前解決やアクセスはdocker稼働マシンのみです。外部のホストからはポートフォーワードで接続します。

https://github.com/dex4er/deb-libnss-dockerを参考にしています。

libnss-dockerのインストール

インストールは次の通りです。

sudo apt install -y libnss-docker

「/etc/nsswitch.conf」にdockerが追加されているのが確認できます。

〜
hosts:          files docker [NOTFOUND=return] mdns4_minimal [NOTFOUND=return] dns mymachines
〜

「イメージ名.docker」でコンテナにアクセスしてみる

mysqlのコンテナを立ち上げてmysqlコマンドでアクセスしてみます。

$ docker container run -d --name mysql -e MYSQL_ROOT_PASSWORD=mysql mysql
54b1286d36290fbc6a99ff8b08bdff9860801817d2603adf0d363549d2655cea
$ docker container ls
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                 NAMES
54b1286d3629   mysql     "docker-entrypoint.s…"   26 seconds ago   Up 25 seconds   3306/tcp, 33060/tcp   mysql

名前解決できているか確認してみます。

$ getent hosts mysql.docker
172.17.0.2      mysql.docker
$ ping mysql.docker
PING mysql.docker (172.17.0.2) 56(84) バイトのデータ
64 バイト応答 送信元 172.17.0.2 (172.17.0.2): icmp_seq=1 ttl=64 時間=0.077ミリ秒

mysqlコマンドで接続してみます。

$ mysql -h mysql.docker -uroot -p
Enter password:
〜

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql>

最後に

「libnss-docker」は開発環境でdockerを使用している場合に有効ではないでしょうか。
コンテナ起動時にポートフォーワードせずに接続できるのが楽でいいです。
例えばデータベースのコンテナを複数上げる場合を考えると、ポートフォーワードだとポート番号を意識しなくてはなりませんが、「libnss-docker」はコンテナ名だけで接続できます。dockerが起動しているホストのみの限定ですが、結構使えるのでは無いでしょうか。