Docker 컨테이너에 고정 IP 할당


205

Docker 컨테이너가 시작될 때 고정 IP 172.17.0.1을 할당하려고합니다.

포트 2122를이 컨테이너의 ssh 포트로 사용하여이 컨테이너가 포트 2122를 수신하게합니다.

sudo docker run -i -t -p 2122:2122 ubuntu

이 명령은 172.17.0.5와 같은 임의의 IP로 Docker 컨테이너를 실행하지만 컨테이너에 특정 IP를 할당해야합니다.

다음 쉘 스크립트는 고급 네트워크 설정에서 Docker 설명서를 참조하는 것입니다.

pid=$(sudo docker inspect -f '{{.State.Pid}}' <container_name> 2>/dev/null)
sudo rm -rf /var/run/netns/*
sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid
sudo ip link add A type veth peer name B
sudo brctl addif docker0 A
sudo ip link set A up
sudo ip link set B netns $pid
sudo ip netns exec $pid ip link set eth0 down
sudo ip netns exec $pid ip link delete eth0
sudo ip netns exec $pid ip link set dev B name eth0
sudo ip netns exec $pid ip link set eth0 address 12:34:56:78:9a:bc
sudo ip netns exec $pid ip link set eth0 down
sudo ip netns exec $pid ip link set eth0 up
sudo ip netns exec $pid ip addr add 172.17.0.1/16 dev eth0
sudo ip netns exec $pid ip route add default via 172.17.42.1

이 셸 스크립트는 고정 IP 172.17.0.1을 할당하고 세밀하게 연결합니다. 그러나 현지 에서이 컨테이너로 ssh하려고 할 때마다 작동하지 않았습니다. 내가 만난 문제는 무엇입니까?


해당 질문에 대한 간단한 답변이없는 것이 두렵습니다. github.com/docker/docker/issues/6743github.com/docker/docker/issues/1179를 참조 하고 github.com/jpetazzo/pipework
user2915097

@larrylo 컨테이너 내부에서 sshd를 시작했음을 확인할 수 있습니까?
Bryan

5
docker 데몬이 수행하는 모든 라우팅을 취소합니다. 컨테이너는 VM이 ​​아닙니다.
user2105103

예, 컨테이너 내부에서 sshd를 시작할 수 있음을 확인합니다
LarryLo

답변:


291

Docker 버전 1.10.1로 쉽게 빌드 9e83765.

먼저 자신 만의 도커 네트워크를 만들어야합니다 (mynet123)

docker network create --subnet=172.18.0.0/16 mynet123

단순히 이미지를 실행하는 것보다 (우분투를 예로 들겠습니다)

docker run --net mynet123 --ip 172.18.0.22 -it ubuntu bash

그런 다음 우분투 쉘에서

ip addr

또한 당신은 사용할 수 있습니다

  • --hostname 호스트 이름을 지정하려면
  • --add-host / etc / hosts에 더 많은 항목을 추가하려면

https://docs.docker.com/engine/reference/commandline/network_create/의 문서 (및 네트워크를 만들어야하는 이유)


1
정답-추가 정보 추가 : blog.jessfraz.com/post/ips-for-all-the-things
Ole

@ cantSleepNow 어떤 이유로 든 시스템 부팅 중에 인터페이스 파일에서 생성 된 자체 기본 생성 브리지 br0을 사용해야합니다 (따라서 docker network create를 사용하여 생성되지 않음). 어떻게 동일한 효과를 얻을 수 있습니까? docker를 사용하여 브리지를 만들지 않고 -ip 매개 변수 (컨테이너의 고정 IP 주소 가져 오기)?
Mohammed Noureldin

@MohammedNoureldin 나는 완전히 이해하지 못합니다-또한 새로운 질문처럼 들리므로 그렇게 질문해야한다고 생각합니다.
cantSleepNow

@cantSleepNow 사용자 정의 브리지를 사용하지 않지만 컨테이너의 IP 주소를 수정해야한다는 것을 의미합니다 (따라서 -ip 매개 변수를 사용할 수 없음). 그 방법을 제안합니까?
Mohammed Noureldin

@MohammedNoureldin 확실하지 않습니다. 내가 말했듯이, 귀하의 질문을 의견이 아닌 질문으로 게시하십시오. 아마도 대답을 아는 사람이있을 수 있습니다.
cantSleepNow

89

들어 docker-compose당신은 다음을 사용할 수 있습니다docker-compose.yml

version: '2'
services:
  nginx:
    image: nginx
    container_name: nginx-container
    networks:
      static-network:
        ipv4_address: 172.20.128.2
networks:
  static-network:
    ipam:
      config:
        - subnet: 172.20.0.0/16
          #docker-compose v3+ do not use ip_range
          ip_range: 172.28.5.0/24

호스트에서 다음을 사용하여 테스트 할 수 있습니다.

docker-compose up -d
curl 172.20.128.2

현대 docker-compose는 자주 IP 주소를 변경하지 않습니다.

docker-compose한 줄로 모든 컨테이너의 IP를 찾으려면 다음 을 사용하십시오.

for s in `docker-compose ps -q`; do echo ip of `docker inspect -f "{{.Name}}" $s` is `docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $s`; done

자동화하고 싶다면이 예제 요점 과 같은 것을 사용할 수 있습니다


2
이것은 docker-compose v2에서만 작동하며 v3는 호환성을 위반했습니다.
Andrzej Rehmann

4
docker-compose v3 +를 사용할 때ip_range
Andrzej Rehmann

그래도 ip_range를 얻지 못했습니다. 서브넷으로 덮여 있지 않습니까? 어쨌든 고마워요! "내 몽고 컨테이너의 IP를 다시 찾아야한다"고 수정했습니다. – 문제
Ben

1
작성 버전 3에서 IP 주소를 지정하는 방법이 있습니까?
ealeon

2
이 솔루션은 없이도 잘 작동합니다 ip_range. '3.4'버전을 사용하고 있습니다.
Mikhail Morfikov

24

직접적인 대답은 아니지만 도움이 될 수 있습니다.

다음 접근 방식을 사용하여 고정 IP에 연결된 대부분의 고정 서비스를 실행합니다.

  1. docker host의 모든 서비스에 대해 IP 별칭을 만듭니다.
  2. 그런 다음이 IP에서 컨테이너로 포트를 리디렉션하는 각 서비스를 실행하여 각 서비스에 외부 사용자 및 다른 컨테이너에서 사용할 수있는 고정 IP가 있습니다.

견본:

docker run --name dns --restart=always -d -p 172.16.177.20:53:53/udp dns
docker run --name registry --restart=always -d -p 172.16.177.12:80:5000 registry
docker run --name cache --restart=always -d -p 172.16.177.13:80:3142 -v /data/cache:/var/cache/apt-cacher-ng cache
docker run --name mirror --restart=always -d -p 172.16.177.19:80:80 -v /data/mirror:/usr/share/nginx/html:ro mirror
...

고마워요 ~ 그냥 같은 github.com/brandon-rhodes/fopnp/tree/m/playground 않습니다. 나는 그것을 시도 할 것이다.
LarryLo

1
이것은 매우 좋은 해결책입니다. 새로운 사용자가 cyberciti.biz/faq/…
Mohammed Noureldin

좋은 해결책을 주셔서 감사합니다.
RavinderSingh13

4

이것은 나를 위해 작동합니다.

와 네트워크를 만듭니다 docker network create --subnet=172.17.0.0/16 selnet

도커 이미지 실행 docker run --net selnet --ip 172.18.0.2 hub

처음에는

docker: Error response from daemon: Invalid address 172.17.0.2: It does not belong to any of this network's subnets.
ERRO[0000] error waiting for container: context canceled

솔루션 : IP의 두 번째 4 배 증가 [.18. .17 대신에.]


3
이 페이지 어딘가에 비슷한 2 년 된 유사 / 동일한 답변이 있습니다 : stackoverflow.com/a/35359185/694469
KajMagnus

2

나는 제대로 작동하기 위해 퍼블릭 IP를 알아야하는 Avahi 를 도킹하려고 시도하는 동안이 문제를 발견 했습니다. Docker에서 정적 IP 할당을 지원하지 않기 때문에 컨테이너에 정적 IP를 할당하는 것은 까다 롭습니다 .

이 기사에서는 데비안 에서 컨테이너에 정적 IP를 할당하는 방법을 설명합니다 .

  1. Docker 서비스는로 시작해야합니다 DOCKER_OPTS="--bridge=br0 --ip-masq=false --iptables=false". br0브리지가 이미 구성되어 있다고 가정 합니다.

  2. 컨테이너는 --cap-add=NET_ADMIN --net=bridge

  3. 내부 컨테이너 입력 pre-up ip addr flush dev eth0/etc/network/interfaces사용하여 다음 예제와 같이 Docker에서 할당 한 IP 주소를 해제 할 수 있습니다.


auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    pre-up ip addr flush dev eth0
    address 192.168.0.249
    netmask 255.255.255.0
    gateway 192.168.0.1
  1. 컨테이너의 시작 스크립트는로 시작해야합니다 /etc/init.d/networking start. 또한 /etc/hostsDocker가 할당 한 IP에 대한 참조를 제거 하려면 입력 스크립트가 파일 을 편집하거나 채워야 합니다.


1

이름으로 다른 컨테이너의 서비스에 액세스 할 수 있습니다 ( ping apacheip를 얻거나 curl http://apachehttp 서비스에 액세스합니다). 이것은 정적 ip의 대안이 될 수 있습니다.


3
도커 버전 1.8에서는 직접 작동합니다. 최신 버전에서는 이러한 컨테이너를 주먹으로 연결해야합니다.
Guisong He

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.