TL; DR基本的に、私はこれを探しています:
docker Push myimage ssh://myvps01.vpsprovider.net/
Docker Hub /レジストリ全体の根拠を理解できていません。プライベートレジストリを実行できることはわかっていますが、そのためには、サーバーを実際に実行するためのインフラストラクチャをセットアップする必要があります。
私はDockerの内部構造(少なくともファイルシステム)を少し覗いてみましたが、Dockerイメージレイヤーは多少複雑なファイル名を付けたtarballの集まりにすぎないようです。単純なPython分散型プッシュ/プルを実行するスクリプトを作成することは不可能ではないと思いますが、もちろん試しませんでした。そのため、この質問をします。
GitやMercurialのように、Dockerが分散(サーバーレス)プッシュ/プルを実行できなかった技術的な理由はありますか?
最初にどこかでレポサーバーにプッシュしてからアプリサーバーからプルするのではなく、ラップトップで構築した画像をアプリサーバーに直接プッシュすることができたので、これは非常に役立つと思います。あるいは、コンセプトを誤解したばかりで、レジストリは本当に必要な本当に重要な機能ですか?
[〜#〜] edit [〜#〜]これが必要な理由をうまく説明しているコンテキストがある場合は、次のシナリオを検討してください。
現在の最善の解決策は、Dockerマシンを使用してVPSサーバーをポイントして再構築することですが、毎回ソースからコンテナーを構築する必要があるため、展開が遅くなります。
Dockerイメージを特定のホストにプッシュする場合、Dockerにはこれを可能にするすべてのものがすでにあります。次の例は、sshを介してDockerイメージをプッシュする方法を示しています。
docker save <my_image> | ssh -C [email protected] docker load
-C
は、sshがデータストリームを圧縮するためのものです。Dockerレジストリ+ docker pull
コマンドの組み合わせには、不足しているレイヤーのみをダウンロードするという利点があることに注意してください。したがって、Dockerイメージを頻繁に更新する場合(新しいレイヤーを追加するか、最後のいくつかのレイヤーを変更する場合)、docker pull
コマンドを使用すると、sshを通じて完全なdockerイメージをプッシュするよりもネットワークトラフィックが少なくなります。
イメージを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.
このシナリオのためだけにコマンドラインユーティリティを作成しました。
サーバー上に一時的なプライベート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