2016-08-02 2 views
2

나는 도커에 익숙하지 않고 모든 응용 프로그램을 단일 서버에 묶었습니다. 지금까지 모든 것이 잘 작동합니다. 그러나, 나는 하나의 것을 이해하지 못한다. 나는 도커 - 작성 (모든 프로젝트에 아직 도커 파일을 만들지 않았 음)을 사용하고 있으며이 도우커 - 구성에이 ports 속성이 있습니다. 나는 이런 식으로 뭔가를 작성하는 경우 :다시 시작하면 도커 컨테이너 IP가 변경됩니까?

ports: 
    8085:80 

그것은 내 서버에 액세스 할 수있는 외부 세계를 의미한다 0.0.0.0:8085 수신합니다.

ports: 
    172.17.0.1:8085:80 

이 크지 인 만 172.17.0.1:8085 수신합니다 : 약간의 토론 후와 구글-ING, 나는 내 고정 표시기 브리지 네트워크에서 IP 주소를 가지고 쉽게 포트 매핑을 할 수 있다는 것을 발견 그것은 단지 내부적으로 듣고 있으며, nginx 프록시는 필요한 포트로 트래픽을 프록시합니다. (예 : proxy_pass http://172.17.0.1:8085). 도커에 대해 더 많이 알고 그 작동 방식을 이해 한 후에 모든 컨테이너에는 해당 주소에만 노출 된 포트가있는 자체 IP 주소가 있다는 것을 알았습니다. 예를 들어 내 "웹"컨테이너 중 하나에 IPv4 주소가 172.17.0.10이고 포트 80이 노출되어 있습니다. 이 컨테이너 중 하나에서 docker inspect을 수행하면 컨테이너의 IP 주소가 표시됩니다.

이제이 nginx에서이 IP 주소를 사용하고 싶습니다. proxy_pass http://172.17.0.1:8085 대신 http://172.17.0.10을하고 싶습니다. 필자는 개인적으로 이것이 매우 우아한 인터페이스라고 생각하지만 저에 관한 한 가지가 있습니다. 내 컴퓨터를 다시 시작하면 어떻게됩니까? 모든 컨테이너는 어떤 종류의 순서로 시작됩니다. 5 개의 웹 컨테이너가 있고 임의의 순서로 시작하면이 컨테이너에 대한 IP가 동일하게 유지 될 수 있습니까? 아니면 바꿀 것인가? nookx에서 docker-compose에 항상 ports을 사용해야합니까? 그렇다면 동일한 IP를 가진 다른 포트 대신 컨테이너마다 다른 IP를 어떻게 가질 수 있습니까? 다른 docker 네트워크 인터페이스 (서브넷 172.17.1.0에서 보자)를 작성하고 해당 인터페이스의 다른 IP를 노출 된 "공개"포트에 할당해도 괜찮습니까? 이 말은 기본적으로 하나의 컨테이너에 172.17.1.1:80:80을 사용하고 또 다른 컨테이너에는 172.17.1.2:80:80을 사용하는 것을 의미합니다.

답변

2

도커 - 네트워킹 도메인의 전문가는 아니지만 질문에 대답하기 위해 최선을 다할 것입니다.

Q : 컴퓨터를 다시 시작하면 어떻게됩니까? 모든 컨테이너는 어떤 종류의 순서로 시작됩니다.
A :links 또는 depends_on 키워드를 사용하지 않으면 시작 시퀀스를 보장 할 수 없습니다.

Q : 웹 컨테이너가 5 개이고 순서가 임의로 시작되는 경우이 컨테이너의 IP가 동일 할 수 있습니까?
A : 저는 기존의 2 컨테이너 (postgresDB 및 influxDB)의 ipaddress를 기록하여 컴퓨터에서 약간의 실험을했습니다. 172.17.0.2

  • InfluxDB :

    그들은

    1. 포스트 그레스에서 실행되는 172.17.0.3

    는 다시 종료하고 부팅합니다. 아마도 이번에 같은 순서로 부팅했기 때문에 IP 주소가 유지 된 것으로 보입니다.Postgres가 시작하기 전에 먼저 InfluxDB 컨테이너가 강제로 시작되도록하려면 depends_on 키워드가 추가되었습니다. 이제 두 컨테이너의 IP 주소가 동일합니다.

    1. 포스트 그레스 : 172.17.0.3
    2. InfluxDB : 172.17.0.2

    는 내가 IP가 선착순 기반의 분산 생각합니다. 컨테이너를 부팅하기 위해 주문을 지정하지 않았다면 컨테이너에 대해 ip가 다를 수있는 작은 기회가 있다고 생각합니다. 누가 먼저 실행하는지에 따라 달라집니다.

    Q : nginx에서 사용하기 위해 항만에서 포트를 사용해야합니까?
    A : 예, nginx 인스턴스의 포트를 외부 세계로 포트 포워딩하려는 경우 가능합니다. 그렇지 않으면 누구도 해당 웹 서버를 공격 할 수 없습니다. 예 : 포트 443을 노출하여 HTTPs 트래픽이 유입되도록합니다.

    Q : 동일한 IP를 가진 다른 포트 대신 컨테이너마다 다른 IP를 가질 수 있습니까?
    A : 내가 가능한지 모르겠지만 도커 작성 설명서에서 몇 가지 조사를 한 후 ipam 키워드를 사용하여 가능해 보입니다.

    참조 : 내 자신의 프로젝트 대신 service_name를 사용하는 것이었다 내가 무슨 짓을 그렇게 나에게 무서운 보이는
    https://docs.docker.com/compose/compose-file/#/ipam

    .

    는 예 : my_nginx 컨테이너에서이 예를 들어

    container_bbb: 
        image: banana 
    
    my_nginx: 
        image: apple 
        environment: 
         - MOUNT_SRC0=http://container_bbb:80 
         - MOUNT_DEST0=/ 
        links: 
         - container_bbb 
    

    , 서비스 이름 container_bbb는 해당 컨테이너의 호스트 이름으로 해결 될 것입니다. 그러면 컨테이너의 진입 점 스크립트 영역에서이 정보를 사용하여 ngix 구성을 동적으로 생성하는 python 스크립트를 갖게 될 것입니다.

    조금 지나치게 소리가 들리지만 내 nginx로하고 싶은 일을 더 잘 제어 할 수 있습니다.

    그래서 내 /etc/nginx/conf.d/default-locations/에서 configs는 다음과 같습니다.

    location /container_bbb/ { 
        proxy_pass http://container_bbb:3000/; 
    } 
    

    참고 : 나는 리버스 프록시 서버로이의 nginx 서버 인스턴스를 사용하고 .

    여기서 내가 말하고자하는 것은 본질적으로 IP 주소 대신 호스트 이름을 사용할 수 있다는 것입니다. 그리고 옆집에있는 컨테이너에 가려면 http://CONTAINER_SERVICE_NAME:PORT

  • 1

    용기의 IP 주소는 신뢰할 수 없습니다. 모든 서비스가 동일한 도커 작성 구성에 있으면 자동으로 동일한 내부 네트워크의 일부가되며 서비스 이름을 호스트 이름으로 간단하게 사용할 수 있습니다.

    예.웹 응용 프로그램이 php라는 이름의 경우, 귀하의 nginx 프록시 설정은 같을 것입니다 :

    location/{ 
        proxy_pass http://php; 
        proxy_set_header Host $host; 
        proxy_redirect  off; 
    } 
    

    (또한 포트 매핑 중 하나가 공용 IP에 누설된다 단지의 경우, 당신은 당신의 방화벽을 사용하도록 설정할 수 있습니다 호스트의 주소)