본문 바로가기
Docker/Docker file 사용법 익히기

[Docker File 익히기] 6. EXPOSE와 ENV, WORKDIR 명령어 사용해보기

by Fletcher 2024. 8. 14.

 

반갑습니다!

이번 포스트에서는 EXPOSE 명령어부터 살펴보도록 하겠습니다 ^^

EXPOSE 명령어는 docker 컨테이너의 특정 포트외부에 오픈하는 설정입니다

 

지금까지 주로 $ docker run 명령시 -p 옵션을 통해서 설정을 했었는데요

docker run -p 옵션은 컨테이너의 특정 포트를 외부에 오픈하고,

해당 포트를 호스트 PC의 특정 포트와 매핑을 시키는 기능을 합니다 ^^

 

주로 다음과 같은 예시 코드를 사용했었는데요

$ docker run -p 9999: 80 ~

호스트 PC의 9999번 포트로 접근한 데이터 패킷을 컨테이너의 80번 포트로 전달해주는 것까지

-p 옵션 하나로 해결이 되었던 것이었습니다 ^^!!

 

이에 반해 EXPOSE는 컨테이너 생성시 특정 포트를 외부에 오픈하는 것만 설정을 하는 것입니다

따라서 독립적으로 실행시 EXPOSE 옵션만 넣는다고 해서

호스트 PC에서 해당 컨테이너의 포트 번호로 접속할 수 있는 것은 아닙니다 ^^

 

특정 포트 개방 여부의 문제 자체가

포트 포워딩 여부와는 별개의 문제인 것과 같은거죠 ^^!

 

 

포트를 개방 및 매핑을 해서 외부에서 컨테이너 내부로 접근할 때에는 -p 옵션을 사용하지만,

컨테이너와 컨테이너끼리의 네트워킹을 위해서 포트를 개방할 때에

주로 EXPOSE 명령어를 사용한다고 예시로 이해하시면 될 것 같습니다 ^^

 

나중에 Docker Compose에 관련된 내용도 살펴볼텐데요

이 때 여러 컨테이너들끼리 서로 통신 및 접속할 수 있도록 사용할 때에도 이용합니다 ^^ 

 

 

 

 

vi 에디터를 이용해서 Dockerfile을 하나 작성해보겠는데요

EXPOSE 명령어를 이용해서 80번 포트를 열어주겠습니다 ^^

 

 

 

해당 Dockerfile로 이미지를 빌드하고 $ docker inspect로 상세 정보를 조회해보니

ExposedPorts 부분에 80/tcp라는 정보가 표기되어 있습니다 ^^ 

 

 

 

하지만 EXPOSE 명령어는 포트를 열어주기만 할 뿐,

외부 호스트PC와 매핑되어 있지는 않은데요

docker run 명령어 실행시 -P 옵션을 이용하면 외부 호스트 PC와 매핑을 해줄 수 있습니다 ^^

 

다만 랜덤하게 매핑 되기 때문에 EC2 인스턴스를 사용 중일 경우,

해당 포트에 대해 항상 인바운드 규칙 편집을 추가해줘야 하는 불편함이 생겨버리죠 ^^;;

 

 

 

 

 

 

 

그 다음은 ENV 명령어입니다

이 명령어는 컨테이너 내의 환경변수를 설정할 때 사용하는데요 ^^

설정한 환경변수는 RUN, CMD, ENTRYPOINT 명령에도 적용이 됩니다 !

 

 

vi 에디터를 이용해서 예시를 위한

새로운 Dockerfile을 한 번 작성해보겠습니다 ^^

 

 

 

ENV 명령어를 이용해서

MySQL 실행시 이용할 패스워드와 데이터베이스 이름을 지정해주겠습니다 ^^

 

 

 

해당 dockerfile로 이미지를 빌드한 다음에,

마찬가지로 docker run 명령어로 컨테이너를 실행시킨 뒤,

$ docker exec로 접근했습니다

 

프롬프트 기호가 바뀐 것이 보이시죠? ^^

 

 

 

mysql 명령어를 이용해서 root 유저로 로그인 했습니다 ^^

 

 

 

show databases; 명령어로 데이터베이스를 조회하니,

아까 지정한 데이터베이스의 이름이 목록에 나타나는 것이 보입니다 ^^

 

 

 

 

 

 

그 다음은 WORKDIR 명령어입니다

RUN, CMD, ENTRYPOINT 명령이 실행될 디렉토리를 설정하는 기능입니다 ^^

이미지 안에서 특정 폴더로 실행 폴더를 이동하기 위해서 종종 사용합니다 !

 

 

이번에도 해당 명령어를 시험해보기 위해

dockerfile을 새로 작성해보겠습니다 ^^

 

 

 

docker 파일로 이미지를 빌드한 다음에 컨테이너를 생성하였습니다

근데 컨테이너가 생성되자마자 STATUS가 Exited 상태가 되었네요

그도 그럴것이, ENTRYPOINT 또는 CMD 부분에 httpd-foreground 명령어를 기재하지 않았습니다 ^^

 

단순히 index.html을 화면에 출력하는 명령어만 기재해놨기 때문에

웹 서버로서 기능을 할 수 없어서 컨테이너가 실행되자마자 종료상태가 된 것이죠 ^^

 

 

로그를 한 번 찍어보면 CMD를 설정한대로

index.html의 내용이 출력된 것을 확인할 수 있겠습니다 ^^

 

 

 

 

이렇게 dockerfile에 대한 내용들을 살펴보았는데요

주요 명령어 및 참고 명령어들을 여러개 알아보았습니다 ^^

포스트 읽어주셔서 감사드리고

다음 포스트에 이어서 도커에 관련된 내용들을 더 알아보도록 하겠습니다 !