개발 하나둘셋/Java & Spring

Docker 알아보기! Dockerfile 만들기, 이미지와 컨테이너 빌드하기

유리코딩 2022. 9. 16. 11:52
반응형

개념정리 & 실행하기

Docker 도커

 

 

직접 docker를 활용한 서버 배포를 경험하게 되었다. 유튜브 영상들과 팀장님의 친절한 설명으로 flow를 이해하고 나니 생각보다 어렵지 않았다!(고 해놓고 도커파일 만들고 컨테이너 빌드하는데 하루 웬종일 걸렸다😅) 경험은 해봤지만 아직 도커파일이나 도커 명령어들이 익숙하지 않아 다시보면 기억이 나게끔 정리를 해보았다!

 

[차례]
1. Docker란?
  - Docker의 개념 
  - Docker의 작동방식
2. Docker 사용하기 
 - Docker flow
- Docker file

 

1. Docker란?

Docker의 개념

  • Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼
  • Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있음
  • 설명이 너무 잘 되어 있어 유튜브 영상 첨부!!

 

 

Docker의 작동방식

  • Docker기술은 Linux 커널과 함께 Cgroups 및 네임스페이스와 같은 커널의 기능을 사용하여 프로세스를 분리함으로써 독립적으로 실행될 수 있도록 함. 이러한 독립성은 컨테이너의 본래 목적
  • 여러 프로세스와 애플리케이션을 서로 개별적으로 실행하여 인프라를 더 효과적으로 활용하고 개별 시스템을 사용할 때와 동일한 보안을 유지
  • Docker를 포함한 컨테이너 툴은 이미지 기반 배포 모델을 제공하므로 여러 환경 전반에서 애플리케이션 또는 서비스를 모든 종속 항목과 손쉽게 공유. Docker는 이 컨테이너 환경 내에서 애플리케이션(또는 앱을 구성하는 결합된 프로세스) 배포를 자동화
  • 이러한 툴은 Linux 컨테이너를 기반으로 구축되어 Docker를 사용자 친화적이고 고유하게 만들어 주므로 사용자는 쉽게 앱에 액세스해 빠르게 배포하고 버전 및 버전 배포를 관리
반응형

 

2. Docker 사용하기

Docker flow

 

1. 이미지를 만들 폴더에 dockerfile생성 . 이름은 꼭 Dockerfile로!

  • touch Dockerfile

 

2. dockerfile이 있는 곳에 이미지 만들기

  • docker build -t {이미지 이름} {경로}(.은 현재폴더 의미)
  • doccker build -t image .

 

3. 이미지가 만들어졌는지 확인, 현재 존재하는 이미지 확인

  • docker images / docker images -a(모든이미지 보기)

 

4. container 생성하고 build하기

  • docker run -itd -p {호스트의 포트 번호}:{컨테이너의 포트 번호} -v {호스트의 디렉토리}:{컨테이너의 디렉토리} —name {생성할 컨테이너 태그명} {올릴이미지 태크명})
  • docker run -itd -p 8080:8080 -v /data:/data —name container image

 

5. 컨데이터가 만들어졌고 돌아가는지 확인

  • docker ps(현재 돌아가고 있는 container) / docker ps -a(모든 컨테이너 보기)

 

docker 명령어 참고 -> https://www.yalco.kr/36_docker/

 

Dockerfile

# 이미지를 생성할 때 사용할 기반 이미지
FROM openjdk:11  

# Dockerfile 작성자
MAINTAINER uri  

# --build-arg 옵션을 통해 넘길 수 있는 인자를 정의
ARG DEBIAN_FRONTEND=noninteractive

# 이미지에서 사용할 환경변수 값 지정
ENV TZ=Asia/Seoul

# image가 올라갔을 때 수행되는명령어들
RUN apt-get update && \
	apt-get install -y apache2
    
# 파일이나 폴더를 이미지에 복사
COPY hello.jar /root/hello.jar
COPY entrypoint.sh /root/run.sh

# 작업 디렉토리
WORKDIR /root  

# Dockerfile의 빌드로 생성된 이미지에서 열어줄 포트
EXPOSE 8080

#  컨테이너를 생성, 실행 할 때 실행할 명령어
CMD ["java", "-jar"]

FROM : 이미지를 생성할 때 사용할 기반이미지. 어느 이미지에서 시작할건지 설정

 

MAINTAINER : 이미지를 생성한 개발자의 정보 (1.13.0 이후 사용 X)

 

ARG : Dockerfile 내부 변수, 이미지를 빌드 시, --build-arg 옵션을 통해 넘길 수 있는 인자를 정의하기 위해 사용

 

ENV : 이미지에서 사용할 환경 변수 값을 지정

 

LABEL : 이미지에 메타데이터를 추가 (key-value 형태)

 

RUN : 새로운 레이어에서 명령어를 실행하고, 새로운 이미지를 생성(Shell 방식, Exec 방식)

  • RUN 명령을 실행할 때 마다 레이어가 생성되고 캐시됨
  • 따라서 RUN 명령을 따로 실행하면 apt-get update는 다시 실행되지 않아서 최신 패키지를 설치할 수 없음
  • 위 처럼 RUN 명령 하나에 apt-get update와 install을 함께 실행

 

