개념정리 & 실행하기
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/
'개발 하나둘셋 > Java & Spring' 카테고리의 다른 글
AWS SDK for Java V1, V2 차이 / s3객체 업로드, 복사, 삭제 구현하기 (0) | 2023.06.26 |
---|---|
TeamCity로 CI/CD 적용하기 (0) | 2022.11.10 |
SpringBoot 슬랙 Slack알림보내기 ChatPostMessageRequest (0) | 2022.06.15 |
SpringBoot SMTP서버를 활용한 메일 보내기 (0) | 2022.06.07 |
spring 게시판 기간조회 동적으로 처리하기 querydsl (0) | 2022.05.18 |