インターネット環境がないところでもdockerを使いたい

# インターネット接続が出来ない環境でdockerを使いたい
docker pullがno routeな環境でもdockerイメージを実行してコンテナを動作させたいぞ。

# 想定環境

1. プロキシすらなくインターネットに繋がっていない = docker pullできない
2. root権限はある
3. ファイルの持ち込みは問題はない

このような環境でdockerを動かすのが目的です。

# 必要な環境
* docker pull可能な環境

docker imageを取得して持ち込むファイルを作成するために必要

# 解決策
docker saveでdockerイメージをファイル化できる
docker loadでファイルからdockerイメージを読み込むことができる。
docker pullが出来ない環境でもdockerにdockerイメージとして読みこませたことで、該当イメージを自由に起動することができる。

コマンドで言うと、

```bash
docker save -o ファイル名 [imageId]
```

```bash
docker load -i ファイル名
```

の２コマンドを駆使して、dockerイメージを持ち込めば後は自由に使えたということです。

# 具体的にやったこと大まかな流れ
2. dockerイメージをファイルに出力する
3. ファイルを転送して持ち込む
4. dockerイメージを読み込む
5. repository/tagを修正する。
6. 動作確認をする


# やってみる
今回はjettyとpostgresqlの２つのイメージを対象としてやります。
また、インターネット環境のないサーバにもdockerはインストール済でサービスも起動しているものとします。

## docker imageをファイルに出力する
事前にdocker pullして取得しておいたdockerイメージをdocker saveでtarファイルに出力します。

```shell-session
[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などのクライアントを利用してもいいです。

```shell-session
[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にロードします。

```shell-session
[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 コマンドでリポジトリとタグを設定します。

```shell-session
[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のコンテナを実行して動作を確認します。

```shell-session
[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で動作確認します。

```shell-session
[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>&nbsp;<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>&nbsp;<a href="http://eclipse.org/jetty">Powered by Jetty:// 9.3.10.v20160621</a><hr/>

</BODY>
</HTML>
```
jetty動作してました。
次にpostgresqlが動作しているか確認。

```shell-session
[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の動作ができるぞ！