[Section4] Docker

2023. 7. 20. 00:59

🧑🏻‍💻 TIL(Today I Learned)


✔️ Docker

 

컨테이너 기술을 "배포"에 사용할 수 없을까? 라는 생각을 시작으로 리눅스 컨테이너(lxc)라는 것을 만들게 되고 그 이후, 2013년에 등장한 도커(Docker)는 Docker Hub라는 소프트웨어 저장소와 함께 빠르게 성장했고 그 결과 개발자들은 쉽게 애플리케이션을 포장하고 컨테이너 방식으로 실행할 수 있게 됨 

 

💡 도커(Docker)

➡️ 애플리케이션의 컨테이너 기술을 이용해 빠르게 배포하고 실행할 수 있도록 도와주는 오픈소스 플랫폼 

➡️ 이전의 가상화 기술과 달리 호스트 OS 위에 오버헤드가 적은 가벼운 컨테이너를 만들어 실행하는 방식으로 동작함 

 

💡 도커 컨테이너(Docker Container)

➡️ 도커 이미지를 바탕으로 생성된 가볍고 독립적인 실행 단위

➡️ 호스트 OS와 다른 컨테이너와 격리되어 있으며 필요에 따라 자원을 할당받아 사용함, 이렇게 생성된 도커 컨테이너는 마치 가상 머신처럼 작동하지만 오버헤드가 적기 때문에 가볍고 빠르게 실행됨

 

위와 같은 특징들 때문에 도커를 사용하면 애플리케이션을 쉽고 빠르게 배포할 수 있으며 호스트 OS와 다른 컨테이너와 격리되어 있기 때문에 더욱 안전하게 실행됨!!

 

 

🔎 도커 컨테이너 생성하기 

$ docker run -it --name mycontainer -p 8080:8080 openjdk:11
  • 도커 컨테이너는 이미지를 통해 만들 수 있음 
    • docker run : 도커 컨테이너를 생성하고 실행하는 명령어 
    • -it : 컨테이너와 상호작용을 위해 표준 입력(stdin)을 연결 (컨테이너를 대화형 모드로 실행)
    • --name mycontainer : 컨테이너의 이름을 "mycontainer"로 지정(필요에 따라 다른 이름으로 변경 가능, 미입력시 랜덤지정)
    • -p 8080:8080 : 호스트의 8080포트와 컨테이너의 8080 포트를 매핑, 호스트의 8080 포트로 들어오는 요청이 컨테이너의 8080 포트로 전달됨 
    • open jdk:11 : 이미지를 통해 컨테이너를 만들게 되는데 사용할 베이스 이미지 지정 

  • 도커 Hub를 통해 해당 이미지를 Pulling 하고 있음 
  • 이미지를 설치하고 해당 이미지를 통해 컨테이너가 만들어지면 jshell을 입력할 수 있게 됨 
    • 위 이미지를 보면 실행한 자바 컨테이너에서 자바 코드를 입력하고 실행할 수 있음 
  • 컨테이너 종료는 Ctrl + D

 

🔎 컨테이너 시작하기 

$ docker start [컨테이너 이름 또는 ID]

$ docker start mycontainer
  • 종료했던 컨테이너를 다시 시작하려면 위와 같이 입력하면 됨 
  • 하지만 위와 같이 입력하면 터미널에서 아까와 같은 jshell이 나타나지 않는데 그럴 때는 옵션을 추가하면 됨
$ docker start -a(--attach) mycontainer

 

📍 사용할 수 있는 옵션 

  • -a, --attach : 컨테이너와 터미널을 연결합니다. 터미널에 연결되어 컨테이너의 출력을 볼 수 있음
  • -i, --interactive : 컨테이너와 상호작용을 위해 표준 입력(stdin) 연결
  • -p, --publish : 호스트와 컨테이너 포트를 연결
  • -d, --detach : 컨테이너를 백그라운드에서 실행
  • -e, --env : 컨테이너 내부의 환경변수 설정
  • -u, --user : 컨테이너 내부에서 실행될 사용자 설정
  • -a, --attach : 컨테이너 출력 표시

 

🔎 컨테이너 중지하기

$ docker stop [컨테이너 이름 또는 ID]

$ docker stop mycontainer

 

📍 사용할 수 있는 옵션 

  • t, -time: 컨테이너가 종료되기까지 대기하는 시간 지정 (기본값은 10초)
  • -time-format: 대기 시간의 형식 지정 (기본값은 "s")

 

🔎  도커 컨테이너 목록 확인하기 

$ docker ps
  • "ps"는 가장 기초적인 도커 명령어 
  • 컨테이너 정보를 출력하고 싶을 때 사용하며 별도의 옵션을 사용하지 않는 ps 명령어는 가동중인 컨테이너만 출력함 
$ docker ps -a(--all) 

$ docker ps -f(--filter) "name=mycontainer"
  • -a, --all : 모든 컨테이너 목록 출력할 수 있는 명령어
  • -f, --filter : 원하는 리스트를 필터링을 통해 출력할 수 있는 명령어 

