はじめに
会社内の小さな組織内でdockerイメージを共有したい場合、セキュリティ的な理由によりDockerHUBにアップロードできなく、わざわざ組織用のDockerレジストリを構築するか、USB経由などで受け渡しをする必要がある。
そもそもDockerホスト間でのイメージの受け渡しをした事がなかったので、今回それを試してみた。
実行環境
・VMインスタンス3台(GCP上)
【VM#1】
・Ubuntu 20.04 LTS
・docker 19.03
【VM#2】
・Ubuntu 18.04 LTS
・docker 19.03
【VM#3】
・Ubuntu 18.04 LTS
・docker 18.09
手順
VM#1~3にFileZilla
を使って接続できる様に構築し、VM#1の中で作成したイメージをVM#2、3のdockerホストに送り、そのイメージからコンテナ構築が問題なくできるのか試してみる。。
1.VM環境の構築
2.VM#3に適当dockerイメージの作成
3.dockerファイルの受け渡し
1.VM環境の構築
VM#1~3にFileZilla
から接続できる様にしておく
【GCPのVMインスタンスにローカルPCからSSH接続】を参考に。
※手順4のとこでFileZilla
を使って接続しようとすると、秘密鍵の変換(.ppk)が求められるが、変換して.ppkファイルを作成したら、それを秘密鍵に設定して接続できる。
また、鍵生成の時のユーザーは、Googleアカウントと同一にしておく。(イメージファイルをアップロードするタイミングでPermission Errorを防ぐため)
VM#1~3にdockerのインストール
【Dockerコンテナ内のUbuntuではsystemctlは使えない】の手順1を参考に。
今回はインストールコマンドで、以下のコマンドによりバージョンを指定。
# VM#1へのdockerインストール
$ sudo apt install docker-ce=5:19.03.14~3-0~ubuntu-focal
# VM#2へのdockerインストール
$ sudo apt install docker-ce=5:19.03.14~3-0~ubuntu-bionic
# VM#3へのdockerインストール
$ sudo apt install docker-ce=5:18.09.9~3-0~ubuntu-bionic
※Ubuntu 20.04LTSではapt-cache madison docker-ce
コマンドで18.09のバージョンが出てこない。
2.VM#3に適当なdockerイメージを作成
ベースイメージとしてUbuntuを取得
$ docker container run -it -d --name con1 ubuntu:18.04
コンテナに入り適当なソフトをインストール (今回はApache2をインストール)
$ docker attach con1
apt update
apt -y upgrade
apt install -y apache2
exit
変更を加えたコンテナをイメージ化する
$ docker commit con1 org-img:ver1
※コンテナが起動したままだとdocker commit
コマンドができないため、動いているなら止める。
イメージの確認
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
org-img ver1 fec2182ec31c 59 seconds ago 198MB
ubuntu 18.04 2c047404e52d 2 weeks ago 63.3MB
一応イメージが動くか確認
$ docker container run -it -d -p 8080:80 --name temp org-img:ver1 apachectl -D FOREGROUND
3.dockerファイルの受け渡し
VM#3で作成したコンテナイメージをローカルPCに一旦保存
イメージファイルから.tar
ファイルを生成
$ docker save org-img:ver1 > ./org-img.tar
FileZilla でローカルPCに持ってくる。
※圧縮していないため、かなり容量が大きい...
VM#1、VM#2に上記.tar
ファイルを持っていきイメージ取得
今度は FileZilla でローカルPCの.tar
ファイルをVMにアップロード。
.tar
ファイルを入れたディレクトリに移動して下のコマンドを実行。
$ docker load < ./org-img.tar
ホストのイメージ一覧を確認すると、ちゃんとイメージが生成されている。
$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
org-img ver1 fec2182ec31c 2 hours ago 198MB
VM#1、VM#2でそのイメージからコンテナを作成&起動させて使えるか確認
$ docker container run -it -d -p 8080:80 --name temp org-img:ver1 apachectl -D FOREGROUND
ホスト側の8080ポートを開放して、外部IP:8080にちゃんと接続できたため、問題なく受け渡しが完了した。
また、今回VM毎にUbuntuやDockerのバージョンは意図的に少し変えたが、これくらいなら何も問題なく起動できた。