ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Docker
    카테고리 없음 2024. 2. 22. 02:02

    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

Designed by Tistory.