Docker 개념과 명령어

이준우·2024년 1월 19일
1

시작

이번에 학교에서 Docker에 대한 5시간 특강이 진행 되었다. 기존에 Docker를 사용했던 경험은 있었지만, 개념 공부는 하지 않았었다. 이번 특강을 통해서 그동안 모호하게 알기만 했던 Docker에 대한 개념을 공부했고 이를 정리하는 시간을 갖고자 한다.

사용하는 이유

시스템 자원과 같은 환경에 영항을 받지 않는다.

  • Mac에서 개발하던 서버를 리눅스 환경의 서버로 Docker를 통해서 배포를 하면, Mac에서 작동하던 그대로 리눅스 서버에서 사용할 수 있다.
  • 개발환경에서 사용하던 버전과 실행환경에서 사용하는 버전이 달라 생기는 문제를 없애준다.
  • 즉 개발환경과 실행환경이 달라서 생기는 문제를 없애준다.

도커와 가상화 기술의 차이

  • Virtual Box나 VMware 같은 가상화 기술은 물리 서버를 만드는 것과 같다.
    • 물리적인 대상을 소프트웨어로 대체했다는 말
    • 메인보드, CPU, 메모리를 소프트웨어로 구현
    • 어느 운영체제든 설치할 수 있다.
  • 도커는 리눅스가 동작하는 것처럼 보이지만 실제 리눅스가 동작하는 것이 아니다.
    • 운영체제의 기능 중 일부를 호스트 역할을 하는 물리 서버에 맡겨 부담을 덜어둔 형태

Docker 구성 및 동작

  • 외부 강사님이 만들어주신 Docker 명령어에 따른 상태변화이다.

Docker 이미지와 컨테이너

이미지

  • Docker 이미지는 컨테이너를 만드는 데 사용된다.
  • 이미지는 금형과 같은 역할을 하는 것으로, 하나만 있으면 똑같은 것을 여러 개 만들 수 있어 동일한 컨테이너를 여러 개 배치하기 편하다.

컨테이너

  • 컨테이너는 ‘쓰고 버리는’ 일회용품 같은 것이다.
  • 컨테이너를 하나 만들어 업데이트하면서 계속 사용하기보다는 업데이트된 소프트웨어가 들어있는 새로운 컨테이너를 사용하는 것이 좋다.
  • 컨테이너는 일반적으로 여러 개를 동시 가동하는 상황을 전제로 하기 때문
  • 초기 구축은 간단히 마쳤는데 유지보수할 때마다 일일이 업데이트하면 컨테이너의 장점이 반감된다.

Docker 명령어

pull

  • docker pull [image name]
  • Docker Hub에서 이미지를 다운 받는 것이다.
    • docker pull python:latest
      • Docker Hub에서 python 최신 이미지 다운
      • latest 생략 가능

images

  • docker images
  • 로컬에 설치된 이미지 리스트를 보여준다.

run

  • docker run [options] [image name] [command]
  • Docker 이미지를 이용해서 컨테이너를 생성하는 명령어
    • docker run -it — name python3.8 python /bin/bash
      • python 이미지를 이용해서 python3.8 이름의 컨테이너를 생성해 /bin/bash 를 실행
      • 옵션
        • i : interactive mode → 사용자가 입출력할 수 있는 상태

        • t : tty → 리눅스 터미널

        • terminal에 attach 되어 터미널 모드를 사용할 수 있음

        • p

          • Port mapping
          • 호스트 port : 도커내부 port 를 매핑시키는 옵션이다.
        • v

          • volume mapping
          • 호스트 디렉터리 경로 : 도커 내부 디렉터리 경로 를 매핑시키는 옵션이다.
          • 컨테이너를 지워도 같은 경로로 volume mapping을 하면 이전 컨테이너의 데이터를 그대로 사용할 수 있다.

ps

  • docker ps
  • 현재 실행 중인 컨테이너 리스트를 표시
  • 옵션 -a
    • docker ps -a

    • 실행 뿐만 아니라, 중지된 컨테이너까지 모두 표시해준다.

컨테이너에서 exit

  • exit
  • 컨테이너에서 작업을 끝낸 후 exit 하면 컨테이너가 중지 상태(stopped)가 됨

start

  • docker start [container name | container ID]
  • 중지된 컨테이너를 다시 시작

