Code

2023.07.19 코드스테이츠 70회차. ( Docker )

ChoHD 2023. 7. 19. 19:13
반응형

Docker 컨테이너

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

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

 

도커 컨테이너(Docker Container)는 도커 이미지를 바탕으로 생성된 가볍고 독립적인 실행 단위 이며, 도커 컨테이너는 호스트 OS와 다른 컨테이너와 격리되어 있으며, 필요에 따라 자원을 할당받아 실행된다.

생성된 도커 컨테이너는 마치 가상머신처럼 동작하지만, 오버헤드가 적기 때문에 가볍고 빠르게 실행된다

 

도커 이미지와 도커 컨테이너는 애플리케이션을 배포하고 실행하는 데 매우 유용한 기술 인데, 도커를 사용하면 애플리케이션을 더욱 쉽고 빠르게 배포할 수 있으며, 호스트 OS와 다른 컨테이너와 격리되어 있기 때문에 더욱 안전하게 실행된다.

 

 

Docker 컨테이너 생성하기

 

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

 

  • openjdk:11 이미지를 가지고 있지 않습니다.
    • 도커 Hub를 통해 해당 이미지를 Pulling 하고 있습니다.
  • 이미지를 설치하고 해당 이미지를 통해 컨테이너가 만들어지면 jshell을 입력할 수 있게 됩니다.
    • 실행한 자바 컨테이너에서 자바 코드를 입력하고 실행할 수 있습니다.

  • 컨테이너를 종료
    • Ctrl + D 입력
    • Docker Desktop에서 컨테이너 출력 결과를 확인할 수 있습니다.

 

옵션

  • -d : 컨테이너를 백그라운드에서 실행합니다.
  • -i : 컨테이너와 상호작용을 위해 표준 입력(stdin)을 연결합니다.
  • -t : TTY(터미널)을 연결합니다.
  • -p <호스트 포트>:<컨테이너 포트> : 호스트 포트와 컨테이너 포트를 연결합니다.
  • -P : 호스트와 컨테이너 포트를 랜덤으로 연결합니다.
  • --name <컨테이너 이름> : 컨테이너의 이름을 설정합니다.
  • --rm : 컨테이너가 종료될 때 자동으로 삭제합니다.
  • -v <호스트 경로>:<컨테이너 경로>: 호스트와 컨테이너의 디렉터리를 연결합니다.
  • -e <환경변수>: 컨테이너 내부의 환경변수를 설정합니다.
  • --link <다른컨테이너 이름>:<별명>: 다른 컨테이너와 연결합니다.
  • --network <네트워크 이름>: 컨테이너가 속한 네트워크를 설정합니다.
  • --expose <포트>: 컨테이너의 포트를 노출합니다.
  • --entrypoint <명령어>: 컨테이너가 시작될 때 실행될 명령어를 설정합니다.
  • --user <사용자>: 컨테이너 내부에서 실행될 사용자를 설정합니다.
  • --restart <정책>: 컨테이너 재시작 정책을 설정합니다.

 

 

 

 

컨테이터 시작하기

 

 

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

 

옵션

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

 

 

컨테이너 중지하기

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

 

옵션

  • , -time: 컨테이너가 종료되기까지 대기하는 시간을 지정합니다. 기본값은 10초입니다.
  • -time-format: 대기 시간의 형식을 지정합니다. 기본값은 "s"입니다.

 

 

 

docker start -ai mycontainer

  • 종료된 컨테이너를 다시 시작하며 -a & -i 옵션을 사용하여 컨테이너에 접속합니다.
  • 컨테이너가 시작되고 터미널에 접속되면 jshell을 실행합니다.
  • 옵션 2개를 붙여서 -ai로 사용할 수 있습니다. (표준 입력을 유지하여 컨테이너 내부에서 터미널 입력을 받을 수 있도록 설정)

 

 

 

 

 

 

Docker 컨테이너 목록

