[Docker] Dockerfile

chrkb1569·2023년 8월 21일
0

Docker

목록 보기
3/5
post-thumbnail

지난 번에는 도커가 어떻게 동작하는지에 알아보았습니다.

Dockerfile을 작성하면 이를 토대로 이미지가 만들어지고, 만들어진 이미지를 통해서 컨테이너를 실행한다가 도커의 작동 원리였는데,

지난번에 작성하였던 Dockerfile입니다.

뭔가 정해진 문법이 있어서 그거에 알맞게 작성한 것 같긴한데, 처음 보는 입장에서는 이게 뭔가 싶습니다 ㅋㅋ

그래서 오늘은 Dockerfile 문법에 대해 알아보면서 간단하게 자바 파일을 실행해보겠습니다.

자바 파일 생성

일단 우리가 실행해야 할 자바 파일을 하나 생성해줍니다.

눈으로만 봐도 알 수 있겠지만, 다음 파일을 실행할 경우

다음의 문구가 출력되도록 작성한 자바 파일입니다.

뭐 이 파일이 CLI 환경에서 실행되면

이렇게 출력되겠죠?

그럼 이제 도커를 통하여 해당 문구를 출력해보도록 Dockerfile을 만들어 보겠습니다.

Dockerfile 어떻게 구성할까?

일단 Dockerfile이라는 이름으로 파일을 하나 생성해줍니다.

그리고 이제부터 Dockefile을 작성할텐데,

우리는 Dockerfile을 작성하기 전에 생각해야할 부분들이 몇가지 존재합니다.

일단 저의 경우에는 크게 3가지를 생각합니다.

1) 어떠한 이미지를 베이스로 작업을 수행할 것인가?
2) 컨테이너 내부 환경은 어떻게 구성할 것인가?
3) 어떠한 작업을 수행할 것인가?

1번의 경우, 어떠한 프로그램을 실행할 것이냐에 따라서 달라질텐데, 만약 웹 서버를 실행하여 작업을 수행하고 싶다면, Nginx 이미지를 Docker hub에서 가져올 것이고, 프론트 프로젝트를 실행하여 작업을 수행하고 싶다면 Node 이미지를 가져올 것입니다.

2번의 경우에는 이미지를 컨테이너화 했을 경우를 고려한 사항입니다.
지난번에 컨테이너에 대해서 설명할 때, 컨테이너는 우리 애플리케이션을 실행하기 위한 프로그램들이 모두 설치되어 있는 컴퓨터라는 비유를 한 적이 있습니다.
컴퓨터 내부 파일 시스템을 어떻게 구성할 것이고, 어떠한 디렉토리에서 작업을 수행할 것인지를 결정한다고 이해하면 좋을 것 같습니다.

3번의 경우에는 어찌저찌 우리가 원하는 프로그램들이 설치된 컴퓨터를 구성했다고 가정했을때, 해당 컴퓨터로 어떠한 작업을 수행할지를 의미합니다.

물론, 제가 설명한 내용들을 제외하고도 고려해야할 사항들이 매우 많습니다.

데이터를 어떻게 영구적으로 보관할 것인가부터, 만약 애플리케이션일 경우 어떠한 포트를 노출시킬 것인가 등등 Dockerfile을 작성하면서 다양한 설정들을 추가할 수 있으나, 비교적 간단한 명령어들만 살펴보도록하겠습니다.

Dockerfile 명령어


