docker image&container: core building

전종원·2022년 11월 8일
0

1. Images & Containers

1.1. Containers

  • 애플리케이션을 실행하기 위한 모든 환경이 구성되있는 공간.
  • running unit of software

1.2. Images

  • 모든 설정 명령과 모든 코드가 포함된 공유 가능한 패키지.
  • 컨테이너를 생성할 수 있는 템플릿.
  • 이미지에 정의된 코드를 베이스로 여러 컨테이너를 만들 수 있다.
  • 모든 컨테이너는 이미지를 기반으로 한다.

1.3. 이미지 & 컨테이너 생성

1.3.1. 이미 존재하는 이미지 사용

docker run [Image_name] # 이미지 pull 후 컨테이너 생성 but 사용자 호스트와는 격리되어 있는 상태
docker -it run [Image_name] # 사용자 호스트에게 대화형 shell로 노출되는 형태로 컨테이너 생성
docker ps -a # 모든 docker process를 보여줌
  • 사용자 호스트와 격리된 상태로 컨테이서 생성 docker run [Image_name]
  • 사용자 호스트와의 interactive shell을 생성하며 컨테이너 생성 docker -it run [Image_name]

1.3.2. 커스텀 이미지 생성(nodejs app 예시)

FROM node # baseImage

WORKDIR /app # 도커 내 작업폴더를 지정
COPY . ./ # 첫번째 경로: 이미지로 복사되어야 하는 파일들경로 두번째 경로: 파일들이 저장 될 도커 내 경로

RUN npm install # 이미지 실행 시 실행할 명령어 (설정한 작업폴더에서 실행됨)

EXPOSE 80 # 호스트에 노출시킬 포트번호(documentation용이고 실제로는 run할때 포트인자를 80으로 주어야 함)

CMD ["node", "server.js"] # 컨테이너 실행 시 실행할 명령어
  • 위와 같은 Dockerfile을 생성 후 터미널에 docker build .를 실행.
  • 현재 폴더에서 Dockerfile을 검색해 검색된 Dockerfile을 기반으로 이미지를 생성하겠다는 명령어.
  • 이 후 docker run -p 3000:80 [Container_name] 으로 컨테이너 생성실행.

1.4. 이미지 및 컨테이너 삭제

docker rm [container_names]
  • 실행중이지 않은 컨테이너들을 rm 인자를 통해 삭제 가능
  • 여러개의 컨테이너를 한꺼번에 삭제 가능
docker rmi [image_ID]
  • rmi 인자로 이미지 삭제 가능
  • 해당 이미지로 실행중이거나 실행 중지인 컨테이너가 있다면 이미지 삭제 불가능
  • 해당 이미지를 사용하는 컨테이너들을 모두 제거해야 이미지 삭제 가능
  • docker image prune: 사용되지 않는 모든 이미지들을 제거

2. 이미지 레이어

2.1. 도커 이미지 레이어 조정

  • 다음과 같은 Dockerfile이 있다고 가정하자.
FROM node

WORKDIR /app

COPY . ./

RUN npm install

EXPOSE 80

CMD ["node", "server.js"]
  • 이미지에는 레이어가 존재한다. dockerfile에서 코드라인이 진행될수록 후속 레이어로 내려간다.

  • server.js의 코드일부를 변경하고 이를 이미지에 적용하기 위해서는 도커 이미지를 새로 빌드해야 한다.

  • 새로 빌드 시 변경된 코드를 복사하는 부분 이전 레이어들은 이전 캐시를 이용하지만 이 후 레이어들은 새로 진행하므로 불필요한 반복이 존재한다.

  • 코드 순서를 아래와 같이 바꿔 불필요한 반복을 없앨 수 있다.

FROM node:12

WORKDIR /app

COPY package.json /app # npm install을 수행하기 위한 선복사(반복시 캐시사용)

RUN npm install # 수정한 파일을 복사하는 작업 이전 레이어로 이동시킴(반복시 캐시사용)

COPY . /app # 수정한 파일 복사(반복 시 새로 진행)

EXPOSE 80 # (반복 시 새로 진행)

CMD ["node", "server.js"] # (반복 시 새로 진행)
  • dockerfile 수정 후 rebuilding 결과

  • npm install 이 이제 캐시를 사용하는 것을 볼 수 있다.

3. container mode & Docker 명령어

3.1. container mode