- 별도의 옵션을 사용하지 않는 ps 명령어는 가동 중인 컨테이너만 출력해 준다

 

출력되는 컨테이너 정보

  • CONTAINER ID: 컨테이너의 고유 ID 정보
  • IMAGE: 컨테이너가 생성된 이미지 정보
  • COMMAND: 컨테이너에서 실행된 명령어 정보
  • CREATED: 컨테이너가 생성된 시간
  • STATUS: 컨테이너의 상태 정보
  • PORTS: 컨테이너에서 실행 중인 포트 정보
  • NAMES: 컨테이너의 이름 정보

 

옵션

--all , -a : 모든 컨테이너 목록 출력

--filter , -f : 원하는 리스트를 필터링을 통해 출력

 

id컨테이너 ID

name 컨테이너 이름
label 커맨드에서 붙인 라벨
exited 종료된 컨테이너의 종료 코드
예: -f "exited=0"
status 컨테이너의 상태
예: created, restarting, running 등
-f "status=created"
ancestor 이미지를 공유받은 컨테이너
예: -f "ancestor=example"
<image-name>[:<tag>], <image id> 또는 <image@digest>로 표현
before 설정 컨테이너를 기준으로 전에 만들어진 컨테이너 확인
예: -f "before=example"
since 설정 컨테이너를 기준으로 이후에 만들어진 컨테이너 확인
예: -f "since=example"

 

  • 옵션 -a와 -f를 붙여 -af로 사용할 수 있습니다.
  • “name=mycontainer”와 name=mycontainer는 같은 결과를 출력합니다.
  • -a 옵션을 사용하지 않고 -f의 status를 이용해 종료된 컨테이너를 출력해 보세요.
  • -n, --last : 최근 생성한 n개의 컨테이너 목록을 출력합니다.
  • --format : 출력할 정보의 포맷을 지정합니다.
  • --no-trunc : 모든 정보를 출력합니다.
  • --quiet, -q : 컨테이너 ID만 출력합니다.

 

 

 

Docker 컨테이너 삭제하기

 

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

 

옵션

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

 

 

 

 

Docker 이미지

도커 이미지(Docker Image)는 도커 컨테이너를 생성하기 위한 템플릿이다

도커 이미지는 애플리케이션을 실행하는 데 필요한 모든 환경과 라이브러리, 소스 코드 등을 포함하고 있으며, 이를 기반으로 도커 컨테이너가 생성된다

도커 이미지는 불변하며, 한 번 생성되면 수정할 수 없다

 

Docker 이미지 확인하기

docker images

 

 

 

출력되는 이미지 정보

  • REPOSITORY: 이미지가 저장된 레파지토리 이름
  • TAG: 이미지의 버전 정보
  • IMAGE ID: 이미지의 고유 ID 정보
  • CREATED: 이미지가 생성된 시간
  • SIZE: 이미지의 용량 정보

 

옵션

 

  • -a, --all: 모든 이미지 목록을 출력합니다. 기본적으로 dangling 이미지를 제외한 이미지만 출력되므로, dangling 이미지를 포함하여 출력하고 싶으면 -a 옵션을 사용합니다.
  • --digests: 이미지의 digest 정보를 출력합니다.
  • --no-trunc: 모든 컬럼 정보를 출력합니다.
  • -q, --quiet: 이미지 ID 정보만 출력합니다.
  • --filter: 출력할 이미지를 필터링합니다. dangling=true, label=<key>, before=<image-name>, since=<image-name> 등이 사용 가능합니다.
  • --format: 출력할 정보의 형식을 지정합니다. Go 템플릿 형식을 사용합니다.

 

 

Docker 이미지 pull 하기

 

  1. 도커 허브(Docker Hub)에서 이미지 검색하기 도커 허브(Docker Hub)는 도커 이미지를 공유하고 저장하는 온라인 레지스트리입니다. 먼저, 도커 허브 웹사이트에 접속하여 공식 openjdk 이미지를 검색합니다.
  2. 도커 이미지 pull 명령어 사용하기 터미널 또는 명령 프롬프트에서 다음과 같은 명령어를 입력하여 공식 openjdk 이미지를 pull 합니다.
