web-dev-qa-db-ja.com

Docker:ローカルで構築されたイメージを見つけられないSwarmワーカーノード

何かを逃したかもしれませんが、ローカルのDockerイメージを作成しました。 3ノードの群れが稼働しています。 2人の労働者と1人のマネージャー。ラベルを制約として使用します。制約を介してワーカーの1つにサービスを起動すると、そのイメージが公開されている場合は完全に機能します。

つまり、私がそうする場合:

docker service create --name redis --network my-network  --constraint node.labels.myconstraint==true redis:3.0.7-Alpine

次に、redisサービスがワーカーノードの1つに送信され、完全に機能します。同様に、制約なしでローカルに構築されたイメージを実行すると、マネージャーもワーカーであるため、マネージャーにスケジュールされ、完全に正常に実行されます。ただし、制約を追加すると、ワーカーノードで失敗します。docker service ps 2l30ib72y65hから次のように表示されます。

... Shutdown       Rejected 14 seconds ago  "No such image: my-customized-image"

ワーカーが群れのマネージャーノード上のローカルイメージにアクセスできるようにする方法はありますか?開いていない可能性のある特定のポートを使用していますか?そうでない場合、私は何をすべきですか?ローカルリポジトリを実行しますか?

9
JoeG

マネージャーノードは、それ自体からローカルイメージを共有しません。レジストリサーバー(またはユーザーhub.docker.com)を起動する必要があります。そのために必要な労力はそれほど重要ではありません。

# first create a user, updating $user for your environment:
if [ ! -d "auth" ]; then
  mkdir -p auth
fi
touch auth/htpasswd
chmod 666 auth/htpasswd
docker run --rm -it \
  -v `pwd`/auth:/auth \
  --entrypoint htpasswd registry:2 -B /auth/htpasswd $user
chmod 444 auth/htpasswd

# then spin up the registry service listening on port 5000
docker run -d -p 5000:5000 --restart=always --name registry \
  -v `pwd`/auth/htpasswd:/auth/htpasswd:ro \
  -v `pwd`/registry:/var/lib/registry \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Local Registry" \
  -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
  -e "REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/var/lib/registry" \
  registry:2

# then Push your image
docker login localhost:5000
docker tag my-customized-image localhost:5000/my-customized-image
docker Push localhost:5000/my-customized-image

# then spin up the service with the new image name
# replace registryhost with ip/hostname of your registry Docker Host
docker service create --name custom --network my-network \
  --constraint node.labels.myconstraint==true --with-registry-auth \
  registryhost:5000/my-customized-image
9
BMitch

私にとって、このステップバイステップガイドは機能しました。ただし、安全ではありません。

# Start your registry
$ docker run -d -p 5000:5000 --name registry registry:2

# Tag the image so that it points to your registry
$ docker tag my_existing_image localhost:5000/myfirstimage

# Push it to local registry/repo
$ docker Push localhost:5000/myfirstimage

# For verification you can use this command:
$ curl -X GET http://localhost:5000/v2/_catalog
# It will print out all images on repo.

# On private registry machine add additional parameters to enable insecure repo:
ExecStart=/usr/bin/dockerd --insecure-registry IP_OF_CURRENT_MACHINE:5000

# Flush changes and restart Docker:
$ systemctl daemon-reload
$ systemctl restart docker.service

# On client machine we should say docker that this private repo is insecure, so create or modifile the file '/etc/docker/daemon.json':
{ "insecure-registries":["hostname:5000"] }

# Restart docker:
$ systemctl restart docker.service

# On swarm mode, you need to point to that registry, so use Host name instead, for example: hostname:5000/myfirstimage
1
elkoo

画像はローカルキャッシュにダウンロードする必要があります各ノード上。その理由は、すべての画像を1つのノードにのみ保存し、そのノードがダウンした場合、swarmは他のノードに新しいタスク(コンテナー)を生成する方法がないためです。

私は個人的に、サービスを開始する前に、各ノード上のすべてのイメージのコピーをプルするだけです。これは、bashスクリプトまたはMakefile(例:以下)で実行できます。

pull:
  @for node in $$NODE_LIST; do
    OPTS=$$(docker-machine config $$node)
    set -x
    docker $$OPTS pull postgres:9.5.2
    docker $$OPTS pull elasticsearch:2.3.3
    docker $$OPTS pull schickling/beanstalkd
    docker $$OPTS pull gliderlabs/logspout
    etc ...
    set +x
done
0
Bernard