TCP를 통해 도커 API를 노출시키는 방법은 무엇입니까?


13

portainer를 사용하고 있으며 원격 엔드 포인트를 관리 할 수 ​​없습니다. 명령 줄을 사용하여 원격 도커 노드에 연결하려고했지만 메시지가 나타납니다 Cannot connect to the Docker daemon at tcp://<remote_ip>:<port>. Is the docker daemon running?.

그렇습니다. 도커 그룹에 자신을 추가했으며 노드에 SSH로 연결하여 도커에 액세스 할 수 있습니다. 그러나 원격으로 도커 노드에 액세스 할 수 없습니다.

/etc/default주석을 추가 / 주석 해제 하도록 수정 했습니다.DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

나는 또한 수정 /etc/init.d/docker하고 /etc/init/docker.conf포함 DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"시켰다.

도커 서비스를 다시 시작하고 프로세스에서 로그 아웃했다가 여러 번 로그인했지만 여전히 원격 노드에 연결할 수 없습니다. IP를 전달하여 로컬 노드에 연결할 수도 없습니다.

무엇을 놓쳤습니까? TCP를 통해 API를 노출하는 파일의 구성은 무엇입니까?

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:~$

편집 : Running ps aux | grep -i docker은 이것을 반환합니다-

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가 듣고 있습니까? ss -ntl
jscott

아니요. 2375에서 청취하는 내용이 없습니다. 어떤 파일의 어떤 구성이 여기에 영향을 미치는지 알 수 없습니다. ps aux도움이된다면 답변에 출력을 포함 시켰습니다 .
주님로.

비슷한 것을 시도하고 / etc / default / docker, /etc/init/docker.conf 및 /etc/init.d/docker 파일이 docker-ce 설치로 Ubuntu 16.04에서 단순히 무시된다고 생각합니다. ? "서비스 도커 상태"를 실행할 때 실제로 발생하는 것은 다른 시스템 인 "systemctl status docker"입니다.
chrisinmtown

답변:


22

Ivan Krizsan의 게시물 덕분에 해결책을 찾았 습니다 .

/lib/systemd/system/docker.service우분투 16.04.2 LTS 시스템에서 라인을 수정 하기 위해 편집해야했습니다.

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

그때

sudo systemctl daemon-reload
sudo systemctl restart docker.service

그리고 모든 것이 작동했습니다 :-). 다음 단계는 도커 데몬 양식을 하이재킹하는 방법을 알아내는 것입니다.


1
이 변경으로 Dockerd가 docker-ce ver 17.06을 사용하여 Ubuntu 16.04에서 HTTP 요청을 수신합니다. 서비스 스크립트를 직접 수정하는 것은 잘못된 것입니다.
chrisinmtown

7
docker 서비스 스크립트 (또는 모든 서비스 스크립트)를 직접 편집하지 마십시오. SystemD에는 차등 편집 기능이 내장되어 있습니다. Use systemctl edit docker.service및 systemctl은 편집 한 새 파일을 만듭니다. 이렇게하면 업데이트가 변경 사항을 지우지 않습니다. SystemD는 런타임에 두 파일을 병합합니다. 여기에 좋은 문서가 있습니다 : digitalocean.com/community/tutorials/…
Routhinator

감사! 이것은 매우 유용합니다. 업데이트 중에 계속 경고가 나타납니다. 나는 이것을 살펴볼 것이다 : _)
로드로.

4
Ubuntu Server 18.04에서는 다음과 같이 작동했습니다.ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:4243
LUCIAN ALEXA

-H tcp://설정없이 자체적으로 설정을 사용하는 경우 -H fd://클라이언트 명령 (예 : 도커 정보, 도커 버전 등)을 발행 할 수 없습니다.
Chris F

2

/ etc / default 디렉토리는 배포 관리자가 구성 파일을 저장하는 위치입니다. Docker의 저장소에서 직접 docker를 설치하면이 디렉토리가 사용되지 않습니다.

/ lib / systemd 디렉토리는 패키지가 시스템 파일을 설치하는 위치이며 업그레이드시 변경 사항을 덮어 씁니다. 이것을 사용하면 변경 사항이 손실됩니다.

지속되는 시스템 단위 파일을 직접 변경하려면 /etc/systemd/system/docker.service.d/에 단위 파일을 만들 수 있습니다. 예를 들어 여기는 표준 /etc/systemd/system/docker.service입니다. d / override.conf :

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

