インターネット接続が出来ない環境でdockerを使いたい
docker pullがno routeな環境でもdockerイメージを実行してコンテナを動作させたいぞ。
想定環境
- プロキシすらなくインターネットに繋がっていない = docker pullできない
- root権限はある
- ファイルの持ち込みは問題はない
このような環境でdockerを動かすのが目的です。
必要な環境
- docker pull可能な環境
docker imageを取得して持ち込むファイルを作成するために必要
解決策
docker saveでdockerイメージをファイル化できる
docker loadでファイルからdockerイメージを読み込むことができる。
docker pullが出来ない環境でもdockerにdockerイメージとして読みこませたことで、該当イメージを自由に起動することができる。
コマンドで言うと、
docker save -o ファイル名 [imageId]
docker load -i ファイル名
の2コマンドを駆使して、dockerイメージを持ち込めば後は自由に使えたということです。
具体的にやったこと大まかな流れ
- dockerイメージをファイルに出力する
- ファイルを転送して持ち込む
- dockerイメージを読み込む
- repository/tagを修正する。
- 動作確認をする
やってみる
今回はjettyとpostgresqlの2つのイメージを対象としてやります。
また、インターネット環境のないサーバにもdockerはインストール済でサービスも起動しているものとします。
docker imageをファイルに出力する
事前にdocker pullして取得しておいたdockerイメージをdocker saveでtarファイルに出力します。
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jetty 9.3.10 4d05fbe5a8b7 4 days ago 321.5 MB
postgres 9.5.3 7ee9d2061970 4 weeks ago 275.2 MB
[root@localhost docker]# docker save -o jetty9.3.10.tar 4d05fbe5a8b7
[root@localhost docker]# docker save -o postgres953.tar 7ee9d2061970
jetty9.3.10.tarとpostgres953.tarを作成しました。
ファイルを転送して持ち込む
scpでファイルを持ち込みます。WinSCPなどのクライアントを利用してもいいです。
[root@localhost ~]# scp jetty9.3.10.tar seiketkm@192.0.2.1:~/
seiketkm@192.0.2.1's password:
jetty9.3.10.tar 100% 314MB 11.6MB/s 00:27
[root@localhost ~]# scp postgres953.tar seiketkm@192.0.2.1:~/
seiketkm@192.0.2.1's password:
postgres953.tar 100% 273MB 10.5MB/s 00:26
dockerイメージを読み込む
docker load でイメージをdockerにロードします。
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@server ~]# docker load -i /home/seiketkm/jetty9.3.10.tar
[root@server ~]# docker load -i /home/seiketkm/postgres953.tar
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 4d05fbe5a8b7 4 days ago 321.5 MB
<none> <none> 7ee9d2061970 4 weeks ago 275.2 MB
リポジトリとタグが<none>
になってしまいましたが何かは読み込んだようです。
repository/tagを修正する
docker loadで読み込んだdockerイメージはREPOSITORYとTAGがないので管理が難しいです。
そこで読み込んだdockerイメージにdocker tag コマンドでリポジトリとタグを設定します。
[root@server ~]# docker tag 4d05fbe5a8b7 jetty:9.3.10
[root@server ~]# docker tag 7ee9d2061970 postgres:9.5.3
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jetty 9.3.10 4d05fbe5a8b7 4 days ago 321.5 MB
postgres 9.5.3 7ee9d2061970 4 weeks ago 275.2 MB
動作確認
jettyのコンテナを実行して動作を確認します。
[root@server ~]# docker run -d -p 10001:8080 --name hoge jetty:9.3.10
17101ed65991552a5754ff734dd9184ac7279b3287509e6865c75ff66d8e2e20
[root@server ~]# docker run -d -p 10002:8080 --name piyo jetty:9.3.10
643001d8e900117d39122c7efae8bf674cbf2250120d0337483a1f555eb6154d
jettyのコンテナを実行させました。
curlで動作確認します。
[root@server ~]# curl http://localhost:10001
<HTML>
<HEAD>
<TITLE>Error 404 - Not Found</TITLE>
<BODY>
<H2>Error 404 - Not Found.</H2>
No context on this server matched or handled this request.<BR>Contexts known to this server are: <ul></ul><hr><a href="http://eclipse.org/jetty"><img border=0 src="/favicon.ico"/></a> <a href="http://eclipse.org/jetty">Powered by Jetty:// 9.3.10.v20160621</a><hr/>
</BODY>
</HTML>
[root@server ~]# curl http://localhost:10002
<HTML>
<HEAD>
<TITLE>Error 404 - Not Found</TITLE>
<BODY>
<H2>Error 404 - Not Found.</H2>
No context on this server matched or handled this request.<BR>Contexts known to this server are: <ul></ul><hr><a href="http://eclipse.org/jetty"><img border=0 src="/favicon.ico"/></a> <a href="http://eclipse.org/jetty">Powered by Jetty:// 9.3.10.v20160621</a><hr/>
</BODY>
</HTML>
jetty動作してました。
次にpostgresqlが動作しているか確認。
[root@server ~]# docker run -d -p 65432:5432 --name hoge postgres:9.5.3
fa2c5570c6f81a0c1df510df15f5c340364b13a49093b543d7cbabf3a0e16933
[root@server ~]# psql -U postgres -h localhost -p 65432
psql (9.5.3)
"help" でヘルプを表示します.
postgres=#
うごいた。
まとめ
dockerイメージを頑張って持ち込めば、インターネットに接続してなくてもdockerの動作ができるぞ!