Dockerfile 이란?
도커 이미지를 만들기 위해서는 Dockerfile
이라는 이미지 빌드용 DSL(Domain Specific Language) 파일을 사용한다.
쉽게 말하면 이미지를 만들 때 필요한 설정파일이라고 보면 되겠다.
기본적으로 Dockerfile이라는 이름을 사용하고, 다른 이름을 사용하고 싶을 경우 -f
옵션을 준다.
Dockerfile 명령어
기본적인 명령어를 살펴보고, 예제를 통해서 더 공부해보자.(참고:https://docs.docker.com/engine/reference/builder/)
- FROM: 베이스 이미지를 지정한다. 이미지 빌드 시 여기에 지정된 이미지를 내려받는다.
- RUN: 컨테이너 안에서 실행될 명령어를 정의한다.
- CMD: 컨테이너 안에서 실행할 프로세스를 지정한다. 명령을 공백으로 나눠서 실행한다.
- LABEL: 라벨을 설정한다.
- ENV: 도커 컨테이너 앙네서 사용할 수 있는 환경변수를 지정한다.
- COPY: 도커가 동작 중인 호스트의 파일이나 디렉토리를 컨테이너 안으로 복사
- VOLUME: 볼륨 마운트
- USER: 사용자 지정
- WORKDIR: 작업 디렉토리
- ARG: Dockerfile 에서의 변수
Docker build
이미지를 빌드하는 명령어
$ docker build [OPTIONS] PATH | URL | -
생성할 이미지 이름을 지정하는 -t(--tag)
옵션으로 빌드가 가능함. app이라는 이미지를 만든다.
$ docker build -t app .
만약 이미지 이름을 주지 않으면 REPOSITORY에 이름이 <none>으로 나온다.
예제_1
Docker 이미지를 빌드하여, 자바 어플리케이션을 실행시켜보자.
Test.java를 하나 생성한다. Test.java는 "Hello Docker! -Corn-"을 프린트한다.
public class Test {
public static void main(String[] args) {
System.out.println("Hello Docker! -Corn-");
}
}
이제 이미지 빌드에 필요한 Dockerfile을 생성한다.
FROM openjdk:8-jdk
COPY Test.java .
RUN javac Test.java
CMD ["java", "Test"]
FROM
도커 이미지의 바탕이 될 베이스 이미지를 지정한다.
openjdk 이미지를 베이스로 하기 때문에 java, javac와 같은 명령어를 실행시킬 수 있다.
openjdk의 Dockerfile FROM에는 ubuntu를 사용하고 있으며, 이미지는 겹겹이 포장되어 빌드된다.
COPY
호스트 머신에 있는 Test.java가 컨테이너안의 디렉터리로 복사된다.
(이미지 빌드시 1번만 실행)
RUN
javac 명령어를 사용하여 Test.java를 컴파일 한다.
(이미지 빌드시 1번만 실행)
CMD
java 명령얼르 사용하여 컴파일된 Test.class 파일을 실행한다.
(이미지가 실행될 때마다 실행되는 명령어)
CMD의 작성법은 여러가지가 존재한다.
- CMD command param1 param2 [...]
- CMD ["executable", "param1", "param2" [, ...]]
2번째 방법이 도커에서 권장하는 방법이다.
1번째 방법은 FROM 에서 설정한 이미지에 포함된 쉘 파일을 사용하여 명령어를 실행한다. 따라서 쉘 스크립트 구문을 사용할 수 있다.
2번째 방법은 쉘 없이 바로 실행하면서 매개변수를 던져주는 형태이다. 쉘 스크립트 구문을 사용할 수 없으며, 쉘 스크립트 구문을 사용하고 싶다면 쉘을 실행시키면서 인자로 전달해줘야한다.
CMD ["/bin/bash", "-c", "echo Hello, $name"]
도커이미지를 만들어보자.(Dockerizing)
Dockerfile이 존재하는 경로에서 아래의 명령어를 실행한다.
$ docker build -t hello_docker .
image가 잘 생성되었는지 확인해보자.
image가 잘 생성되었는지 확인했으니, 생성된 image가 잘 동작하는시 실행시켜보자.
$ docker run hello_docker
우리가 만든 자바 애플리케이션이 잘 동작하는 것을 확인할 수 있다.!
'프로그래밍 노트 > 도커' 카테고리의 다른 글
[docker] 안쓰는 도커 이미지 및 컨테이너 삭제 (0) | 2020.12.29 |
---|---|
[docker] COPY failed: Forbidden path outside the build context 오류 해결법 (0) | 2020.12.09 |
[docker] docker compose 작성법 알아보기 (0) | 2020.10.09 |
[docker] docker compose 커맨드 (1) | 2020.10.09 |
[docker] 도커 컨테이너(container) 실행하기 (0) | 2020.10.06 |