exec

  • docker exec [container name] [command] [parameter]
  • 컨테이너 밖에서 컨테이너 내부 명령을 실행
    • docker exec python3.8 ls -al

attach

  • docker attach [container name]
  • 컨테이너 내부로 다시 들어간다.
    • docker attach python3.8

commit

  • docker commit [options] [container name] [image name]
  • 변경된 컨테이너를 새로운 이름으로 저장

stop/rm

  • docker stop [container name]
    • 컨테이너를 중지시킴
  • docker rm [container name]
    • 컨테이너를 삭제시킴

    • 컨테이너를 중지시킨 다음에 삭제해야 한다.

rmi

  • docker rmi [image name] | [image ID]
  • 도커 이미지를 삭제
  • 컨테이너를 먼저 삭제시킨 후, 이미지를 삭제 시켜야한다
  • image name 으로 삭제하는 것 보다는 image ID 로 삭제하는 것을 권장하는데, 그 이유는 docker rmi python 을 할 경우, python 이라는 이름을 가진 python , python3.8 등등 전부 삭제된다.

inspect

  • docker inspect [container name | container ID]
  • 모든 컨테이너의 간략한 정보를 제공한다.

logs

  • docker logs [container name | container ID]
  • 특정 컨테이너의 log 내용 확인 가능

Dockerfile

  • 컨테이너에 설치해야하는 패키지, 소스코드, 명령어, 환경변수설정 등을 기록한 하나의 명세서이다.
FROM ubuntu:14.04

RUN apt-get update -y
RUN apt-get install -y python-pip python-dev build-essential

COPY . /app
WORKDIR /app
  • FROM 으로 시작
    • 모든 docker image는 docker hub에 있는 image를 통해 만들어지기 때문
    • 베이스로 사용할 이미지를 선택한다.

image 생성하기

  • docker build [options] [Dockerfile path]
  • Dockerfile을 Dockerfile path에서 찾는다.
  • Dockerfile에 명시된 명령을 빌드로 실행하여 image를 빌드한다.
  • 이미지 이름은 -t(—tag) 옵션으로 지정한다.

명령

  • FROM
    • base image 설정
  • RUN
    • 지정된 명령 실행
  • ENTRYPOINT
    • 컨테이너를 실행하는 명령 설정

    • run [command]ENTRYPOINT에 instruction에 append 되어 실행된다.
      - CMD 는 override되어 실행

      FROM Ubuntu
      
      ENTRYPOINT["sleep"]
    • docker run ubuntu-sleeper 10 → 즉 매개변수로 줘야함

  • CMD
    • 컨테이너가 실행될 때 실행되는 명령 설정

      FROM Ubuntu
      CMD sleep 5
    • docker run ubuntu sleep 5 와 같다.

    • 첫 번째 파라미터는 실행 가능한 명령이어야 한다.

      • CMD ["sleep", "5"] ⭕️
      • CMD ["sleep 5"]
  • COPY
    • 호스트 컴퓨터에서 컨테이너로 파일/폴더 복사
  • ADD
    • COPY + unzip
  • ENV
    • 환경 변수 설정
  • EXPOSE
    • 호스트와 연결할 포트
  • WORKDIR
    • 명령이 실행될 폴더 설정(RUN 명령 실행되는 폴더 위치 고정)

ENTRYPOINT + CMD

FROM Ubuntu

ENTRYPOINT["sleep"]

CMD["5"]
  • docker run ubuntu-sleeper
    • sleep 의 기본 값으로 5를 실행
  • docker run ubuntu-sleeper 10
    • CMD의 5를 10이 override 한다.

마무리

가장 많이 헷갈렸었던, CMD와 ENTRYPOINT에 대한 차이를 이해할 수 있었다. ENTRYPOINT를 변수처럼 사용하고 CMD를 default parameter롤 사용하는 형식으로 사용할 수 있다는 것을 이번 특강을 통해 배울 수 있어서 좋았다. 또 교수님이 제공해주신, 명령어 이미지는 docker에 명령어에 대해 기억이 안날때 한 번만 봐도 모든 개념이 다 기억날 수 있게 도와주는 트리거 역할을 할 것 같다.

다음번에는 docker-compose에 대해 작성해 보도록 해야겠다.

profile
잘 살고 싶은 사람

0개의 댓글