필터링 옵션 목록

 

🔎 도커 컨테이너 삭제하기 

$ docker rm [컨테이너 이름 또는 ID]

$ docker rm mycontainer

📍 사용할 수 있는 옵션 

  • -f, --force: 실행 중인 컨테이너를 강제 삭제
  • -l, --link=false: 해당 컨테이너를 참조하는 링크 제거
  • -v, --volumes=false: 컨테이너와 관련된 볼륨 제거
  • -n, --name: 컨테이너의 이름 지정
  • -q, --quiet: 컨테이너의 ID 출력
  • --help: 도움말 출력

 

 

 

💡 도커 저장소(Docker Hub)

➡️ 도커 이미지를 저장하고 관리하며 공유할 수 있는 곳 

➡️ 만든 도커 이미지를 저장소에 등록하면 다른 사람들도 해당 이미지를 다운로드하여 사용할 수 있음, 이 이미지는 서버 배포나 애플리케이션 배포 등 다양한 용도로 사용됨

➡️ 저장소의 종류는 크게 세 가지로 나눌 수 있음 

  • Docker Hub 
    : 도커에서 제공하는 공식 저장소, 무료로 사용 가능, 개인적으로 사용하는 것뿐 아니라 공개적으로 이미지 공유 가능 
    : 이미지를 검색하고 다운로드할 수 있는 검색 엔진도 제공함
  • Private Registiry
    : 비공개 저장소, 회사나 조직 내에서 도커 이미지를 공유할 목적으로 구축함 
    : 회사나 조직 내부에서만 접근이 가능하며 보안성이 높음
  • Public Registry
    : 공개 저장소, 누구나 이미지를 등록하고 공유할 수 있음 
    : 누구나 이미지를 검색하고 다운로드할 수 있음 
✔️ 도커 저장소에 이미지 등록하기 

1. https://hub.docker.com/에 접속하여 로그인
2. Repositories 눌러 공개 저장소 만들기 
3. Public으로 설정하여 만들어 저장소에 이미지를 등록하면 누구나 해당 이미지를 검색하고 다운로드하여 사용 가능
4. 도커 이미지를 저장소에 등록하려면 아래와 같은 명령어를 사용하면 됨 

$ docker push {도커 유저네임}/{이미지 명}:{태그}

 

 

💡 도커 이미지 (Docker Image)

➡️ 도커 컨테이너를 생성하기 위한 템플릿

➡️ 애플리케이션을 실행하는 데 필요한 모든 환경과 라이브러리, 소스 코드 등을 포함하고 있으며 이를 기반으로 도커 컨테이너 생성됨
➡️ 도커 이미지는 불변하며 한 번 생성되면 수정할 수 없음

 

 

🔎 도커 이미지 목록 확인하기 

$ docker images
  • 현재 시스템에 다운로드된 도커 이미지 목록을 확인할 수 있음 

 

🔎 도커 이미지 pull 하기 

$ docker pull openjdk

$ docker pull openjdk:11
  • pull 하고 싶은 이미지의 정보와 태그 버전 목록을 확인하여 위와 같은 명령어를 입력하여 pull 
  • 특정 버전의 이미지를 사용하려면 openjdk:버전 형태로 명령어 입력 

 

🔎 도커 이미지 삭제하기

$ docker rmi [이미지 이름 또는 ID]

$ docker rmi openjdk

 

 

 

💡 도커 빌드 

➡️ 도커 이미지를 생성하는 과정을 도커 빌드라고 함 

➡️ 도커 빌드를 통해 도커 이미지를 생성하기 위해서는 아래와 같은 준비물이 필요함

  • 도커 설치
  • 도커 이미지로 만들 내용 
  • 도커 이미지 저장소에 나의 도커 이미지를 push하기 위한 Docker hub 아이디와 내 저장소

 

🔎 빌드 과정 

  1. 도커 이미지를 만들기 위해 도커 빌드를 수행하기 위해서는 프로젝트를 빌드해야 함 
    : 만든 프로젝트 빌드하여 jar 파일을 추출하는 작업을 거쳐야 Dockerfile 스크립트 내용대로 빌드된 jar 파일을 도커 컨테이너에 복사할 수 있음
    : bootJar로 빌드하면 프로젝트 루트 폴더 내 build/libs 하단에 jar 파일이 생긴 것을 볼 수 있음
     
  2. Dockerfile로 이미지 만들기
    - 프로젝트 최상위 경로에 Dockerfile이라는 이름으로 파일 생성하여 스크립트 작성 
# base-image
FROM openjdk:11
# COPY에서 사용될 경로 변수
ARG JAR_FILE=build/libs/*.jar
# jar 빌드 파일을 도커 컨테이너로 복사
COPY ${JAR_FILE} app.jar
# jar 파일 실행
ENTRYPOINT ["java","-jar","/app.jar"]

      - 작성 후 아래 명령어를 이용해 이미지 빌드하기 

docker build -t [username/repository:tag] .

 

BELATED ARTICLES

more