이 대체는 단순히 systemd에서 dockerd 데몬에 대한 모든 명령 행 플래그를 설정 해제합니다. 완료되면 docker에서 사용하는 /etc/docker/daemon.json의 모든 설정을 무시할 수 있으며 설정에 따라 데몬을 다시 시작하지 않고도 다시로드 할 수 있습니다. 예를 들면 다음과 같습니다. /etc/docker/daemon.json :

{
"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
}

귀하의 목적을 위해 호스트를 설정하기위한 라인 만 있으면됩니다.

위의 구성 파일에서 매우 중요한 부분 중 하나는 TLS 설정입니다. 클라이언트와 서버간에 상호 TLS를 구성하지 않고 네트워크에서 수신 대기하도록 도커를 열면 암호없이 루트 로그인이 허용 된 열린 텔넷 서버와 동일한 기능을 실행하는 것입니다. 텔넷보다 ssh를 선호하거나 루트 계정의 비밀번호를 선호하는 경우 TLS를 구성해야합니다. 도커 API 포트는 인터넷에서 자주 검색되므로이 구성 단계를 건너 뛰면 잠시 동안 호스트에 맬웨어가 설치됩니다.

클라이언트 및 서버에 대한 TLS 키 구성 방법에 대한 자세한 내용은 https://docs.docker.com/engine/security/https/를 참조하십시오.


1
Docker 서비스에 대한 향후 업데이트에도 불구하고 매우 좋은 답변입니다. 이것이 올바른 방법입니다.
Fopedush

2

docker 데몬을 재구성하고 다시 시작하지 않으려면 ncat( nmap패키지에서) 다음을 사용하여 유닉스 소켓을 TCP 소켓에 브리지 하면 됩니다.

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

대안으로 socat 또는 기타 도구를 사용할 수 있습니다 .


놀랄 만한! 이 명령을 백그라운드에서 실행할 수 있습니까? 터미널 연결을
Felix

아 내가 발견 nohup하고&
펠릭스

0

Docker 데몬이 연결을 청취하는 위치구성 하는 방법에 대한 공식 문서 가 있습니다 .

systemd 대 daemon.json

systemd 단위 파일과 daemon.json 파일을 모두 사용하여 연결을 수신하도록 Docker를 구성하면 충돌이 발생하여 Docker가 시작되지 않습니다.

시스템 단위 파일을 사용한 원격 액세스 구성

  1. sudo systemctl edit docker.service 명령을 사용하여 텍스트 편집기에서 docker.service의 대체 파일을여십시오.

  2. 자신의 값을 대체하여 다음 줄을 추가하거나 수정하십시오.

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
    
  3. 파일을 저장하십시오.

  4. systemctl 구성을 다시로드하십시오.

    $ sudo systemctl daemon-reload
    
  5. Docker를 다시 시작하십시오.

    $ sudo systemctl restart docker.service
    
  6. netstat의 출력을 검토하여 dockerd가 구성된 포트에서 수신 대기 중인지 확인하여 변경 사항이 적용되었는지 확인하십시오.

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

로 원격 액세스 구성 daemon.json

  1. 다음과 같이 /etc/docker/daemon.json에서 호스트 배열을 설정하여 UNIX 소켓 및 IP 주소에 연결하십시오.

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

    systemd 단위 파일과 daemon.json 파일을 모두 사용하여 연결을 수신하도록 Docker를 구성하면 충돌이 발생하여 Docker가 시작되지 않습니다.

    1. 자신의 값을 대체하여 다음 줄을 추가하거나 수정하십시오.

      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd
      
    2. 파일을 저장하십시오.

    3. systemctl 구성을 다시로드하십시오.

      $ sudo systemctl daemon-reload
      
  2. Docker를 다시 시작하십시오.

  3. netstat의 출력을 검토하여 dockerd가 구성된 포트에서 수신 대기 중인지 확인하여 변경 사항이 적용되었는지 확인하십시오.

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

Docker 클라이언트는 DOCKER_HOST환경 변수를 존중하여 클라이언트에 대한 -H플래그 를 설정합니다 . 다음 명령 중 하나를 사용하십시오.

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

또는

$ export DOCKER_HOST="tcp://127.0.0.1:2375"
$ docker ps
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.