[英]How to get remote access to a private docker-registry?
我正在嘗試使用以下圖像設置私有docker注冊表: https : //github.com/docker/docker-registry
只需運行:
docker run -p 5000:5000 registry
我只能從localhost拉/從這個存儲庫推送/但是如果我嘗試從另一台機器(使用同一局域網上的私有地址)訪問它,它會失敗並顯示錯誤消息:
*2014/11/03 09:49:04 Error: Invalid registry endpoint https ://10.0.0.26:5000/v1/':
Get https:// 10.0.0.26:5000/v1/_ping: Forbidden. If this private
registry supports only HTTP or HTTPS with an unknown CA certificate,
please add `--insecure-registry 10.0.0.26:5000` to the daemon's
arguments. In the case of HTTPS, if you have access to the registry's
CA certificate, no need for the flag; simply place the CA certificate
at /etc/docker/certs.d/10.0.0.26:5000/ca.crt*
令我發瘋的是我可以使用: curl 10.0.0.26:5000
和/或curl 10.0.0.26:5000/v1/search
成功訪問它
我也不明白我應該在哪里以及如何通過--insecure-registry
標志。
好的 - 經過一天的挖掘后,我找到了解決方案。
對於1.12.1以下的碼頭:
事實證明,新的客戶端版本拒絕使用沒有SSL的私有注冊表。
要解決此問題 - 應使用不安全標志啟動客戶端計算機上的守護程序:
只需輸入:
sudo service docker stop # to stop the service
然后
sudo docker -d --insecure-registry 10.0.0.26:5000
(用您自己的IP地址替換10.0.0.26
)。
我希望docker的人能把這個選項添加到pull / push命令行......
編輯 - altenantively - 您可以將標志添加到/ etc / default / DOCKER_OPTS
env變量...然后sudo service docker restart
再次編輯 - 看起來這個碼頭工人正在使用它 - 很快就會出現修復: https : //github.com/docker/docker/pull/8935
對於docker 1.12.1:
請按照以下vikas027的答案(對centos有效)
這對CentOS 7.2和Docker 1.12.1 (最新的日期) 有用 。 我的私有注冊表v2運行在192.168.1.88:5000
,相應地進行更改。 如果您有多個注冊表,這也適用,只需繼續添加--insecure-registry IP:Port
$ sudo vim /usr/lib/systemd/system/docker.service
#ExecStart=/usr/bin/dockerd
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.88:5000
$
$ sudo systemctl stop docker
$ sudo systemctl daemon-reload
$ systemctl start docker
編輯配置文件“/ etc / default / docker”
sudo vi / etc / default / docker
在文件末尾添加行
DOCKER_OPTS =“$ DOCKER_OPTS --insecure-registry = 192.168.2.170:5000”
(用您自己的IP地址替換192.168.2.170)
並重新啟動docker服務
sudo服務碼頭重啟
好。 以下是我如何使用它。 如果您在docker 1.3.2或更高版本中看到此錯誤,請執行此操作
轉到/etc/sysconfig/docker
other_args="--insecure-registry 10.0.0.26:5000"
並運行
sudo service docker restart
我發現以下內容非常有用,因為它討論了如何配置Docker服務本身。 https://docs.docker.com/articles/systemd/
與systemctl命令上的這篇文章一起https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units
我在基於Centos 7的容器中使用了以下一系列命令,其中注冊表圖像由“docker pull registry:2.1.1”獲得
sudo mkdir -p /etc/systemd/system/docker.service.d
cd /etc/systemd/system/docker.service.d
sudo touch override.conf
sudo nano override.conf
在override.conf里面添加了以下內容。
[Service]
ExecStart=
ExecStart=/usr/bin/docker -d -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --insecure-registry 10.2.3.4:5000
注意第一個,空白,ExecStart =清除已經存在的任何內容,因此請務必添加您希望保留的/usr/lib/systemd/system/docker.service ExecStart =語句中的任何內容。
如果未指定-d(守護程序)選項,則會出現“請僅指定一個-H”錯誤。
發出以下一系列命令后,我可以看到我的覆蓋。
sudo systemctl stop docker
sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl status docker
docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled)
Drop-In: /etc/systemd/system/docker.service.d
└─override.conf
Active: active (running) since Thu 2015-09-17 13:37:34 AEST; 7s ago
Docs: https://docs.docker.com
Main PID: 5697 (docker)
CGroup: /system.slice/docker.service
└─5697 /usr/bin/docker -d -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --insecure-registry 10.2.3.4:5000
注意:狀態消息中的Loaded:和Drop-In:行提供的信息對於檢查預先存在的docker守護程序發生的情況非常有用。
注意:還可以在Loaded:docker.service文件中查看EnvironmentFile =以獲取更多線索。
使用以下命令將{YOUR_REGISTRY}替換為您的注冊表
boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry {YOUR_REGISTRY}\"' | sudo tee -a /var/lib/boot2docker/profile && sudo /etc/init.d/docker restart"
編輯docker.service文件,在-d標志后添加--insecure-registry xxxx,重啟docker
這是唯一對我有用的東西,DOCKER_OPTS沒有任何效果
Docker 1.12.1
對於CentOS 7.2
/usr/lib/systemd/system/docker.service
#ExecStart=/usr/bin/dockerd
ExecStart=/usr/bin/dockerd --insecure-registry my-docker-registry.com:5000
對於ubuntu 16.04
/lib/systemd/system/docker.service
#ExecStart=/usr/bin/dockerd -H fd://
ExecStart=/usr/bin/dockerd --insecure-registry my-docker-registry.com:5000 -H fd://
sudo systemctl stop docker
sudo systemctl daemon-reload
sudo systemctl start docker
似乎--insecure-registry選項可以在它和注冊表ID之間使用和不使用“=”。
我發現docker客戶端版本和注冊表docker版本必須匹配,否則你會遇到連接問題,盡管已經有了一切。
這是基於Centos 7和Docker 1.12上的vikas027的答案
由於我支持代理,我的完整解決方案是......
/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="FTP_PROXY={{MY_PROXY}}"
Environment="ftp_proxy={{MY_PROXY}}"
Environment="HTTPS_PROXY={{MY_PROXY}}"
Environment="https_proxy={{MY_PROXY}}"
Environment="HTTP_PROXY={{MY_PROXY}}"
Environment="http_proxy={{MY_PROXY}}"
Environment="NO_PROXY=localhost,127.0.0.1,{{MY_INSECURE_REGISTRY_IP}}"
Environment="no_proxy=localhost,127.0.0.1,{{MY_INSECURE_REGISTRY_IP}}"
/usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry {{MY_INSECURE_REGISTRY_IP}}:5000
別忘了重啟:)
sudo systemctl daemon-reload; sudo systemctl restart docker;
兩步解決方案(沒有--insecure-registry
):
/etc/docker/certs.d/$HOSTNAME/
目錄 mkdir -p /etc/docker/certs.d/10.0.0.26:5000
echo -n | openssl s_client -connect 10.0.0.26:5000 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/docker/certs.d/10.0.0.26:5000/registry.crt
現在您的docker將信任您的自簽名證書。
在docker中設置本地不安全注冊表以及代理:
1)在ubuntu中添加以下標志--insecure-registry IP:文件/ etc / default / docker中DOCKER_OPTS下的端口
1.1)配置no_proxy env變量以繞過本地IP /主機名/域名...因為代理可以拋出交互式消息...就像繼續這個中間消息混淆docker客戶端並最終超時...
1.2)如果配置了域名...那么如果不使用DNS,請不要忘記更新/ etc / hosts文件。
1.3)在/ etc / default / docker中設置env變量http_proxy和https_proxy ...因為它可以從公司外部中心下載圖像。 格式為http_proxy = http:// username:password @ proxy:port
2)重啟docker服務...如果安裝為服務,請使用sudo service docker restart
3)重啟注冊表容器[sudo docker run -p 5000:5000注冊表:2]
4)使用sudo docker tag imageid標記所需的圖像IP:port / imagename / tagname ifany
5)推送圖像... sudo docker push ip:port / imagename
6)如果你想從另一台機器拉出圖像說B沒有TLS / SSL,那么在B中應用setps 1,1.1和2.如果這些改變沒有在機器B中完成...拉動將失敗。
為了節省您的麻煩,為什么不使用gitlab提供的免費私有docker注冊服務 - 效果很好
https://about.gitlab.com/2016/05/23/gitlab-container-registry/
他們的注冊表是安全的,所以你不會有任何問題
Ubuntu 16.04
使用內容創建(不存在)文件/etc/systemd/system/docker.service.d/registry.conf
:
[Service]
#You need the below or you 'ExecStart=' or you will get and error 'Service has more than one ExecStart= setting, which is only allowed'
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 10.20.30.40:5000
然后
sudo systemctl stop docker
sudo systemctl daemon-reload
sudo systemctl start docker
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.