Docker?

김태훈·2024년 1월 14일
0

Docker를 들어본 적은 많았지만, 왜 써야하는지 어떤 기능을 하는지에 대해 알지 못 했다.
CI/CD를 공부하면서 Docker의 역할에 대해 알고자 정리합니다.

Docker?

컨테이너화 기술을 사용하여, 애플리케이션을 더 쉽게 개발, 배포, 실행할 수 있도록 하는 플랫폼입니다.

간단하게 하면 가상의 리눅스 컴퓨터를 이용하여 각각의 어플리케이션을 독립적으로 실행시켜주는 기술입니다.

VM(Virtual Machine)과의 차이

docker와 VM 둘 다 애플리케이션을 격리된 환경에서 실행할 수 있게 하는 가상화 기술이지만, 그 구조와 작동 방식에는 몇 가지 중요한 차이점이 있습니다.

  • VM

각각의 독립된 OS를 가지므로, 물리적인 메모리, CPU등의 자원을 할당 받으므로 자원 소모가 발생하여 결국 이미지의 크기가 전체 OS, 애플리케이션 및 라이브러리를 포함하므로 크기가 상대적으로 큽니다.

  • Docker

Docker는 호스트 OS의 커널을 공유하면서 컨테이너를 실행하므로 VM에 비해 더 가볍고 빠르게 실행됩니다.
Docker 이미지는 애플리케이션과 그에 필요한 종속성만을 포함하므로 크기가 상대적으로 작습니다.

Docker 이미지

Jenkins, Mysql등 각각의 앱을 Docker 환경에서 실행할 수 있게 담고 있는 것입니다.
Spring Boot를 Docker에 담고 싶다면 Dockerfile을 작성하여 이를 통해 build할 수 있습니다.

jenkins나 tomcat등 자주 사용하는 이미지들은 https://hub.docker.com/ 에서 검색하여
docker pull 을 이용하여 이미지를 받아올 수 있습니다.

Dockerfile 예시

# JDK11 이미지 사용
FROM openjdk:11-jdk

VOLUME /tmp

# JAR_FILE 변수에 값을 저장
ARG JAR_FILE=./build/libs/dockerTest-1.0.jar

# 변수에 저장된 것을 컨테이너 실행시 이름을 app.jar파일로 변경하여 컨테이너에 저장
COPY ${JAR_FILE} app.jar

# 빌드된 이미지가 run될 때 실행할 명령어
ENTRYPOINT ["java","-jar","app.jar"]
  • FROM: 기반이 되는 이미지 설정, Dockerfile은 FROM 명령어로 시작해야 합니다.

  • VOLUME: Docker 컨테이너에 의해 사용되는 데이터를 유지하는데 사용합니다.
    Spring Boot에서 기본적으로 톰캣 작업 디렉토리로 /tmp 폴더를 사용하므로 해당 폴더를 VOLUME에 추가합니다.
    그러면 호스트의 Docker 특정 영역에 임시 파일을 생성하고 컨테이너 내부 디렉토리인 /tmp에 링크합니다.

  • ARG: 빌드 타임에 사용되는 변수를 정의하는데 사용

  • ADD: 파일이나 디렉토리 등을 복사하여 이미지 파일시스템에 추가합니다.
    위의 예시에서는 project jar파일 ./build/libs/dockerTest-1.0.jar을 컨테이너에 app.jar로 추가됩니다.

    ADD와 COPY의 차이점, 모두 src경로의 파일이나 디렉토리를 복사헤 dest 경로의 이미지 파일시스템에 추가하지만 약간의 차이가 있습니다.

  • ENV: 환경변수를 설정합니다.

  • RUN: 새로운 레이어에서 명령어를 실행하고 결과를 커밋합니다.

  • ENTRYPOINT: 컨테이너를 실행할 때 실행될 명령을 정의합니다.

docker 명령어

  • 이미지 가져오기
docker pull [앱]:[태그]

태그는 앱의 버전이며
lts는 Long Term Support 장기지원을 의미하며 jenkins:lts는 jenkins의 최신 lts버전을 가져오게 됩니다.
jenkins:latest는 제일 최신 버전이 받아집니다.

  • 이미지 확인하기
docker images
  • container 명령어
[] -> 안의 문자는 '' 로 감싸주시고 숫자는 그냥 쓰시면 됩니다
docker run 
	--name [내가 지정할 컨테이너 이름 (지정 안 할 시 랜덤)]
	-p [외부에서 그니까 리눅스 컴퓨터에서 접근하고 싶은 포트]:[컨테이너 내부에서 연결될 포트]
	--link [도커 컨테이너끼리 연결이 안 될 수있는데 이를 통해 연결]
	-e [mysql 같은걸 실행할때 필요한 매개변수 앞에]
	-d [백그라운드에서 실행]
	[마지막에 실행할 도커 이미지의 name이나 id]

ex)

docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=test1234 -d -p 3306:3306 mysql

docker run --name tomcat -p 8080:8080 --link mysql-container -d tomcat

docker run -d -p 3000:8080 -v /jenkins:/var/jenkins_home --name jenkins -u root jenkins/jenkins:lts
  • 내가 만든 container 확인
docker ps [현재 실행중인 컨테이너 확인]
docker ps -a [실행 중이지 않은 컨테이너까지 확인]
  • container 끄기, 켜기
docker start [컨테이너 name or id]
docker stop [컨테이너 name or id]
docker return [컨테이너 name or id]
  • container 안에 명령어 작성
    이미지로 컨테이너를 실행시킨 후, 컨테이너 내부에서 실행시켜 내부의 cli 접속할 수 있습니다.
docker exec -it [컨테이너 name or id] /bin/bash

-it : docker 내 bash로 접근할 수 있습니다.

  • container 삭제
docker rm [컨테이너 name or id]
  • 이미지 삭제
docker rmi [이미지 name or id]




refenrence

https://velog.io/@wan2daaa/docker-%EC%B5%9C%EB%8C%80%ED%95%9C-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%B4%EB%B3%B4%EC%9E%90

0개의 댓글

관련 채용 정보