Docker API'sını TCP üzerinden nasıl gösterebilirim?


13

Portainer kullanıyorum ve uzak uç noktaları yönetemiyorum. Uzak docker düğümlerine bağlanmak için komut satırını kullanmayı denedim, ancak bir mesaj aldım Cannot connect to the Docker daemon at tcp://<remote_ip>:<port>. Is the docker daemon running?.

Evet, koşuyorlar. Kendimi docker grubuna ekledim ve SSHing ile docker'a düğümlere erişebiliyorum. Ancak herhangi bir docker düğümüne uzaktan erişemiyorum.

/etc/defaultEklemek / rahatsız etmek için değiştirdimDOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

Ben de değiştirdim /etc/init.d/dockerve /etc/init/docker.confdahil etmek DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock".

Docker hizmetini yeniden başlattım, oturumu kapattım ve işlemde birden çok kez oturum açtım, ancak yine de uzak düğüme bağlanamıyorum. IP'yi geçerek yerel düğüme bile bağlanamıyorum.

Neyi kaçırdım? Hangi dosyadaki hangi yapılandırma API'yi TCP üzerinden gösterir?

user@hostname:~$ docker -H tcp://<REMOTE_IP>:2375 info
Cannot connect to the Docker daemon at tcp://<REMOTE_IP>:2375. Is the docker daemon running?
user@hostname:~$ docker -H tcp://127.0.0.1:2375 info
Cannot connect to the Docker daemon at tcp://127.0.0.1:2375. Is the docker daemon running?
user@hostname:~$ docker -H tcp://<LOCAL_IP>:2375 info
Cannot connect to the Docker daemon at tcp://<LOCAL_IP>:2375. Is the docker daemon running?
user@hostname:~$

Edit: Running bunu ps aux | grep -i dockerdöndürür -

root      3581  0.1  0.2 596800 41540 ?        Ssl  04:17   0:35 /usr/bin/dockerd -H fd://
root      3588  0.0  0.0 653576 14492 ?        Ssl  04:17   0:18 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc

2375 dinliyor mu? ss -ntl
jscott

Hayır. 2375'te dinleyen bir şey yok. Ve hangi dosyada hangi yapılandırmanın bunu etkilediğini anlayamıyorum. ps auxBu yardımcı olursa cevabımın çıktısını ekledim.
Lord Loh.

Benzer şeyler denedim ve /et / default / docker, /etc/init/docker.conf ve /etc/init.d/docker dosyalarının Ubuntu 16.04'te docker-ce kurulumu ile yok sayıldığından şüpheleniyorum, herkes onaylayabilir ? Ben "hizmet docker durumu" çalıştırdığımda gerçekten ne olduğunu düşünüyorum "sistemctl durum docker", diğer bir yönetim sistemi.
chrisinmtown

Yanıtlar:


22

Ivan Krizsan'ın gönderisi sayesinde bir çözüm buldum .

/lib/systemd/system/docker.serviceHattı değiştirmek için Ubuntu 16.04.2 LTS sistemimde düzenleme yapmak zorunda kaldım

ExecStart=/usr/bin/docker daemon -H fd:// -H tcp://0.0.0.0:

sonra

sudo systemctl daemon-reload
sudo systemctl restart docker.service

ve her şey amele :-). Bir sonraki adım, ele geçirilen docker daemon formunun nasıl korunacağını bulmaktır.


1
Bu değişikliğin Dockerd'ın 17.06 docker-ce ver ile Ubuntu 16.04 üzerinde HTTP isteklerini dinlemesine neden olduğunu onaylıyorum. Hizmet betiğini doğrudan değiştirmek yanlış geliyor.
chrisinmtown

7
Asla docker servis betiğini (veya herhangi bir servis betiğini) doğrudan düzenlemeyin. SystemD'in yerleşik bir düzenleme özelliği vardır. Use systemctl edit docker.serviceve systemctl, düzenlemelerinizle yeni bir dosya oluşturur. Bu, bir güncellemenin değişikliklerinizi silmesini önler. SystemD çalışma zamanında iki dosyayı birleştirir. Burada iyi bir belge: digitalocean.com/community/tutorials/…
Routhinator

Teşekkürler! Bu son derece yararlı. Güncellemeler sırasında uyarı almaya devam ediyorum. Şuna bakacağım: _)
Lord Loh.

4
Ubuntu Server 18.04'te şu şekilde çalıştı:ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:4243
LUCIAN ALEXA

-H tcp://Ayarı kendiliğinden kullandığımda, ayar -H fd://yapamıyorum ve istemci komutları veremiyorum, örneğin .., liman işçisi bilgisi, liman işçisi sürümü, vb.
Chris F

3

/ Etc / default dizini dağıtım sahiplerinin yapılandırma dosyalarını koydukları yerdir. Docker'ı doğrudan Docker depolarından yüklerseniz, bu dizin kullanılmaz.

/ Lib / systemd dizini, paketlerin systemd dosyalarını yükleyeceği ve yükseltmedeki değişikliklerin üzerine yazacağı yerdir. Bunu kullanırsanız, değişiklikleriniz kaybolacaktır.

Devam eden bir systemd birim dosyasında kendi değişikliklerinizi yapmak için, /etc/systemd/system/docker.service.d/ içinde bir birim dosyası oluşturabilirsiniz, örneğin burada benim standart /etc/systemd/system/docker.service. d / override.conf:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd

