はじめに
インターネットに接続していない環境、いわゆるアイランド環境にてコンテナイメージを展開する方法を説明します。
流れとしてはインターネットに接続している環境にてイメージをpullし、そのイメージをtarに固めて持ち込んで利用します。
環境情報
- Debian 9 (コンテナイメージをpullする環境)
- Windows 10(アイランド環境を想定した環境)
コンテナイメージを取得する(Debian側)
redisのイメージをアイランド環境に持ち込むとします。
例えばdocker-compose用のファイルに以下のように記載されていれば
redis: image: redis:5.0.7
初期起動時に以下のようにダウンロードが始まります。
Pulling redis (redis:5.0.7)... 5.0.7: Pulling from library/redis 68ced04f60ab: Pull complete 7ecc253967df: Pull complete 765957bf98d4: Pull complete 52f16772e1ca: Pull complete 2e43ba99c3f3: Pull complete d95576c71392: Pull complete Digest: sha256:938ee5bfba605cc85f9f52ff95024e9a24cf5511ba6f1cbc68ec9d91a0432125 Status: Downloaded newer image for redis:5.0.7
確かにイメージがローカルに保存されました。
# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE .... redis 5.0.7 7eed8df88d3b 2 months ago 98.2MB ...
ここでdocker save
によってイメージをtarにします。
# docker save redis > redis.tar
ちなみに、イメージはdocker serach redis
と打てば複数のリポジトリのイメージが見つかることも覚えておきたいです。
コンテナイメージを読み込む(Windows側)
上記ファイルをアイランド環境に配置します。確かに外部と通信できません。
$ ping 8.8.8.8 8.8.8.8 に ping を送信しています 32 バイトのデータ: ping: 転送に失敗しました。一般エラーです。
その環境にてdocker load
にて読み込めば
docker load -i .\redis.tar f2cb0ecef392: Loading layer [==================================================>] 72.48MB/72.48MB 56f1f103e9b9: Loading layer [==================================================>] 338.4kB/338.4kB aaa520a04939: Loading layer [==================================================>] 4.082MB/4.082MB 094202232094: Loading layer [==================================================>] 24.67MB/24.67MB 1904c3c5301e: Loading layer [==================================================>] 1.536kB/1.536kB 97dd072b7669: Loading layer [==================================================>] 3.584kB/3.584kB Loaded image: redis:5.0.7
ローカルに保存できました。イメージIDも同じです。
> docker image ls redis REPOSITORY TAG IMAGE ID CREATED SIZE redis 5.0.7 7eed8df88d3b 2 months ago 98.2MB
タグ名まで含めて指定すれば以下のように起動が完了します。
> docker run redis:5.0.7 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=1, just started # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf * Running mode=standalone, port=6379. # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. # Server initialized # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. * Ready to accept connections
ちなみにタグ名を指定しないと外部に取得しにいくためエラーとなります。
> docker run redis Unable to find image 'redis:latest' locally C:\Program Files\Docker\Docker\resources\bin\docker.exe: Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on ...: no such host.
終わりに
社内システムのようにインターネットに接続していない環境でもDockerイメージを利用してアプリケーションを利用したい際には必須のテクニックなので、覚えておくと役立つと思います。
以上、ご参考になれば幸いです。