들어가며
몇 달전 MSA가 핫한 기술이라고 하여, 무작정 관련 서적을 사서 읽던 중..
외계어 같은 도커 컴포즈? 컨테이너? 만나 한계에 부딪혀서 도커 공부를 시작하게되었습니다ㅎㅎ
아직 도린이지만, 공부한 내용을 공유하고자 합니다~
=> 도커 컴포즈, 스웜, 쿠버네티스 같은 고급? 내용은 아직 정리를 못하였고 기초적인 내용(이미지, 컨테이너 다루기)이 포함되어있습니다.
컨테이너로 애플리케이션 실행하기
우선 로컬 PC에 도커가 설치되었다고 가정하고 시작하겠습니다.
도커는 https://hub.docker.com/search?q=&type=edition&offering=community 에서 받을 수 있습니다!
컨테이너로 애플리케이션을 실행하는 방법을 배우기 전에 도커 이미지와 도커 컨테이너의 관계를 먼저 이해해야합니다.
도커 이미지와 컨테이너 관계
개념 | 역할 |
도커 이미지 | 도커 컨테이너를 구성하는 파일 시스템과 실행할 애플리케이션을 설정을 하나로 합친 것으로, 컨테이너를 생성하는 템플릿 역할을 한다. |
도커 컨테이너 | 도커 이미지를 기반으로 생성되며, 파일 시스템과 애플리케이션이 구체화돼 실행되는 상태 |
예를 들어 우분투 파일 시스템 이용을 정의한 도커 이미지로 도커 컨테이너를 생성한 상황은 다음과 같이 나타낼 수 있다.
도커 이미지 하나로 여러 개의 컨테이너를 생성하는 것이 가능
간단한 애플리케이션과 도커 이미지 만들기
레퍼런스 : https://docs.docker.com/engine/reference/builder/
java 언어로 만든 간단한 애플리케이션을 도커 컨테이너로 실행시켜보려고 합니다.
우선 Hello.java라는 파일에 다음 코드를 작성합니다.
public class Hello{
public static void main(String[] args){
System.out.println("Hello Fintech Lab!!");
}
}
그 다음 Hello.java 가 있는 디렉토리에 Dockerfile을 작성합니다.
FROM openjdk:8-jdk
RUN mkdir /test
COPY Hello.java /test
RUN javac /test/Hello.java
WORKDIR /test
CMD ["java", "Hello"]
도커 이미지를 만들기 위해서는 Dockerfile이라는 이미지 빌드용 DSL(DOMAIN SPECIFIC LANGUAGE)파일을 사용합니다. 쉽게 말하면 이미지를 만들때 필요한 설정파일이라고 보면 됩니다. (기본적으로 Dockerfile이라는 이름을 사용하고, 빌드시 다른 이름을 사용하고 싶을 경우 -f 옵션을 줍니다.)
여기 사용된 FROM, RUN 같은 키워드를 인스트럭션(명령)이라고 하며, 기본적인 것부터 알아보겠습니다.
FROM 인스트럭션
FROM 인스트럭션은 도커 이미지의 바탕이 될 베이스 이미지를 지정합니다. Dockerfile로 이미지를 빌드할 때 먼저 FROM 인스트럭션에 지정된 이미지를 내려받습니다.
FROM에서 받아오는 도커 이미지는 도커 허브(Docker Hub) 라는 레지스트리에 공개된 것이며, 기본적으로 FROM에 지정한 이미지는 도커 허브 레즈스트리에서 참조합니다.
위의 Dockerfile로 돌아가서 FROM 인스트럭션을 보면, openjdk 이미지를 베이스로 하고 있는걸 볼 수 있습니다. 따라서 java, javac와 같은 명령어를 실행할 수 있어 Hello.java가 실행될 수 있는 환경이 구축됩니다.
openjdk이미지의 Dockerfile 을 보면 FROM 절에 ubuntu를 사용하고 있으며, 이미지는 겹겹이 포장되어 빌드될 수 있습니다.
RUN 인스트럭션
RUN 인스트럭션은 도커 이미지를 실행할 때 컨테이너 안에서 실행할 명령을 정의하는 인스트럭션입니다. 인자로 도커 컨테이너 안에서 실행할 명령을 그대로 기술하면 됩니다.
※ Hello.java 애플리케이션을 배치하기 위해서 /test 디렉토리를 mkdir 명령으로 만든 것을 볼 수 있습니다.
COPY 인스트럭션
COPY 인스트럭션은 도커가 동작 중인 호스트 머신의 파일이나 디렉터리를 도커 컨테이너 안으로 복사하는 인스트럭션입니다.
※ 호스트에서 작성한 파일을 도커 컨테이너 안에서 실행할 수 있도록 컨테이너 안으로 /test 디렉토리로 복사하는걸 볼 수 있습니다.
CMD 인스트럭션
CMD 인스트럭션은 도커 컨테이너를 실행할 때 컨테이너 안에서 실행할 프로세스를 지정합니다. RUN 인스트럭션은 이미지를 빌드할 때 실행되고 CMD 인스트럭션은 컨테이너를 시작할 때 한 번 실행 됩니다.
RUN은 애플리케이션 업데이트 및 배치에, CMD는 애플리케이션 자체를 실행하는 명령이라고 생각하면 됩니다.
즉, 쉘 스크립트로 치면 다음과 같은 실행 명령 역할을 합니다.
$ java Hello.java
도커 이미지 만들기
저희는 도커 이미지를 만들기 위해서 Hello.java와 Dockerfile을 작성했습니다.
이 파일들만 있으면 저희도 도커 이미지를 만들 수 있습니다.
Dockerfile과 Hello.java가 있는 위치에서 아래의 명령어를 실행시킵니다.
$ docker image build -t example/hello:latest .
빌드를 실행하면 베이스 이미지를 내려받고 RUN , COPY 인스트럭션에 지정된 명령이 단계적으로 실행되는 것을 볼 수 있습니다.
자..! 이러면 이미지 빌드가 완료되었습니다. 생성된 이미지를 확인하려면 docker image ls 명령어를 사용합니다.
저희가 빌드한 example/hello 이미지가 성공적으로 생성된 것을 볼 수 있습니다.
docker image build 명령의 기본 문법은 아래와 같습니다.
- -t 옵션 : 이미지명을 지정. 태그명도 지정할 수 있으며, 생략 시에는 latest 태그가 붙는다. -t 옵션 없이도 빌드 자체는 가능하지만, 이미지명없이 빌드가 되므로 -t 옵션은 꼭 지정하는게 좋다.
docker image build -t 이미지명[:태그명] Dockerfile경로
도커 컨테이너 실행
대망의 컨테이너 실행시간. 이미지를 생성했으니 컨테이너로 이미지를 실행시켜봅니다.
$ docker container run example/hello:latest
저희가 작성한 자바 애플리케이션이 컨테이너에서 실행되는 것을 볼 수 있습니다.
'프로그래밍 노트 > 도커' 카테고리의 다른 글
도커살펴보기_도커 컨테이너 다루기 (0) | 2021.01.17 |
---|---|
도커살펴보기_이미지 다루기 (0) | 2021.01.15 |
[docker] 데이터 볼륨, 데이터 볼륨 컨테이너 (0) | 2020.12.30 |
[docker] 안쓰는 도커 이미지 및 컨테이너 삭제 (0) | 2020.12.29 |
[docker] COPY failed: Forbidden path outside the build context 오류 해결법 (0) | 2020.12.09 |