docker pull {Docker name}

 

- 특정 버전의 이미지를 사용할떄 사용하는 명령어

$ docker pull {name}:11

 

 

Docker 이미지 삭제하기

 

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

 

옵션

  • -f, --force: 이미지를 강제로 삭제합니다.
  • --no-prune: 해당 이미지를 참조하는 다른 이미지나 컨테이너를 삭제하지 않습니다.
  • -q, --quiet: 삭제한 이미지 ID만 출력합니다.
  • --help: 도움말을 출력합니다.

 

 

 

Docker 빌드

도커 이미지를 생성하려면 다음과 같은 작업 결과물이 있어야 가능하다

  • 도커 설치 (혹은 도커 데스크탑)
  • 도커 이미지로 만들 내용 
  • 도커 이미지 저장소(Docker hub)에 나의 도커 이미지를 push 하기 위한 Docker hub 아이디와 내 저장소

 

도커 이미지 생성법

 

SpringBoot 빌드

- bootJar로 빌드하면 프로젝트 루트 폴더 내 build/libs 하단에 jar 파일이 생성된 것을 확인 할 수 있다

 

 

 

Dockerfile로 이미지 만들기

Dockerfile 작성

프로젝트의 최상위 경로(root)에 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"]
  • FROM은 베이스 이미지를 설정하는 부분입니다.
  • ARG에서 JAR_FILE이라는 변수를 통해 build/libs/*.jar 값을 저장합니다.
    • COPY에서 ${JAR_FILE}을 통해 사용하고 있습니다.
  • ENTRYPOINT는 컨테이너가 시작될 때 실행될 명령을 설정하는 부분입니다.

Dockerfile 주요 문법

명령                                             설명

FROM <base_image> 빌드할 이미지의 기반이 되는 도커 이미지를 선택합니다.
LABEL <key>=<value> 이미지에 메타데이터를 추가합니다. 일반적으로 빌드 버전, 제작자, 설명 등과 같은 정보를 포함합니다.
RUN <command> 컨테이너 내에서 실행할 명령어를 지정합니다. 주로 패키지 설치, 의존성 관리, 빌드 등에 사용됩니다.
COPY <source> <destination> 로컬 파일 시스템에서 파일 또는 디렉터리를 이미지에 복사합니다.
ADD <source> <destination> COPY와 유사하지만 다양한 기능을 제공합니다. 주로 원격 파일 다운로드, 압축 파일 해제 등에 사용됩니다.
WORKDIR <directory> 작업 디렉터리를 지정합니다. 이후 명령어는 해당 디렉터리에서 실행됩니다.
ENV <key>=<value> 환경 변수를 설정합니다. 이 변수들은 이미지 내에서 사용될 수 있습니다.
EXPOSE <port> 컨테이너가 외부에 노출할 포트를 지정합니다. 컨테이너 외부에서 해당 포트로 액세스할 수 있습니다.
CMD <command> 컨테이너가 시작될 때 실행될 기본 명령어를 지정합니다. 하나의 CMD만 사용할 수 있으며, Dockerfile에 여러 번 나타날 경우 마지막 명령어가 실행됩니다.

 

 

도커 빌드

 

docker build -t **username/repository:tag** .

위의 코드에서 username/repository:tag은 내 도커 이미지 저장소(Docker hub)의 아이디와 생성한 저장소명으로 변경해 주어야 한다

### .은 현재 디렉터리에 있는 Dockerfile을 사용한다는 의미입니다      . 의 앞뒤는 모두 띄어쓰기가 있어야 합니다.

 

 

 

Docker를 이용하면 애플리케이션 배포 및 관리가 용이해지며, 이식성, 확장성 및 보안성이 높아진다

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90