COPY / ADD : build 명령 중간에 호스트의 파일 또는 폴더를 이미지에 가져오는 것

  • ADD 명령문은 좀 더 파워풀한 COPY 명령문
  • ADD 명령문은 일반 파일 뿐만 아니라 압축 파일이나 네트워크 상의 파일도 사용 가능
  • 특수한 파일을 다루는 게 아니라면 COPY 명령문을 사용을 권장
  • 파일 이름을 바꿔서 저장할 수 있음. ex) entrypoint.sh -> run.sh
  • 상대 경로를 사용할 경우 WORKDIR로 지정한 디렉토리를 기준으로 복사

 

WORKDIR : 작업 디렉토리를 지정. 해당 디렉토리가 없으면 새로 생성

  • "RUN", "CMD", "ENTRYPOINT" 명령이 실행될 작업 디렉토리
  • 작업 디렉토리를 지정하면 그 이후 명령어는 해당 디렉토리를 기준으로 동작
  • cd 명령어와 동일

 

EXPOSE : Dockerfile의 빌드로 생성된 이미지에서 열어줄 포트를 의미

  • 호스트 머신과 컨테이너의 포트 매핑시에 사용
  • 컨테이너 생성 시 -p 옵션의 컨테이너 포트 값으로 EXPOSE 값을 기재

 

USER : 이미지를 어떤 계정에서 실행 하는지 지정. 명령 실행할 사용자 권한 지정

  • 기본적으로 root에서 해준다.

 

CMD / ENTRYPOINT : 컨테이너를 생성, 실행 할 때 실행할 명령어

  • docker run 명령으로 컨테이너를 생성하거나, docker start 명령으로 정지된 컨테이너를 시작할 때 실행
  • 보통 컨테이너 내부에서 항상 돌아가야하는 서버를 띄울 때 사용
  • CMD
    • docker run 실행 시 명령어를 주지 않았을 때 사용할 default 명령을 설정하거나, ENTRYPOINT의 default 파라미터를 설정할 때 사용
    • CMD 명령의 주용도는 컨테이너를 실행할 때 사용할 default를 설정
    • CMD 명령의 3가지 형태
      • CMD [“executable”,”param1”,”param2”]
      • CMD [“param1”,”param2”]
      • CMD command param1 param2 
FROM ubuntu
CMD echo "This is a test."

위와 같이 Dockerfile을 만들었을 때, docker run 실행 시 아무런 커맨드를 주지 않으면 CMD 명령 실행

 

  • ENTRYPOINT
    • docker run 실행 시 실행되는 명령어
    • ENTRYPOINT의 2가지 형태 
      • ENTRYPOINT [“executable”, “param1”, “param2”]
      • ENTRYPOINT command param1 param2
FROM ubuntu
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["world"]

위 Dockerfile의 내용을 실행하면 CMD에서 설정한 default 파라미터가 ENTRYPOINT에서 사용. docker run 명령 실행 시 파라미터를 주면 CMD에서 설정한 파라미터는 사용되지 않음

 

$ docker run -it --rm <image-name>
Hello world
$ docker run -it --rm <image-name> ME
Hello ME
$

 

CMD와 ENTRYPOINT의 조합은 공식문서 참고

 

 

 

[느낀 점]

도커에 대해서는 부트캠프를 할 때부터 들어서 알고 있었고 유튜브에서도 핫하다길래 몇번 본적이 있다. 이미지-컨테이너에 대해서는 정말 많이 들었었는데 이해는 이해고 손으로 구현하는것은 또 다른문제! 맨날 해봐야지 해봐야지 생각만하다가 이번에 팀장님이 기회를 주셔서 경험하게 되었다! 서버쪽은 명령어도 복잡하고 정말 검정화면에 흰글씨뿐이라 어렵게 느껴졌는데 flow를 이해하고 직접 build 해보니 꽤 재밌었다! 이미지와 컨테이너도 계속 만들었다 지웠다해보고, 다른프로젝트의 서버는 어떻게 생겼나 구경도하면서 서버구조와 도커, 리눅스명령어까지 전반적으로 파악하고 손에 익혀보는 좋은 시간이었다! 아쉬운것은 엔진엑스까지 모두 세팅된 도커에 나는 이미지와 컨테이너를 올리는 작업만했을 뿐.....🥲 다음에는 처음부터 세팅해보는 포스팅도 써야겠다!!!!!!

 

하루하루 배우는게 너무 많아서 정리할게 태산인데 여러가지 이유(핑계)로 정리를 못하고 있다. 사실 오늘 쓴 도커관련 글도 한달전에 작업한 내용😅 앞뒤로 새로 학습한 내용이 많은데 잊어버릴까봐 먼저정리해봤다. 부지런히 정리해야겠다!💪

 

 

 

< References >

https://aws.amazon.com/ko/docker/

https://www.redhat.com/ko/topics/containers/what-is-docker

https://www.yalco.kr/36_docker/

https://wooono.tistory.com/123

https://javacan.tistory.com/entry/docker-start-7-create-image-using-dockerfile

https://blog.leocat.kr/notes/2017/01/08/docker-run-vs-cmd-vs-entrypoint

https://www.daleseo.com/dockerfile/

 

 

 

 

반응형