Bu geçersiz kılma, sistemd'den dockerd arka plan programının tüm komut satırı bayraklarını sıfırlar. İşiniz bittiğinde, docker tarafından kullanılan /etc/docker/daemon.json içindeki her ayarı geçersiz kılabilir ve ayara bağlı olarak, arka plan programı yeniden başlatılmadan yeniden yüklenebilir. Örneğin /etc/docker/daemon.json örneği:

{
"debug": false,
"experimental": true,
"hosts": ["fd://", "tcp://0.0.0.0:2376"],
"labels": ["foo=bar", "fez=baz"],
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"},
"storage-driver": "overlay2",
"tlscacert": "/etc/docker/certs/ca.pem",
"tlscert": "/etc/docker/certs/host-cert.pem",
"tlskey": "/etc/docker/certs/host-key.pem",
"tlsverify": true
}

Amaçlarınız için, ana bilgisayarları ayarlamak için sadece oradaki çizgiye ihtiyacınız vardır.

Yukarıdaki yapılandırma dosyasının son derece önemli bir kısmı TLS ayarlarıdır. İstemci ve sunucu arasında karşılıklı TLS yapılandırmazsanız ve ağda dinlemek için docker'ı açarsanız, parola olmadan kök oturum açmaya izin verilen açık bir telnet sunucusunun eşdeğerini çalıştırıyorsunuz demektir. Telnet üzerinden ssh'yi veya kök hesabınız için bir parola kullanmayı tercih ediyorsanız, TLS'yi yapılandırmanız gerekir. Docker API bağlantı noktaları internette sık sık taranır ve bu yapılandırma adımını atlarsanız kısa bir süre içinde ana makinenize yüklenmiş kötü amaçlı yazılımları bulacaksınız.

İstemci ve sunucu için TLS anahtarlarının nasıl yapılandırılacağıyla ilgili tüm ayrıntıları şu adreste bulabilirsiniz: https://docs.docker.com/engine/security/https/


1
Docker servisinin gelecekteki güncellemelerinden kurtulacak çok iyi bir cevap. Bunu yapmanın doğru yolu budur.
Fopedush

2

Docker arka plan programınızı yeniden yapılandırmak ve yeniden başlatmak istemiyorsanız ncat( nmappaketten) kullanarak unix soketini bir TCP soketine köprüleyebilirsiniz :

ncat -lknvp 2375 -c "ncat -U /var/run/docker.sock"

Alternatif olarak, socat veya diğer araçları kullanabilirsiniz .


inanılmaz! Bu komutu arka planda tutabilir miyim? kapattığımda terminal bağlantım
Felix

ah buldum nohupve&
Felix

0

Docker arka plan programının bağlantıları nerede dinlediğini nasıl yapılandıracağınızı açıklayan resmi bir belge vardır .

systemd vs daemon.json

Docker'ı hem systemd birim dosyasını hem da daemon.json dosyasını kullanarak bağlantıları dinleyecek şekilde yapılandırmak, Docker'ın başlamasını engelleyen bir çakışmaya neden olur.

Systemd birim dosyası ile uzaktan erişimi yapılandırma

  1. Metin düzenleyicisinde docker.service için geçersiz kılma dosyasını açmak için sudo systemctl edit docker.service komutunu kullanın.

  2. Kendi değerlerinizi değiştirerek aşağıdaki satırları ekleyin veya değiştirin.

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
    
  3. Dosya 'yı kaydet.

  4. Systemctl yapılandırmasını yeniden yükleyin.

    $ sudo systemctl daemon-reload
    
  5. Docker'ı yeniden başlatın.

    $ sudo systemctl restart docker.service
    
  6. Bağlantı biriminin yapılandırılan bağlantı noktasını dinlediğini doğrulamak için netstat çıktısını gözden geçirerek değişikliğin yerine getirilip getirilmediğini kontrol edin.

    $ sudo netstat -lntp | grep dockerd
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd
    

İle uzaktan erişimi yapılandırma daemon.json

  1. /Etc/docker/daemon.json içindeki hosts dizisini UNIX soketine ve bir IP adresine aşağıdaki gibi bağlanacak şekilde ayarlayın:

    {
    "hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]
    }
    

    Docker'ı hem systemd birim dosyasını hem da daemon.json dosyasını kullanarak bağlantıları dinleyecek şekilde yapılandırmak, Docker'ın başlamasını engelleyen bir çakışmaya neden olur.

    1. Kendi değerlerinizi değiştirerek aşağıdaki satırları ekleyin veya değiştirin.

      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd
      
    2. Dosya 'yı kaydet.

    3. Systemctl yapılandırmasını yeniden yükleyin.

      $ sudo systemctl daemon-reload
      
  2. Docker'ı yeniden başlatın.

  3. Bağlantı biriminin yapılandırılan bağlantı noktasını dinlediğini doğrulamak için netstat çıktısını gözden geçirerek değişikliğin yerine getirilip getirilmediğini kontrol edin.

    $ sudo netstat -lntp | grep dockerd
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd
    

Docker istemcisi , istemcinin bayrağını DOCKER_HOSTayarlamak için ortam değişkenine saygı gösterir -H. Aşağıdaki komutlardan birini kullanın:

$ docker -H tcp://127.0.0.1:2375 ps

veya

$ export DOCKER_HOST="tcp://127.0.0.1:2375"
$ docker ps
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.