web-dev-qa-db-ja.com

pullコマンドを使用せずにDockerイメージをダウンロードするにはどうすればよいですか?

たとえば、Firefoxを使用して、組み込みのdocker-pullを使用せずにDockerイメージ/コンテナーをダウンロードする方法はありますか。

会社のファイアウォールとプロキシによってブロックされており、そこに穴を開けることができません。

私の問題は、Dockerを使用して画像を取得できないことです。つまり、ファイアウォールによってブロックされているため、Dockerの保存/プルやその他のDocker提供の機能です。

33
Ephreal

代替案-これは、組織で couchbase でプロキシによってブロックされたイメージに対して行ったことです。

私のラップトップで(OS X)

~$ $ docker save couchbase > couchbase.tar
~$ ls -lh couchbase.docker
-rw-------  1 vikas  devops   556M 12 Dec 21:15 couchbase.tar
~$ xz -9 couchbase.tar
~$ ls -lh couchbase.tar.xz
-rw-r--r--  1 vikas  staff   123M 12 Dec 22:17 couchbase.tar.xz

次に、圧縮されたtarボールをDropboxにアップロードし、作業用マシンにダウンロードしました。何らかの理由でDropboxが開いていました:)

職場のラップトップ(CentOS 7)

$ docker load < couchbase.tar.xz

参考文献

29
vikas027

私は自分でこの問題に対処しなければなりませんでした-インターネットにアクセスできる制限されたマシンからイメージをダウンロードしますが、Dockerクライアントを備えた別の制限されたマシンで使用するDockerクライアントはありませんが、インターネットにアクセスできません。質問を DevOps Stack Exchangeサイト に投稿しました:

Dockerコミュニティの助けを借りて、問題の解決策を見つけることができました。以下は私の解決策です。


つまり、 Moby Project には Moby GitHubアカウント にシェルスクリプトがあり、このスクリプトは Docker Hub Dockerにインポートする:

スクリプトの使用構文は次のとおりです。

download-frozen-image-v2.sh target_dir image[:tag][@digest] ...

その後、画像をtarおよびdocker loadでインポートできます。

tar -cC 'target_dir' . | docker load

スクリプトが期待どおりに機能することを確認するために、Docker HubからUbuntuイメージをダウンロードし、Dockerにロードしました。

user@Host:~$ bash download-frozen-image-v2.sh ubuntu ubuntu:latest
user@Host:~$ tar -cC 'ubuntu' . | docker load
user@Host:~$ docker run --rm -ti ubuntu bash
root@1dd5e62113b9:/#

実際には、最初にインターネットクライアント(Dockerがインストールされているnotを行う)からターゲット/宛先マシン(これはdoesDockerがインストールされている):

user@nodocker:~$ bash download-frozen-image-v2.sh ubuntu ubuntu:latest
user@nodocker:~$ tar -C 'ubuntu' -cf 'ubuntu.tar' .
user@nodocker:~$ scp ubuntu.tar user@hasdocker:~

次に、ターゲットホストでイメージをロードして使用します。

user@hasdocker:~ docker load ubuntu.tar
user@hasdocker:~ docker run --rm -ti ubuntu bash
root@1dd5e62113b9:/#
12
igal

まず、Dockerデーモンがプロキシを使用するように構成されているかどうかを確認します。たとえば、boot2dockerとdocker-machineでは、 これはdocker-machine createで実行されます で、--engine-envオプションを使用します。

これが単なる証明書の問題である場合(つまり、FirefoxがDocker Hubにアクセスする場合)、 その証明書を試してインストールする

openssl s_client -connect index.docker.io:443 -showcerts /dev/null | openssl x509 -outform PEM > docker.pem
Sudo cp docker.pem /etc/pki/ca-trust/source/anchors/
Sudo update-ca-trust
Sudo systemctl restart docker
Sudo docker run hello-world

他の回避策(推奨されるソリューションではありません) --insecure-registryを使用して証明書に依存せずにDocker Hubにアクセスします

ファイアウォールがDockerプルをアクティブにブロックしている場合、FirefoxからDocker Hubにアクセスすることさえできない場合、 docker save/docker load イメージアーカイブが必要です。 Docker Hubにアクセスしたマシン(およびdocker pullが成功したマシン)から保存します。 (もちろん、ITシステム管理者の承認後に)企業のマシンにロードします。

注:多くの場合、ダウンロードする必要がある他の画像の上に基づいているため、画像を簡単に「ただ」ダウンロードすることはできません。それがdocker pullがあなたのためにすることです。そして、それがdocker saveも行うことです(all必要な画像で構成される1つのアーカイブを作成します)。

OP Ephreal が追加されます コメント内

[I] corpのイメージも機能しませんでした。しかし、私はDockerファイルをダウンロードし、自分自身を最初からイメージを再作成できることを発見しました。これは、イメージのダウンロードと本質的に同じです。

2
VonC

OSに依存しないソリューションを持つためにpythonスクリプトを適応しました: docker-drag

そのように使用すると、docker loadを使用してインポートできるTARアーカイブが作成されます。

python docker_pull.py hello-world
python docker_pull.py Alpine:3.9
python docker_pull.py kalilinux/kali-linux-docker
1
Ham Co

そのため、定義上、Dockerデーモンはレイヤーを1つずつ組み立てるため、実際にはDockerプルクライアントコマンドはDockerデーモンと通信する必要があります。

POSTリクエストと考えてください-Dockerデーモン自体の状態の変化を引き起こしています。プルするときに、HTTPを介して何かを「プル」することはありません。

DockerレジストリからRESTを介してすべての個々のレイヤーをプルできますが、実際にはプルと同じセマンティクスではありません。プルは、デーモンにすべての気になる画像のレイヤー。

1
jayunit100

会社のファイアウォール(およびポリシー)がリモートSSHサーバーへの接続を許可している場合は、別の選択肢があります。その場合、単純にSSHトンネルを設定して、トラフィックをDockerレジストリにトンネリングできます。

0
Kaveh Hadjari