20230719

아홍·2023년 7월 19일

2023.07

목록 보기
6/12

Docker

애플리케이션을 컨테이너 기술을 이용해 빠르게 배포하고 실행할 수 있도록 돕는 오픈소스 플랫폼
도커 컨테이너 : 도커 이미지를 바탕으로 생성된 가볍고 독립적인 실행 단위. 가상머신에 비해 오버헤드가 적어서 가볍고 빠르게 실행된다.
환경의 영향을 받지 않고 독립적인 컨테이너 단위로 사용할 수 있다.

도커 컨테이너 생성하기

$ docker run -it --name mycontainer -p 8080:8080 openjdk:11

docker run : 도커 컨테이너를 생성하고 실행
-it : 컨테이너와 상호작용을 위해 표준입력을 연결
--name mycontainer : 컨테이너 이름 지정
-p {호스트포트}:{컨테이너포트} : 호스트의 특정 포트와 컨테이너의 포트를 매핑
open jdk:11 : 베이스 이미지 지정

종료는 컨트롤 + D

도커 컨테이너 시작하기

$ docker start {컨테이너 이름 or ID}

start도 run과 마찬가지로 옵션을 넣어줄 수 있다.
start와 run의 옵션은 다르다.

-a : 컨테이너와 터미널 연결
-i : 컨테이너와 상호작용을 위해 표준입력 연결
-p : 호스트와 컨테이너 포트 연결
-d : 컨테이너를 백그라운드에서 실행
-e : 컨테이너 내부의 환경변수 설정
-u : 컨테이너 내부에서 실행될 사용자 설정

도커 컨테이너 중지하기

$ docker stop {컨테이너 이름 or ID}

stop도 옵션을 넣어줄 수 있다.

-t : 컨테이너가 종료되기까지 대기하는 시간 지정. 디폴트는 10초
-time-format : 대기 시간의 형식 지정. 디폴트는 s

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

$ docker ps

디폴트는 가동 중인 컨테이너만 출력한다.

-a : 모든 컨테이너 목록 출력
-f : 원하는 리스트를 필터링한다.
name, label, exited, status(created, restarting, running), ancestor(이미지를 공유받은 컨테이너), before(설정 컨테이너를 기준으로 전에 만들어진 컨테이너 확인), since(설정 컨테이너 기준으로 이후에 만들어진 컨테이너 확인)
--format : 출력할 정보의 포맷 지정
-n, --last : 최근 생성한 n개의 컨테이너 목록 출력
-l, --latest : 가장 최근에 생성한 컨테이너 출력
--no-trunc : 모든 정보 출력
-q : 컨테이너 ID만 출력
-s : 파일의 사이즈 출력

도커 컨테이너 삭제하기

$ docker rm {컨테이너 이름 or ID}

-f : 실행 중인 컨테이너를 강제로 삭제
-l : 해당 컨테이너를 참조하는 링크 제거
-v : 컨테이너와 관련된 볼륨 제거
-n : 컨테이너의 이름 지정
-q : 컨테이너의 ID만 출력

도커 저장소 Docker Hub

도커 이미지를 저장, 관리, 공유할 수 있는 곳

도커 저장소에 push

$ docker push {유저명}/{이미지명}:{태그}

도커 이미지 Docker Image

도커 컨테이너를 생성하기 위한 템플릿
애플리케이션을 실행하는데 필요한 모든 환경, 라이브러리, 소스 코드 등을 포함한다.
한 번 생성하면 수정할 수 없다.

도커 이미지 목록 확인하기

$ docker images

도커 이미지 pull

$ docker pull {이미지명}
$ docker pull {이미지명}:{버전} // 특정 버전의 이미지를 다운로드 받고싶을 때

-a : 모든 목록 출력. 이 옵션이 없는 경우에는 dangling 이미지를 제외한다
--digests : 이미지의 digest 정보 출력
--no-trunc : 모든 컬럼 정보 출력
-q : 이미지 ID 정보만 출력
--filter : 필터링
--format : 출력할 정보의 형식 지정. Go 템플릿 형식을 사용한다

도커 이미지 삭제

$ docker rmi {이미지명orID}

-f : 이미지를 강제로 삭제한다
--no-prune : 해당 이미지를 참조하는 다른 이미지나 컨테이너를 삭제하지 않는다
-q : 삭제한 이미지 ID만 출력

도커 빌드

도커 이미지를 생성하는 과정

  1. 프로젝트 빌드하기 e.g. bootJar
  2. 프로젝트의 루트에 Dockerfile 생성
#베이스 이미지 설정
FROM openjdk:11

#JAR_FILE 변수 설정
ARG JAR_FILE=build/libs/*.jar

#도커 컨테이너로 복사
COPY ${JAR_FILE} app.jar

#컨테이너가 시작될 때 실행될 명령 설정
ENTRYPOINT ["java", "-jar", "/app.jar"]
  1. 빌드
$ docker build -t {dockerhub유저명}/{dockerhub저장소명}:tag .

.은 현재 디렉토리의 dockerfile을 사용하기 위해 사용

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> 컨테이너가 시작될 때 실행할 기본 명령어 지정. 하나의 명령어만 사용할 수 있는데, 만약 Dockerfile에 CMD가 여러 번 나타날 경우 마지막 CMD가 실행된다.


복습

스프링부트 애플리케이션을 컨테이너에 배포하기

docker run -p 8080:8080 -v .\build\libs\docker-0.0.1-SNAPSHOT.jar:\app\docker.jar openjdk:11 java -jar \app\docker.jar

-p 로 포트를 연결하고
-v 로 로컬 파일을 컨테이너로 공유

컨테이너를 바탕으로 도커 이미지 생성하기

  1. Dockerfile 만들기
FROM openjdk:11
COPY build/libs/*.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
  1. 빌드
$ docker build -t myimage:0.0.1 .
$ docker run -p 8080:8080 myimage:0.0.1

// 이미지를 {허브유저명}/{허브repository명}:tag 으로 바꾸기
$ docker tag myimage:0.0.1 {허브유저명}/{허브repository명}:tag
$ docker run -p 8080:8080 {허브유저명}/{허브repository명}:tag
  1. 허브에 이미지 등록
$ docker push {허브유저명}/{허브repository명}:tag

denied: requested access to the resource is denied
이런 오류가 발생한다면

$ docker login

으로 로그인한 후 진행

0개의 댓글