without haste but without rest

Docker 개념과 기본 커맨드 본문

DevOps/Docker

Docker 개념과 기본 커맨드

JinungKim 2021. 12. 10. 16:17

0. Docker

도커는 리눅스 운영체제의 네임스페이스와 컨트룰 그룹을 이용하여 컨테이너라고 부르는 격리된 개발 환경을 제공한다.
개발 환경에서 소프트웨어들은 버전이 지속적으로 업데이트된다. 이는 협업 과정에서 버전 차이로 인한 생산성과 안정성에 대한 문제를 초래한다. 이때 운영체제단의 네임스페이스와 컨트롤 그룹을을 이용하는 컨테이너 기술을 활용하면 애플리케이션 실행에 필요한 운영체제, 라이브러리 등을 격리된 실행환경에 구축하므로 개발 환경 그리고 더 나아가 운영 환경 간의 차이로 인한 생산성 저하 문제에서 자유로워질 수 있다. 컨테이너는 하나의 프로세스라고 볼 수 있는데, 정지된 상태로도 관리되기 때문에 명확한 표현으로는 실행 가능한 이미지의 인스턴스다.

자바는 운영체제와 상관없이 JVM이 설치되어 있는 환경이라면 어디에서나 실행이 가능하다. 도커도 이와 비슷한 맥락이다. 도커 엔진 그리고 실행가능한 이미지가 있다면 어느 머신에서나 동일한 인스턴트를 실행할 수 있다.


1. 가상머신과 컨테이너

이미지 참조

containers-vs-virtual-machines

컨테이너와 가상머신의 가장 큰 차이점은 격리 레벨이다. 가상머신은 가상화된 하드웨어 위에 OS를 올리므로 Host와 완벽하게 분리된다고 봐도 무방하다. 반면 컨테이너는 OS를 가상화하고 커널을 Host와 공유한다. 따라서 경량화되어있고, 커널을 공유하므로 상대적으로 가상머신보다 속도가 빠르다.


2. 도커를 사용하는 일반적인 흐름

  • Pull or Build
  • Run

누군가 만들어둔 이미지를 내려받거나 직접 이미지를 빌드할 수 있다. 그리고 해당 이미지를 실행한다. 이것이 도커를 활용하는 기본적인 방법이다.


3. Cheat Sheet!

(0) 컨테이너 목록 확인

실행 중인 컨테이너만 확인

docker ps

종료된 컨테이너를 포함하여 모두 확인

docker ps -a

(1) 이미지 빌드

docker build -t image_name:version .

현재 워킹스페이스에 있는 Dockerfile을 이용하여 이미지 태그가 image_name이고 버전이 version인 이름으로 이미지를 빌드한다.

(2) 이미지 내려받기

docker pull ubuntu:20.04

도커 허브에 있는 우분투 20.04 버전 이미지를 내려받는다.

(3) 이미지 실행

docker run -itd --name mongo -p 37017:27017 mongo:4.4
  • mongo:4.4는 몽고디비 이미지의 버전을 명시한다.
  • -P는 외부 포트 37017, 내부 포트 27017로 실행한다.
  • -i는 Interactive 모드로 표준 입력과 표준 출력을 키보드와 화면을 통해 가능하게 하는 옵션이다.
  • -t는 텍스트 기반의 터미널(TTY)를 애뮬레이션 하는 옵션이다.
  • -d는 컨테이너를 데몬으로 실행하는 옵션이다.
  • --name은 컨테이너의 이름을 지정한다. 단 중복은 불가능하다.

(4) 컨테이너 접근

docker exec -it mongo /bin/bash

(3)에서 실행한 몽고디비 컨테이너의 bash에 접근한다. bash 외에도 컨테이너 내부에 있는 파일을 해당 명령어를 이용해서 실행할 수도 있다.

(5) 컨테이너 종료

docker stop mongo

몽고디비 컨테이너를 종료한다. 단 이때 컨테이너가 완전히 삭제되지는 않고 종료된 상태다. 위에서 다룬 것처럼 컨테이너는 종료된 상태에서도 컨트롤이 가능하므로 프로세스보다는 이미지의 인스턴스라는 표현이 더 명확한 것이다.

(6) 컨테이너 삭제

docker rm mongo

종료된 몽고디비 컨테이너를 완전히 삭제한다.

(7) 항상 재시작 옵션

docker run --restart always ubuntu:20.04

컨테이너가 종료되면 항상 재시작한다.

(8) 이미지 태그(이름) 변경

docker tag container_name:latest container_name:0.1

container_name:latest라는 이미지 태그를 container_name:0.1로 변경한다.

(9) 도커 이미지 파일 저장

docker save -o docker_img.tar image_name

image_name이라는 도커 이미지를 dodkcer_img.tar 파일로 저장한다.

(10) 도커 이미지 파일 읽기

docker load -i docker_img.tar

docker_img.tar 파일을 읽어서 이미지를 레지스트리에 추가한다.

(11) 볼륨 마운트


docker run -v /srv:/tmp \
           -v /tmp:/srv \
           ubuntu:20.04

호스트 운영체제의 /srv 디렉토리와 컨테이너 내부의 /tmp 디렉토리를 마운트한다.
볼륨 옵션은 다중으로 부여할 수 있다. 위에서는 추가로 /tmp 디렉토리를 컨테이너의 /srv 디렉토리와 마운트한다.

(12) 컨테이너 간 통신을 위한 네트워크 생성

docker network create test_network

test_network라는 도커 네트워크를 생성한다.

docker run -d --name mongo --network test_network mongo:4.4

몽고디비를 test_network라는 도커 네트워크에 참여시킨다. 해당 네트워크에 참여하고 있는 다른 컨테이너는 mongo라는 이름으로 몽고디비 컨테이너에 접근할 수 있다.

(13) 컨테이너 정보 확인

docker inspect container_name

container_name 컨테이너의 정보를 확인한다. 네트워크, 재시작 옵션, 볼륨 마운트 등 전부 확인 가능하다.

(14) 컨테이너 로그 확인

docker logs container_name

컨테이너의 로그를 확인한다.
-f 옵션을 주면 지속적으로 갱신한다

(14) 리소스 정리

docker system prune -a

모든 리소스를 정리한다.

docker system prune -filter "until=24h"

24시간 이내에 사용한 리소스와 실행 중인 컨테이너를 제외하고 전부 제거한다.


etc.

도커 내부 아키텍처에 대해 더 자세히 알고 싶다면..

Comments