Linux 기반 서버에 샘플 docker tar 이미지가 있고 아래와 같이 docker run 명령을 통해 이미지를 실행했습니다. 여기서 9521f101839f는 이미지 ID입니다.
docker run -p 0.0.0.0:9895:9898 -td 9521f101839f
이제 도커 컨테이너가 존재하고 프로젝트(나머지 API)가 내 서버 내에서 제대로 작동하고 있습니다.
docker ps 명령 출력도 올바르게 보입니다.
a97904cb07d1 localhost/elk-spring-boot.jar:latest 22 minutes ago Up 22 minutes ago 0.0.0.0:9895->9898/tcp compassionate_goldberg
보시다시피 9895를 외부 세계에 노출시킵니다.
iptables -I INPUT -p tcp -m tcp --dport 9895 -j ACCEPT
위의 iptables 명령을 사용하여 포트 9895를 열었습니다.
[root@pxgrid-163 localdisk]# iptables -nvL | grep 9895
0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:9895
1 60 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9895
1 60 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9895
0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:9895
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9895
그러나 다른 Linux 기반 서버(또는 랩탑 CLI)에서 이 Docker 컨테이너 서버로 컬링하려고 하면 연결할 수 없습니다. Docker 컨테이너를 보관하는 서버 내부에서 모든 것에 올바르게 액세스할 수 있습니다. 그런데 별도의 서버(혹은 노트북)에서 Curl을 실행하여 api(docker run api)에 접근하려고 하면 접근이 되지 않습니다.
이것이 예상되는 동작입니까? 항구가 외부세계에 노출되어 있기 때문에 외부에서 접근이 가능해야 하는 것 아닌가요? 여기서 뭔가 빠졌나요?
다음은 ifconfig를 실행할 때 나타나는 네트워크 인터페이스 목록입니다.
여기서는 어떤 인터페이스_ip에 대해 이야기하고 있나요? eth0인가요? ifconfig를 실행하면 많은 인터페이스가 보입니다.
ifconfig
cni-podman0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 10.88.0.1 netmask 255.255.0.0 broadcast 10.88.255.255
cni-podman1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 169.254.2.1 netmask 255.255.255.0 broadcast 169.254.2.255
cni-podman2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 169.254.4.1 netmask 255.255.255.0 broadcast 169.254.4.255
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.23.166.163 netmask 255.255.255.0 broadcast 172.23.166.255
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
veth506e78cf: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
veth6c80d69f: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
vethe32079e7: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
답변1
Doker는 귀하의 컴퓨터에 자체 네트워크 172.16.0.0/12를 가지고 있습니다.
노력하다
-p your_interface_ip:9895:9898
또한 IP 전달이 활성화되어 있는지 확인하십시오.
sysctl -w net.ipv4.ip_forward=1
https://docs.docker.com/config/containers/container-networking/
https://www.docker.com/blog/understanding-docker-networking-drivers-use-cases/
답변2
내 서버에서 IP 전달을 활성화하려면 다음 2단계를 따라야 했습니다.
- IP 전달을 허용하도록 Linux 커널을 구성합니다. - sysctl net.ipv4.conf.all.forwarding=1
- iptables FORWARD 정책을 DROP에서 ACCEPT로 변경 - iptables -P FORWARD ACCEPT
그 후에는 내 노트북은 물론 다른 서버에서도 API에 액세스할 수 있습니다.