1. ports (docker run -p)
도커 run 명령어로 도커 컨테이너를 실행시킬 때, -p 옵션으로 호스트의 운영체제 포트와 컨테이너 포트를 매핑시킬 수 있다.
docker run -it -p 8000:8000 django
위 명령어의 의미는 호스트의 8000번 포트와 도커 컨테이너의 8000번 포트를 매핑된다는 뜻이다. 즉, 호스트 운영체제의 8000번 포트로 전달되는 정보들이 도커를 통해 컨테이너의 8000번 포트로 포워딩된다는 의미이다.
위의 이지미에서 이미지와 함께 보자면, 호스트OS 내부를 'WORLD INSIDE DOCKER'로 보시면 되고 외부 호스트를 'WORLD OUTSIDE DOCKER'로 보시면 된다.
ports는 호스트 OS와 컨테이너의 포트를 바인딩 시켜준다. (ports 3306:3306 -> host : container)
ports는 호스트 포트와 컨테이너 포트를 모두 노출시키기 때문에, 호스트 내부의 컨테이너끼리는 컨테이너 포트로 특정 컨테이너에 접근할 수 있고, 호스트 외부에서는 컨테이너 포트와 바인딩된 호스트 포트를 통해 특정 컨테이너에 접근할 수 있다.
위의 말을 간단하게 예시를 들어보면
ports 3307:3306의 mysql 컨테이너가 동작중에 있다고 가정을 했을 때,
도커에는 mysql 말고도 8000번 포트의 django도 동작하고 있다. 여기서 django는 mysql에 접근하기 위해서는 컨테이너 포트 즉, 3306 포트를 이용해야한다.
반면에 컨테이너 외부 즉, 호스트 외부에서 mysql을 접근할 때에는 3307 포트로 접근해야 컨테이너 내부의 mysql에 접근할 수 있다.
2. Dockerfile expose
expose는 호스트 포트를 공개하지 않고, 컨테이너 포트만 공개한다. (expose 3306)
쉽게 말해서 호스트 내부의 컨테이너들끼지는 expose 명령어로 지정한 컨테이너 포트로 특정 컨테이너에 접근할 수 있지만, 호스트 위부의 경우, 외부 호스트에서 특정 컨테이너에 접근하려고 할 때, 그 컨테이너 포트와 바인딩된 호스트 포트가 없기 때문에 해당 컨테이너에 접근할 수 없다.
이러한 특징 때문에 expose는 도커 내부에서 컨테이너 간의 통신만 필요한 경우에 주로 사용된다.
'DevOps > Docker' 카테고리의 다른 글
Python WAS (Django, Wsgi, Nginx) 구축하기 - 로컬 (0) | 2022.10.27 |
---|---|
[Docker] 도커의 데이터 관리 및 저장 (volume, mount) (0) | 2022.10.26 |
[Docker] 로컬에서 docker-compose를 이용한 Gunicorn 적용 (2) (0) | 2022.06.02 |
[Docker] 로컬 환경에서 Django와 MySQL을 docker-compose로 구동 (with. .env파일생성) (1) (0) | 2022.06.02 |
[Docker] Docker 이미지 종류 (with. Python) (0) | 2022.06.01 |