3.1.1. attach mode

  • 호스트 터미널과 결합되는 모드.
  • 호스트 터미널은 잠기고 컨테이너에 터미널 출력 애플리케이션이 있다면 터미널에 출력된다.

3.1.2. detach mode

  • 호스트 터미널과 분리되는 모드.
  • 호스트 터미널을 그대로 사용 가능하며 컨테이너에 터미널 출력 애플리케이션이 있다면 터미널에 출력되지 않는다.(컨테이너가 백그라운드 프로세스로 작동)

3.1.3. 키보드 입력이 요구되는 컨테이너

  • docker run -it [container_name]으로 생성 및 실행
  • -it 인자를 붙이지 않으면 애러발생
  • docker start -a -i [container_name] 으로 실행

3.2. 유용한 Docker 명령어

  • docker run -it [image_name]: 컨테이너 생성 및 실행(interactive shell)
    • attached 모드가 default -> 컨테이너 실행 시 실행한 호스트 터미널이 lock됨.
    • docker run -d [image_name] 인자를 통해 detached 모드로 생성 가능.
  • docker start [container_name]: 이미 존재하는 컨테이너 실행(백그라운드로)
    • detached 모드가 default -> 컨테이너 실행 시 실행한 호스트 터미널 사용가능.
    • docker start -a [container_name]: attach모드로 시작가능.
  • docker stop [container_name]: 컨테이너 중지
  • docker attach [container_name]: 실행중인 컨테이너에 연결
  • docker logs [container_name]: 컨테이너 실행 시 로그들을 출력
  • docker images: 이미지들 리스트를 볼 수 있다.
  • docker image prune: 사용되지 않는 모든 이미지들을 제거
  • docker rm [container_name]: 컨테이너 삭제
  • docker rmi [Image_ID]: 이미지 삭제
  • docker run --rm [image_name]: 컨테이너 생성하되 중지 시 삭제하도록 설정
  • docker image inspect [image_ID]: 이미지 내부구조를 확인가능
  • docker cp [path of file to copy] [container_name]:[path in container]: 실행중인 컨테이너 내부로 파일복사
  • docker run --name [my own name] [image_name]: 고유 이름으로 컨테이너 생성 및 실행

4. 컨테이너 이미지에 이름 지정 & 태그 지정

4.1. 컨테이너 이름지정

  • docker run --name [my own name] [container_name]: 고유 이름으로 컨테이너 생성 및 실행

4.2. 이미지 태그 지정

  • Dockerfile에서 FROM imagename:tag 형식으로 태그를 지정할 수 있다.
  • 태그는 baseimage보다 더 세세한 이미지 환경을 지정한다.
  • docker hub에는 이미 생성된 이미지 이름들과 태그들이 존재한다. 이를 Dockerfile에서 사용가능하다.
  • 커스텀 이미지를 빌드 시 docker build -t [own_image_name]:[own_tag]를 통해 고유 이미지 이름과 고유 태그명을 붙일 수 있다.

5. 이미지 공유

  • dockerfile 공유는 빌드가 필요하기 때문에 주변 파일들 및 폴더들이 구축되어 있어야 한다.
  • Image 공유는 이미 만들어진 이미지를 공유하는 것이기에 빌드가 필요없고 주변 폴드나 파일들 구성도 불필요하다.
  • 바로 컨테이너를 생성할 수 있다.

5.1. docker 이미지 push 방식

5.1.1. dockerhub에 push

  • dockerhub 회원가입 필요
  • 공식 docker image registry
  • public, private, official image 여부를 결정 가능

5.1.2. private registry에 push

  • 공급자를 결정 가능
  • 공급자의 url 필요

5.2. dockerhub에 이미지 push법

  • dockerhub 회원가입
  • create repository(생성 시 public, private 여부 설정 가능)
  • 사용중인 이미지들 중 푸쉬할 이미지 선택 후 이름과 태그 변경
docker tag [old_name]:[tag] [new_name]:[new_tag] 
  • new name과 new tag는 dockerhub에 생성한 레포지토리에서 확인

  • docker login 으로 docker 로그인

  • 작업 터미널에 docker push [docker_userID]/[image_name]:[tag]으로 dockerhub로 이미지 푸시 가능

  • push한 이미지를 가져다 쓰고싶다면 docker pull [docker_userID]/[image_name]:[tag] 명령어로 pull 가능

0개의 댓글