web-dev-qa-db-ja.com

DockerイメージプッシュオーバーSSH(分散)

TL; DR基本的に、私はこれを探しています:

docker Push myimage ssh://myvps01.vpsprovider.net/

Docker Hub /レジストリ全体の根拠を理解できていません。プライベートレジストリを実行できることはわかっていますが、そのためには、サーバーを実際に実行するためのインフラストラクチャをセットアップする必要があります。

私はDockerの内部構造(少なくともファイルシステム)を少し覗いてみましたが、Dockerイメージレイヤーは多少複雑なファイル名を付けたtarballの集まりにすぎないようです。単純なPython分散型プッシュ/プルを実行するスクリプトを作成することは不可能ではないと思いますが、もちろん試しませんでした。そのため、この質問をします。

GitやMercurialのように、Dockerが分散(サーバーレス)プッシュ/プルを実行できなかった技術的な理由はありますか?

最初にどこかでレポサーバーにプッシュしてからアプリサーバーからプルするのではなく、ラップトップで構築した画像をアプリサーバーに直接プッシュすることができたので、これは非常に役立つと思います。あるいは、コンセプトを誤解したばかりで、レジストリは本当に必要な本当に重要な機能ですか?

[〜#〜] edit [〜#〜]これが必要な理由をうまく説明しているコンテキストがある場合は、次のシナリオを検討してください。

  • 私のラップトップ上で行われた開発、テスト(OSX、Dockerマシンの実行、サービスと依存関係の定義にdocker-composeを使用)
  • スクリプトを使用してライブ環境にデプロイします(自己記述、bash、開発マシンへの依存関係がほとんどない、基本的にはDockerマシンのみ)
  • SSHアクセスとDockerデーモン以外の依存関係が非常に少ない新しいVPSにデプロイします。
  • どこでも実行されている「永続的な」サービスはありません。つまり、永続的に実行されているレジストリをホストしたくありません(特に、すべてのVPSインスタンスにアクセスできませんが、巧妙なSSHトンネリングで解決できる可能性があります)。

現在の最善の解決策は、Dockerマシンを使用してVPSサーバーをポイントして再構築することですが、毎回ソースからコンテナーを構築する必要があるため、展開が遅くなります。

30
Krumelur

Dockerイメージを特定のホストにプッシュする場合、Dockerにはこれを可能にするすべてのものがすでにあります。次の例は、sshを介してDockerイメージをプッシュする方法を示しています。

docker save <my_image> | ssh -C [email protected] docker load
  • docker save は、Dockerイメージの1つ(そのレイヤーを含む)のtarアーカイブを生成します
  • -Cは、sshがデータストリームを圧縮するためのものです。
  • docker load は、tarアーカイブからdockerイメージを作成します

Dockerレジストリ+ docker pullコマンドの組み合わせには、不足しているレイヤーのみをダウンロードするという利点があることに注意してください。したがって、Dockerイメージを頻繁に更新する場合(新しいレイヤーを追加するか、最後のいくつかのレイヤーを変更する場合)、docker pullコマンドを使用すると、sshを通じて完全なdockerイメージをプッシュするよりもネットワークトラフィックが少なくなります。

34
Thomasleveil

イメージをDockerホストに保存/ロードすることと、レジストリ(プライベートまたはハブ)にプッシュすることは、2つの異なるものです。

以前の@Thomasleveilはすでに対処しています。

後者は実際にdoesが必要なレイヤーをプッシュするだけの「スマート」を持っています。

プライベートレジストリといくつかの派生画像を使用して、これを自分で簡単にテストできます。

2つの画像があり、一方が他方から派生している場合は、次のようにします。

docker tag baseimage myregistry:5000/baseimage
docker Push myregistry:5000/baseimage

レジストリでまだ見つからないすべてのレイヤーをプッシュします。ただし、次に派生イメージをプッシュすると、次のようになります。

docker tag derivedimage myregistry:5000/derivedimage
docker Push myregistry:5000/derivedimage

1つのレイヤーのみがプッシュされることに気づくかもしれません-Dockerfileが1つのレイヤーのみを必要とするように構築されている場合(例: Dockerfile Best Practises のように、RUNパラメーターのチェーン).

Docker Hostで、Dockerisedプライベートレジストリを実行することもできます。

Containerized Docker registry を参照してください

私の知る限り、これを書いている時点では、レジストリのプッシュ/プル/クエリメカニズムはSSHをサポートしていませんが、HTTP/HTTPSのみをサポートしています。それはGitや友人とは異なります。

HTTP経由でプライベートレジストリを実行する方法については、 安全でないレジストリ を参照してください。特に、Dockerエンジンオプションを変更して再起動する必要があることに注意してください。

/ etc/default/dockerファイルまたは/ etc/sysconfig/dockerを開いて編集します。

オペレーティングシステムに応じて、エンジンデーモンの起動オプション。

DOCKER_OPTS行を編集(または追加)し、-insecure-registryフラグを追加します。

このフラグは、たとえばレジストリのURLを取ります。

DOCKER_OPTS = "-insecure-registry myregistrydomain.com:5000"

構成ファイルを閉じて保存します。

Dockerデーモンを再起動します

また、HTTPSを使用できるようにするための自己署名証明書の使用方法についても説明します。

自己署名証明書の使用

[...]

これは、安全でないレジストリソリューションよりも安全です。レジストリにアクセスするすべてのDockerデーモンを構成する必要があります

Generate your own certificate:

mkdir -p certs && openssl req \ -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \ -x509 -days 365 -out certs/domain.crt

Be sure to use the name myregistrydomain.com as a CN.

Use the result to start your registry with TLS enabled

Instruct every docker daemon to trust that certificate.

This is done by copying the domain.crt file to /etc/docker/certs.d/myregistrydomain.com:5000/ca.crt.

Don’t forget to restart the Engine daemon.
4
Marakai

このシナリオのためだけにコマンドラインユーティリティを作成しました。

サーバー上に一時的なプライベートDockerレジストリーをセットアップし、ローカルホストからSSHトンネルを確立し、イメージをプッシュし、それ自体をクリーンアップします。

docker saveに対するこのアプローチの利点は、新しいレイヤーのみがサーバーにプッシュされるため、アップロードが速くなることです。

多くの場合、dockerhubなどの中間レジストリを使用することは望ましくなく、面倒です。

https://github.com/coherenceapi/docker-Push-ssh

インストール:

pip install docker-Push-ssh

例:

docker-Push-ssh -i ~/my_ssh_key [email protected] my-docker-image

最大の注意点は、ローカルIPを手動でdockerのinsecure_registries構成に追加する必要があることです。

https://stackoverflow.com/questions/32808215/where-to-set-the-insecure-registry-flag-on-mac-os

3
brthornbury