실전에 활용 가능한 container 사용법을 익히자

Koo·2023년 7월 19일
1

Section01. 내게 필요한 지식이 무엇인지 정리하기

  • container와 host 사이에 파일 복사
    - container와 host 사이에 파일 복사 방법
  • volume mount
    - bind mount : container와 파일을 연동하는 데 많이 사용
    • volume mount : 운영체제와 무관하게 파일을 다룰 수 있음
  • container로 image 생성
    - container를 다른 컴퓨터나 서버로 옮기기 위해 필요
    • 똑같은 container를 여러 개 만드는 경우 필요
    • 개발 환경 배포에 용이
  • container 개조
    - docker 외에 linux에 대한 지식 필요
    • 개발 환경 배포에 용이
    • 유지보수 면에서 유리
  • docker hub login
    - 다른 사람에게 container를 공개할 때 필요
  • docker compose
    - database와 애플리케이션 container를 함께 시작하는 경우
    - 환경을 대량으로 생성해야 하는 경우
    - 산출물이 텍스트 파일 형태로 남기 때문에 관리에 유용
    - container를 한 번에 만들고 종료하고 삭제하는 일밖에 하지 못한다
  • kubernetes
    - 여러 대의 서버에서 container를 실행할 때 사용하는 container orchestration 도구
    • 대규모 시스템을 운영할 때 사용하기 때문에 일반적인 프로그래머는 거의 사용할 일이 없음

Section02. container와 host간에 파일 복사

파일 복사는 container > host, host > container 모두 가능

# host -> container
docker cp <host-path> <container-name or container-id>:<container-path>

# container -> host
docker cp <container-name>:<container-path or container-id> <host-path>

Section03. volume mount

volume - storage의 한 영역을 분할하는 것

data persistency - container는 생성과 폐기가 매우 빈번하기 때문에 매번 데이터를 옮기는 방법 대신 생성부터 container 외부에 데이터를 두고 container에서 외부 데이터에 접근하는 방식을 사용

volume mount

도커 엔진이 관리하는 영역 내에 만들어진 볼륨을 container에 disk형태로 mount

  • 이름만으로 관리가 가능하기 때문에 사용하기 쉬움
  • 직접 조작하기 어려움
    - 임시 목적으로 사용
    • 자주 사용되지는 않지만 지우면 안되는 파일을 두는 목적으로 사용
  • 도커 엔진 관리하에 있기 때문에 사용자가 파일 위치를 신경 쓸 필요가 없다
  • host 컴퓨터에서 접근할 수 없기 때문에 실수로 지우는 일이 발생하지 않는다
    - 반대로 container를 경유하지 않으면 접근할 수 없다
    • 백업을 하기 위해 복잡한 절차가 필요
  • 운영체제에 따른 의존성 문제(경로 문제 등)가 발생하지 않는다
  • 파일을 직접 편집할 일이 많지 않은 경우 사용

bind mount

host 컴퓨터의 문서 또는 폴더 등 도커 엔진에서 관리하지 않는 영역의 기존 directory를 container에 mount하는 방식

  • directory가 아닌 파일 형식으로도 mount할 수 있다
  • 파일을 자주 편집해야 하는 경우 사용

tmpfs(임시 메모리) mount

disk가 아닌 ram memory 영역을 mount

  • disk보다 훨씬 빠른 속도로 읽고 쓰기가 가능
  • 접근 속도를 높이기 위해 사용
  • 도커 엔진이 정지되거나 호스트가 재부팅되면 소멸

storage 영역 사용법

# storage 생성
docker volume create <volume-name>

# storage 삭제
docker volume rm <volume-name>

# storage 모두 삭제
docker volume prune

# volume mount
docker volume create koos_storage
docker run -it -v koos_storage:/root ubuntu
docker volume rm koos_storage

# bind mount
docker run -it -v $(pwd):/root ubuntu

volume backup

volume mount는 backup을 하기 위해서 별도의 container를 필요로 한다
container의 생성과 동시에 container밖으로 압축 내용을 내보낼 수 있다

docker run --rm -v <volume-storage-name>:/source -v <host-path>:/target busybox tar cvzf /source/<압축이름.tar.gz> -C /source .

-v :/source - /source에 volume mount
-v :/target - host path를 /target에 bind mount
tar czvf /source<압축이름.tar.gz> -C /source . - source에 압축파일을 저장, -C는 압축할 경로를 지정

Section04. container로 image 생성

container로 image를 생성하면 동일한 구성의 container를 대량으로 생산할 수 있고, 다른 컴퓨터나 서버에 container를 이동시킬 수 있다

1. commit을 이용한 image 변환

docker commit <container-name> <image-name>

2. Dockerfile을 이용한 image 생성

Dockerfile script를 작성하고 script를 build해 image를 생성하는 방법

docker build -t <image-name> <image-재료-path>

Dockerfile script 예시

FROM <image-name>

COPY <source-path> <dest-path>
RUN ...
...

Dockerfile Instruction

  • FROM - 토대가 되는 image
  • ADD - image에 파일이나 폴더 추가
  • COPY - image에 파일이나 폴더 추가
  • RUN - image를 build할 때 실행할 명령어
  • CMD - container를 생성할 때 실행할 명령어
  • ENTRYPOINT - container를 실행할 때 실행할 명령어
  • EXPOSE - image가 통신에 사용할 port 지정
  • VOLUME - persistency data를 저장할 경로 지정
  • ENV - 환경변수 정의
  • WORKDIR - RUN, CMD, ENTRYPOINT, ADD, COPY를 실행할 작업 directory 지정
  • SHELL - build시 사용할 shell
  • LABEL - 이름, 버전, 저작자 정보 설정

Docker image 옮기기

container는 image로 변환하지 않으면 옮기거나 복사할 수 없다. 하지만 image도 그대로 옮길 수 없기 때문에 먼저 docker engine에서 압축하여 관리 영역으로 내보내야 옮길 수 있다.

docker save -o <file-name>.tar <image-name>

Section05. container 개조

  1. 파일 복사와 mount를 이용하는 방법

  2. container 내부에서 리눅스 명령어를 사용하는 방법

    exec - container 속에서 명령어를 실행하는 command
    bash 없이도 어느 정도 명령어를 직접 전달할 수 있다. 하지만 초기 설정이 없어 동작하지 않는 경우도 있기 때문에 기본적으로 shell을 통해 명령을 실행한다.

    기본적으로 프로그램이 하나씩 실행되기 때문에 shell을 실행하면 container 안에 있는 프로그램은 실행되지 않는다. 그렇기 때문에 shell로 container 조작을 끝낸 후, 다시 docker start로 container를 재시작해주어야 한다.

profile
스터디를 해보자

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

정말 좋은 글 감사합니다!

답글 달기