2016-09-07 24 views
6

Có thể tôi đã bỏ sót một thứ gì đó, nhưng tôi đã tạo một hình ảnh docker cục bộ. Tôi có một nút 3 lên và chạy. Hai công nhân và một người quản lý. Tôi sử dụng nhãn như một ràng buộc. Khi tôi khởi chạy một dịch vụ cho một trong những công nhân thông qua ràng buộc, nó hoạt động hoàn hảo nếu hình ảnh đó được công khai.Docker: Các nút công nhân Swarm không tìm thấy hình ảnh được xây dựng cục bộ

Đó là, nếu tôi làm:

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

Sau đó, các dịch vụ redis được gửi đến một trong các nút công nhân và đầy đủ chức năng. Tương tự như vậy, nếu tôi chạy hình ảnh được xây dựng cục bộ của tôi KHÔNG CÓ ràng buộc, vì người quản lý của tôi cũng là một nhân viên, nó được lên kế hoạch cho người quản lý và chạy hoàn toàn tốt. Tuy nhiên, khi tôi thêm các hạn chế nó không thành công vào nút công nhân, từ docker service ps 2l30ib72y65h tôi thấy:

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

Có cách nào để làm cho người lao động được tiếp cận với những hình ảnh địa phương vào nút quản lý của bầy đàn? Nó có sử dụng một cổng cụ thể có thể không mở được không? Nếu không, tôi phải làm gì - chạy một kho lưu trữ cục bộ?

Trả lời

7

Nút người quản lý không tự chia sẻ hình ảnh cục bộ. Bạn cần phải quay lên một máy chủ đăng ký (hoặc người dùng hub.docker.com). Các nỗ lực cần thiết cho điều đó là không phải là rất có ý nghĩa:

# first create a user, updating $user for your environment: 
if [ ! -d "auth" ]; then 
    mkdir -p auth 
fi 
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 
+0

ngọt - cảm ơn bạn! Trước khi tôi chấp nhận như là câu trả lời mặc dù, (tôi không thích mâu thuẫn!), Có vẻ như không nhất quán rằng nút Manager KHÔNG nhìn thấy hình ảnh cục bộ (không phải từ docker chạy, nhưng từ docker service create) và các nút Worker không ? – JoeG

+0

Từ góc độ người dùng, có thể. Nhưng từ quan điểm mã, mỗi máy chủ Docker là một môi trường riêng biệt. Khi bạn xây dựng, bạn đang tạo hình ảnh đó trên máy chủ, không phải trên bầy đàn. Logic trên 'dịch vụ tạo' là lần đầu tiên sử dụng những gì được lưu trữ trên máy chủ, và sau đó rơi trở lại để kéo hình ảnh đó từ sổ đăng ký. Mà xảy ra là một hành vi giống hệt với 'docker run'. – BMitch

+0

Tôi có thể thiếu cái gì đó, nhưng nút công nhân trong bầy đàn đề cập đến sổ đăng ký/hình ảnh này như thế nào? Tôi đã thử đặt localhost: 5000/my/image vào tệp yml của tôi, nhưng các nút công nhân của tôi vẫn không thể tìm thấy hình ảnh. Có cách nào để thực hiện công việc này mà không phải đăng nhập vào các nút công nhân không? –

-1

hình ảnh phải được tải vào bộ nhớ cache địa phương trên mỗi nút. Lý do là nếu bạn lưu trữ tất cả các hình ảnh của bạn trên một nút duy nhất và nút đó đi xuống, bầy đàn sẽ không có cách nào để sinh ra nhiệm vụ mới (container) trên các nút khác.

Cá nhân tôi chỉ cần kéo một bản sao của tất cả các hình ảnh trên mỗi nút trước khi bắt đầu dịch vụ. Điều đó có thể được thực hiện trong một kịch bản bash hoặc Makefile (ví dụ dưới đây)

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 
+2

Tôi tin rằng OP đang tìm kiếm giải pháp bao gồm hình ảnh được xây dựng cục bộ chứ không phải hình ảnh từ hub.docker.com. – BMitch

+1

@BMitch Bạn nói đúng. Tôi đã không đọc câu hỏi một cách chính xác. Đã đến lúc đánh giường rồi. – Alkaline

0

Đối với tôi làm việc này từng bước buide, đó là không an toàn:

# 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 
+0

Tôi có thể thiếu một cái gì đó, nhưng làm thế nào để nút công nhân trong bầy đề cập đến sổ đăng ký/hình ảnh này? Tôi đã thử đặt 'localhost: 5000/my/image' vào tệp yml của mình, nhưng các nút công nhân của tôi vẫn không thể tìm thấy hình ảnh. Có cách nào để thực hiện công việc này mà không phải đăng nhập vào các nút công việc không? –

+0

cố gắng sử dụng tên máy chủ thay vì 'localhost' – elkoo

+0

Làm thế nào bạn có thể biết tên máy chủ của sổ đăng ký? – Philippe

Các vấn đề liên quan