2020-10-17

Posted by karais89 on October 17, 2020

인프런에서 결제한 도커 강의 학습 및 내용 정리 진행. 이전에 도커에 대해 몇개의 강의 및 책을 학습한 적은 있어 대략적인 방식만 알고 있는 상태에서, 실제 개발에 적용 가능한지 확인을 위해 학습 중.

도커와 기존의 가상화 기술과의 차이를 통한 컨테이너 이해

기존

  • 한대의 서버를 하나의 용도로만 사용
  • 남는 서버 공간 그대로 방치
  • 하나의 서버에 하나의 운영체제, 하나의 프로그램만을 운영.

하이퍼 바이저 기반의 가상화

  • 호스트 시스템에서 다수의 게스트 os를 구동할 수 있는 소프트웨어
  • VM이라는 독립적인 가상 환경의 서버 이용 가능

이러한 가상화 기술에서 나온 컨테이너 가상화 기술

도커 컨테이너와 가상 머신은 기본 하드웨어에서 격리된 환경에서 애플리케이션을 배치하는 방법

도커는 vm과 비교할시 더 가볍다. (하이퍼바이저와 게스트 OS 불필요)

도커 가상화 기술

이미지로 컨테이너를 만들기

이미지는 응용 프로그램을 실행하는데 필요한 모든 것을 포함하고 있다.

  1. 시작시 실행될 명령어
  2. 파일 스냅샷

이미지로 컨테이너 만드는 순서

  1. docker 클라이언트에서 docker run <이미지>를 입력
  2. 도커 이미지에 있는 파일 스냅샷을 컨테이너 하드 디스크에 옮김
  3. 이미지에 가지고 있는 명령어 (컨테이너가 실행될때 사용될 명령어)를 이용해 실행한다.
1
docker run hello-world

C-group, 네임스페이스를 도커 환경에서 쓸 수 있는 이유

  • Cgroup와 네임스페이스는 리눅스에서만 사용 가능
1
docker version
  • 도커 내부적으로는 리눅스 VM을 돌린다.

섹션 2. 기본적인 도커 클라이언트 명령어 알아보기

도커 이미지 내부 파일 구조 보기

기본적인 도커 클라이언트 명령어 알아보기

1
2
# docker run <imageName>
docker run hello-world

이미지 내부 파일 시스템 구조 보기

1
2
# 1     2    3    4
docker run alpine ls

4번째 위치 명령어 → 이미지가 가지고 있는 시작 명령어를 무시하고 여기에 있는 커맨드를 실행한다.

ls 커맨드는 현재 디렉토리의 파일 리스트 표출

alpine 컨테이너에 ls 명령어가 포함되어 있어서 실행 가능함.

컨테이너들 나열하기

현재 실행중인 컨테이너 나열

1
2
3
4
docker ps

docker run alpine ping localhost
docker ps

원하는 항목만 보기

1
docker ps --format 'table\ttable'

모든 컨테이너 나열

1
docker ps -a

도커 컨테이너의 생명주기

  • 생성 → 시작 → 실행 → 중지 → 삭제
1
2
3
4
5
docker create <이미지 이름>
docker start <시작할 컨테이너 아이디/이름>
docker run <이미지 이름>
docker stop <중지할 컨테이너 아이디/이름>
docker rm <삭제할 컨테이너 아이디/이름>
  • docker run <이미지 이름> 명령어는 docker create <이미지 이름> + docker start <시작할 컨테이너 아이디/이름>과 같다.
1
2
docker create hello-world # 명렁어 임력 후 해시값 나옴.
docker start -a <컨테이너 아이디/이름> # 아이디 = 해시값 입력
  • a = attach

Docker Stop vs Docker Kill

1
2
docker stop <중지할 컨테이너 아이디/이름>
docker kill <중지할 컨테이너 아이디/이름>
1
2
3
4
5
docker run alpine ping localhost
docker ps # 아이디 알아내기
docker stop <컨테이너 아이디/이름>
# or
docker kill <컨테이너 아이디/이름>

stop은 Gracefully하게 중지를 시킨다. 자비롭게 그동안 하던 작업들을 (메시지를 보내고 있었다면 보내고 있던 메시지) 완료하고 컨테이너를 중지 시킨다.

Kill은 Stop과 달리 어떠한 것도 기다리지 않고 바로 컨테이너를 중지 시킨다.

컨테이너 삭제하기

1
docker rm <삭제할 컨테이너 아이디/이름>
  • 실행중인 컨테이너는 먼저 중지한 후에 삭제 가능.

모든 컨테이너 삭제

1
docker rm $(docker ps -a -q)

이미지 삭제

1
docker rmi <이미지id>

한번에 컨테이너, 이미지, 네트워크 모두 삭제하고 싶다면

1
docker system prune
  • 도커를 쓰지 않을때 모두 정리하고 싶을때 사용해주면 좋음
  • 하지만 이것도 실행중인 컨테이너에는 영향을 주지 않음