IP
- IP(Internet Protocol) 란 인터넷에 연결되어 있는 모든 장치들(컴퓨터, 서버 장비, 스마트폰 등)을 식별할 수 있도록 각각의 장비에게 부여되는 고유 주소
- IP주소는 IPv4, IPv6 2가지 종류가 있으며, 일반적으로 IP 주소라 하면 IPv4 주소를 말한다.
IPv4
- IP version 4의 약자로 전 세계적으로 사용된 첫 번째 인터넷 프로토콜이다. 주소는 32비트 방식으로, 8비트씩 4자리로 되어 있으며 각 자리는 온점으로 구분한다. ex) 115.68.24.88
- IPv4는 0 ~ 2^32 (약 42억 9천)개의 주소를 가질 수 있는데, 전 세계적으로 인터넷 사용자 수가 급증하면서 IPv4 주소가 고갈될 위기에 처해있다. 이를 해결하기 위해 IPv6가 나온 것.
IPv6
- IPv6: IP version 6의 약자로, IPv4의 주소체계를 128비트 크기로 확장한 차세대 인터넷 프로토콜 주소이다. 16비트씩 8자리로 각 자리는 콜론으로 구분한다. ex) 2001:0DB8:1000:0000:0000:0000:1111:2222 네트워크 속도, 보안적인 부분뿐만 아니라 여러 면에서 뛰어나지만 기존의 주소체계를 변경하는데 비용이 많이 들어서 아직 완전히 상용화가 되지 않았다.
고정IP, 유동IP, 공인IP, 사설IP
- IP는 나누는 방식에 따라 고정 IP, 유동 IP와 공인 IP, 사설 IP로 나눌 수 있다.
- 고정 IP: 말 그대로 변하지 않고 컴퓨터에 고정적으로 부여된 IP이다. 한번 부여되면 IP 반납을 하기 전까지는 다른 장비에 부여할 수 없는 고유의 IP로 보안성이 우수하기 때문에 보안이 필요한 업체나 기관에서 사용한다.
- 유동 IP: 역시 말그대로 변하는 IP이다. 인터넷 사용자 모두에게 고정 IP를 부여해 주기는 힘들기 때문에, 일정한 주기 또는 사용자들이 인터넷에 접속하는 매 순간마다 사용하고 있지 않은 IP 주소를 임시로 발급해 주는 IP이다. 대부분의 사용자는 유동 IP를 사용한다.
- 공인IP: IP 주소는 임의로 우리가 부여하는 것이 아니라 전 세계적으로 ICANN이라는 기관이 국가별로 사용할 IP 대역을 관리하고, 우리나라는 한국인터넷진흥원(KISA)에서 국내 IP 주소들을 관리하고 있다. 이것을 ISP(Internet Service Provider의 약자로 KT, LG, SKT와 같이 인터넷을 제공하는 통신업체)가 부여받고, 우리는 위 회사에 가입을 통해 IP를 제공받아 인터넷을 사용하게 되는 것이다. 이렇게 발급받은 IP를 공인 IP라고 한다.
- 사설IP: 공유기를 사용한 인터넷 접속 환경일 경우 공유기까지는 공인 IP 할당을 하지만, 공유기에 연결되어 있는 가정이나 회사의 각 네트워크 기기에는 사설 IP를 할당한다. 사설 IP는 어떤 네트워크 안에서 내부적으로 사용되는 고유한 주소이다.
- 즉, 공인 IP는 전 세계에서 유일하지만, 사설 IP는 하나의 네트워크 안에서 유일하다. 공인 IP는 외부, 내부 상관없이 해당 IP에 접속할 수 있으나, 사설 IP는 내부에서만 접근이 가능하다.
PID
- 컴퓨터 과학에서 프로세스 식별자(프로세스 ID 또는 PID)는 유닉스, 맥 OS X 또는 마이크로소프트 윈도우 등의 운영 체제 커널이 사용되는 번호이다. PID를 통해 어떤 한 프로세스를 일시적으로 식별 할 수 있다. PID는 프로세스의 우선순위를 조정하거나 종료하는 등의 다양한 함수 호출에 사용된다.
- PID는 일반적으로 0 부터 시작해서 최댓값에 이를때까지 순차적으로 증가한다. 숫자의 최댓값은 시스템마다 다를 수 있다. 그러다 최댓값에 도달하면 다시 300에서부터 시작한다. 단, 맥 OS X 및 HP-UX의 경우 100에서부터 다시 시작한다. 이 때 아직 할당된 상태의 PID는 건너뜀으로서 하나의 PID가 동시에 두 개의 프로세스에서 사용되는 것을 방지한다. 이렇게 PID가 재사용되는 점을 악용해 시스템에 대한 정보를 추출하거나 비밀리에 다른 프로세스에 메시지를 보낼 수 있어 어떤 사람들은 이를 보안취약점으로 보기도 한다.
port
- 포트(port)는 "논리적인 접속장소"이며, 특히 인터넷 프로토콜인 TCP/IP를 사용할 때에는 클라이언트 프로그램이 네트워크 상의 특정 서버 프로그램을 지정하는 방법으로 사용된다. 네트워크 상에서 통신을 할 때 IP를 토대로 해당 서버가 있는 컴퓨터에 접근한다.
- 그런데 대부분의 경우 하나의 컴퓨터에는 여러 개의 서버가 실행될 수 있다. 컴퓨터에 여러 개의 서버가 실행되고 있다면, 어느 서버에 접속해야 하는지 컴퓨터에게 알려주어야 한다. 이때 사용되는 것이 포트 번호이다.
- 포트 번호는 컴퓨터에서 실행되고 있는 서버를 구분 짓기 위한 16비트의 논리적 할당으로 0~65536번이 존재한다. 이 중에 0~1023번까지는 이미 어떤 통신이 해당 포트를 사용할 것인지 정해져 있다. 예를 들어 http 통신은 80번 포트를 사용하고, ssh 통신은 22번 포트를 사용한다. 이렇게 정해져 있는 0~1023번까지의 포트를 well-known port라고 한다.
- 컴퓨터에 있는 웹서버는 기본적으로 80번 포트와 연결(listening)되어 있다. 만약 웹서버를 하나 더 사용하고 싶은 경우 80번 포트는 이미 기존 웹서버가 사용하고 있기 때문에 사용할 수 없다. 그런 경우 well-known port가 아닌 다른 포트들과 연결하여 사용한다. 보통 관습적으로 8080 포트에 연결하여 사용한다.
- 그런데 이런 경우 웹 통신이 들어왔을 때 80번과 8080번 포트 중에 어떤 포트와 통신할까? 정답은 URL에 포트번호를 적어서 통신할 포트를 구분한다. 예를 들어 http://test.com에 접속하면 80포트에 연결된다. http://test.com:80에서 80 포트는 생략이 가능하기 때문에 생략된 것이다. 그렇다면 http://test.com:8080에 접속하면 어떻게 될까? 예상 가능하듯 8080 포트에 연결이 된다.
- URL 구성을 살펴보면 맨 앞에는 http와 같은 통신 규약이 온다. http, ftp 등등 어떠한 방법으로 통신을 할 것인지를 적는 것이다. 그 다음 도메인이나 ip를 적고, 뒤에 포트 번호를 적는다.
Bridge
- 호스트 네트워크와 게스트 네트워크를 연결해서 게스트 컴퓨터가 네트워킹 하는 방식
- 컨테이너를 도커 네트워크 인터페이스(docker0) 로 설정
- 컨테이너는 docker-proxy라는 데몬을 통하여 호스트와 연결
- 컨테이너는 기본적으로 호스트와 격리된 상태
Host
- 네트워크에 연결되어있는 컴퓨터
- IP를 가지고 양방향 통신을 할 수 있는 컴퓨터라고 생각할 수 있다.
- 도커 컨테이너 호스트 모드 : host 방식으로 컨테이너를 생성하면, 컨테이너가 독립적인 네트워크 영역을 갖지 않고 host와 네트워크를 함께 사용하게 된다.
- container의 포트를 host 네트워크 인터페이스로 직접 매핑
- 컨테이너는 host의 네트워크로 자유롭게 접근이 가능함
- host네트워크를 사용하는 컨테이너는 각각 유동 IP를 갖게된다!!! 재시작 할 때 언제든 변할 수 있는 IP를 통해 통신하는 건 문제가 있음. - XXX
- host 네트워크를 사용하면 모두 host IP정보를 공유하기 때문에 컨테이너는 따로 IP정보를 갖지 않는다.
link를 이용한 통신방법
- 유동IP를 갖는 컨테이너간에 IP가 아닌 컨테이너 이름으로 통신하게 하는 방법!
docker run -d --name 생성할컨테이너이름 --link 통신할컨테이너이름 도커이미지명
bridge방식으로는 왜 됐는가?
- bridge방식을 쓰면 각 컨테이너는 기본적으로 docker0 이라는 인터페이스에 바인딩된다.
- docker0 bridge는 기본IP가 172.17.42.1 로 자동 할당된다.
- 따라서 해당 IP를 찾아 통신이 가능했을 것이다.
host방식으로 되게 하려면
-
host방식을 사용하면 각 컨테이너의 ip는 유동적이기 때문에 link를 이용해 컨테이너 명으로 통신해야? - XX
-
docker run --network host -p 8761:8761 --name eurekaserver eureka 로 컨테이너 실행시 아래와 같은 문구가 뜨고, 유레카 서버에 접속이 안 된다.
-
Published ports are discarded when using host network mode
-
네트워크 host를 사용하면 -p 로 포트 바인딩을 해주지 않아도 실행이 된다.
docker run --network host --name eurekaserver eureka