Docker를 들어본 적은 많았지만, 왜 써야하는지 어떤 기능을 하는지에 대해 알지 못 했다.
CI/CD를 공부하면서 Docker의 역할에 대해 알고자 정리합니다.
컨테이너화 기술을 사용하여, 애플리케이션을 더 쉽게 개발, 배포, 실행할 수 있도록 하는 플랫폼입니다.
간단하게 하면 가상의 리눅스 컴퓨터를 이용하여 각각의 어플리케이션을 독립적으로 실행시켜주는 기술입니다.
docker와 VM 둘 다 애플리케이션을 격리된 환경에서 실행할 수 있게 하는 가상화 기술이지만, 그 구조와 작동 방식에는 몇 가지 중요한 차이점이 있습니다.
각각의 독립된 OS를 가지므로, 물리적인 메모리, CPU등의 자원을 할당 받으므로 자원 소모가 발생하여 결국 이미지의 크기가 전체 OS, 애플리케이션 및 라이브러리를 포함하므로 크기가 상대적으로 큽니다.
Docker는 호스트 OS의 커널을 공유하면서 컨테이너를 실행하므로 VM에 비해 더 가볍고 빠르게 실행됩니다.
Docker 이미지는 애플리케이션과 그에 필요한 종속성만을 포함하므로 크기가 상대적으로 작습니다.
Jenkins, Mysql등 각각의 앱을 Docker 환경에서 실행할 수 있게 담고 있는 것입니다.
Spring Boot를 Docker에 담고 싶다면 Dockerfile을 작성하여 이를 통해 build할 수 있습니다.
jenkins나 tomcat등 자주 사용하는 이미지들은 https://hub.docker.com/ 에서 검색하여
docker pull 을 이용하여 이미지를 받아올 수 있습니다.
# 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 pull [앱]:[태그]
태그는 앱의 버전이며
lts는 Long Term Support 장기지원을 의미하며 jenkins:lts는 jenkins의 최신 lts버전을 가져오게 됩니다.
jenkins:latest는 제일 최신 버전이 받아집니다.
docker images
[] -> 안의 문자는 '' 로 감싸주시고 숫자는 그냥 쓰시면 됩니다
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
docker ps [현재 실행중인 컨테이너 확인]
docker ps -a [실행 중이지 않은 컨테이너까지 확인]
docker start [컨테이너 name or id]
docker stop [컨테이너 name or id]
docker return [컨테이너 name or id]
docker exec -it [컨테이너 name or id] /bin/bash
-it : docker 내 bash로 접근할 수 있습니다.
docker rm [컨테이너 name or id]
docker rmi [이미지 name or id]