[Reference : https://docs.docker.com/develop/develop-images/dockerfile_best-practices/]

해당 이미지는 도커 홈페이지 공식 문서에 있는 예제를 가져온 것입니다.

제가 지난 시간에 작성했던 Dockerfile에서 사용했던 명령어들이 몇개 있습니다.

FROM 이라던가, COPY, CMD..

해당 예제를 통하여 설명해도 좋을 것 같지만, 예제에 없는 명령어들도 몇개 있어서 그냥 이전에 사용했던

이 Dockerfile을 활용해서 설명하도록 하겠습니다.

Dockerfile에 대한 자세한 명령어는 다음 공식 문서에 예제와 함께 잘 나와있기 때문에, 더 궁금하신 분들은 해당 사이트를 참조하셔서 살펴보면 좋을 것 같습니다.
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

FROM

FROM 명령어 뒤에 이미지 이름을 기입할 경우, 해당 이름을 가진 이미지를 Docker hub로부터 다운받아옵니다.

위 예제에서는 ubuntu를 사용한 것으로보아, Ubuntu를 베이스로 컨테이너를 실행하고자 했음을 알 수 있습니다.

ubuntu 뒤에 클론(":")이 보이고, 22.04라는 숫자가 기입된 것을 확인할 수 있는데, 클론 뒤에 기입되는 숫자는 태그로, 일종의 버전을 나타냅니다.

동일한 프로그램일지라도 여러 버전이 존재하기 때문에 태그를 통하여 이들을 분류합니다.


[Reference : https://hub.docker.com/_/ubuntu/tags]

다음은 실제 Docker hub의 Ubuntu 이미지로,

들어가보시면 다음처럼 ubuntu 라는 이미지에 수많은 태그가 존재함을 확인할 수 있습니다.

참고로 latest 태그는 가장 최신 버전의 이미지를 의미하며, 태그를 따로 기입하지 않았을 경우에는 자동으로 latest 이미지를 가져옵니다.

우리는 자바를 실행해야하기 때문에,

다음처럼 jdk 이미지를 가져오도록 하였습니다.
java 이미지는 일정 버전 이후부터는 없는 것 같습니다..

WORKDIR

작업을 수행할 기본적인 위치를 지정하는 명령어입니다.

여기서의 위치는 컨테이너 내부의 위치이며, 파일의 추가 등의 작업이 기본적으로 이곳에서 일어난다고 생각하시면 좋을 것 같습니다.

존재하는 파일의 경로를 입력할 경우, 해당 파일 내부에서 작업이 수행되며

존재하지 않는 파일의 경우에는 파일을 생성하여 해당 파일 내부에서 작업이 수행됩니다.

보통 /app과 같이 별도의 폴더를 생성해서 작업 공간으로 삼은 뒤 실행하는 것 같습니다.

저는 다음처럼 WORKDIR을 지정해두었습니다.

COPY

로컬의 환경을 컨테이너 내부로 복사하는 명령어입니다.
현재 우리가 가지고 있는 DockerPractice.java 파일을 컨테이너 내부에 복사해둬야 실행할 수 있기 때문에 로컬 파일 모두를 컨테이너 파일에 저장하도록 하겠습니다.

COPY 명령어를 보면 .과 .을 공백으로 구분되어 있음을 확인할 수 있는데,

왼쪽은 로컬 환경, 오른쪽은 컨테이너 내부 환경을 나타냅니다.

즉, COPY(복사합니다) .(현재 경로에 있는 모든 로컬 파일을) .(컨테이너 내부 환경에)

로 해석할 수 있습니다.

RUN

컨테이너를 실행하기 전, 수행해야하는 명령을 나타냅니다.

java 파일을 실행하기 전, java 파일을 클래스 파일로 변환하는 작업을 거쳐야하기 때문에 다음처럼 작성하였습니다.

CMD

컨테이너가 동작한 뒤, 실행할 작업을 의미합니다.
즉, CLI 환경에서 수행할 명령어를 기입한다고 생각하면 되는데, 공백을 기준으로 단어를 분리합니다.

즉, 우리가 실행해야할 명령어는

$ java DockerPractice

이므로, 다음의 형태를 띄게됩니다.

Dockerfile -> Image

대충 Dockerfile을 작성한 것 같으니, 이를 이미지로 만들어 보겠습니다.

Dockerfile을 이미지로 변환하는 명령어는 기본적으로 다음과 같습니다.

$ docker build .

이는 현재 경로에 위치한 Dockerfile을 찾아서 해당 Dockerfile을 토대로 이미지를 만든다는 명령어인데,

여기서 -t 옵션을 통해 만들어지는 이미지에 이름을 부여할 수 있습니다.

저는 dockerjava라는 이름을 부여하였으며,

다음처럼 docker images를 통해 이름이 부여된 것을 확인할 수 있습니다.

이미지에 부여되는 이름은 소문자만 사용할 수 있습니다!

Image -> Container

그럼 만들어진 이미지를 컨테이너로 만들어 우리가 원하는 메세지가 출력되는지 확인해보겠습니다.

다음처럼 우리가 원하는 메세지가 출력되는 것을 확인할 수 있습니다.

이미지를 컨테이너로 변환하는 명령어는 기본적으로 다음과 같습니다.

$ docker run {image 이름}

그러나 저는 여기서 --rm 이라는 옵션과 --name 이라는 옵션을 추가하였는데,

--rm 옵션의 경우 컨테이너가 종료되었을경우 자동으로 삭제되도록 지정하는 옵션이고,
--name옵션의 경우에는 컨테이너에 이름을 부여하는 옵션입니다.

--rm 옵션으로 인하여 종료된 컨테이너가 보이지 않음을 확인할 수 있으며,

--rm 옵션을 사용하지 않았을 경우, 다음처럼 이름이 지정된 컨테이너가 존재함을 확인할 수 있었습니다.

일단 오늘은 간단하게 Dockerfile을 어떻게 작성하는지 알아보고, 이를 토대로 간단한 Java 파일을 실행해보았는데, 다음에는 간단한 Spring 프로젝트를 동작시켜보도록 하겠습니다!

0개의 댓글

관련 채용 정보