リモートLinuxマシンのDockerイメージを作る方法

(更新日: 2018/09/02)

手っ取り早くリモートのLinuxマシン(私の場合はVMwareの仮想マシン)からDockerイメージを作りたくなったのでその手順です。

最低限の手順なのでサービス(nginxやhttpd)を動かしたい場合はカスタマイズが必要です。不必要なファイルもコンテナに入るので、サイズを小さくする場合は適当にファイルを削除してください。

きっちり作るにはベースOSに必要最低限のパッケージだけ入れたコンテナを作り、そのコンテナに必要なパッケージを入れて作ります。しかし、コンテナが大きくても構わない、アップデートをベースのコンテナとDockerfileのビルドで行わなくても構わない、といった際にサクっと作るには便利です。

必要な物

ローカル、リモートともにLinuxであることを前提にしています。

  • rsync – リモートとローカル両方
  • ssh – リモートにsshdとローカルにssh
  • docker – ローカル

作る手順

以下のシェルスクリプトを実行し、Docker Imageの元になるディレクトリを作成します。カレントディレクトリにファイルが保存されるので、適当なディレクトリで実行します。

$targetディレクトリの中にリモートファイルが保存されます。

ファイルのコピーが完了したら、次のコマンドでイメージを作ります。

remote.example.com は上のシェルスクリプトで設定した$targetと同じにします。

作ったイメージのbashを起動してコンテナが動作することを確認します。

イメージ作成後の作業

前提として以下を知っているとします。

  • Dockerfile の書き方とdockerの使い方
  • docker-compose.ymlの書き方とdocker-composeの使い方

rsyncでコピーしたファイル全てがイメージの中に入ってしまいます。普通は

  • /homeの中のデータ
  • /varの中のwwwやpgsql、mysqlといったデータ
  • /etcの中の一部の設定ファイル

をdocker-compose.ymlのボリュームにして、変更を恒久的に保存したいファイル類を定義します。rsyncでコピーしたファイル/ディレクトリを丸ごとローカルファイルシステムボリュームにするだけです。

これらはイメージの中に入れる必要がないので別のディレクトリに移動します。

manファイルなどのドキュメント、rpmのキャッシュデータなど、色々と不必要な物があるハズなので要らない物は消します。

この作業を終わらせたら、もう一度 docker import コマンドを実行して小さくしたイメージを作ります。

後はDockerfileでコンテナに保存しない設定ファイルをコピー、起動したいサービスを定義し、docker-compose.ymlを作って必要なディレクトリをボリュームとしてマウントする定義を書きます。

必要な設定/定義を作った後は docker-compose up -d でコンテナを起動すればリモートマシンと同じ環境のコンテナが起動します。

Dockerを知らない方向け

コンテナは仮想マシンではありません。必要な「コマンド」だけを起動します。dnf/yum/aptなどは動作しますが、基本的にsystemdやjournaldやfirewalldは使いません。

例えば、httpdを起動したい場合はsystemctlを使わずに

などとして起動します。他のサービスも同様です。複数のサービスをコンテナの立ち上げと同時に起動したい場合、色々方法がありますが、エントリポイントとなるシェルスクリプトを作って起動します。

詳しくはDockerfile、docker-compose.ymlの書き方のマニュアルを参照してください。

Facebook Comments
Pocket