비전공자가 이해한 docker

도커를 사용하기 위한 가장 기초적인 것들을 정리하였다. linux 환경을 기초로 작성. 혹시 맥을 사게 된다면 맥 환경도 추가해야지.

도커란?

컨테이너를 관리하는 플랫폼이다.

  1. 컨테이너 기반
  2. 오픈소스
  3. 가상화
  4. 플랫폼이라고도 한다.

1 - 컨테이너: 격리된 공간에서 동작하는 각각의 프로세스(혹은 프로그램?)

  • 이미지(Image) 라는 것에 컨테이너를 실행하기 위한 모든 것(의존성 파일 등)이 저장되어 있다.
  • 따라서 이미지 파일이 있다면 컨테이너의 무한 생성이 가능(리소스가 따라주는 한)

2 - 오픈소스: 무료

3 - 가상화: 컴퓨터 리소스의 추상화..라고 한다.

  • 기존에는 VirtualBox같은 가상머신으로 OS 전체를 가상화했다면(맥에서 윈도우를 돌린다던지), 도커는 각각의 컨테이너(프로세스)를 가상화하여 사용.
  • 훨씬 가볍게 사용이 가능하다!

img

4 - 플랫폼: 위의 것들을 실행 가능하게 하는 기반. 이걸 어떻게 설명하지.

그래서 왜 쓰는가?

편리한 서버 유지 관리, 확장성

  • 이미지 파일 하나면 컨테이너 무한 생성 가능. 설치 시간 절약
  • 버전 관리도 컨테이너들이 격리되어있기 때문에 해당 컨테이너만 업그레이드가 가능 (데이터는 따로 처리해야 함)

레이어 저장방식

  • 이미지는 컨테이너를 실행하기 위한 모든 데이터를 갖고 있다. 새로 받은 이미지들이 이미 가지고 있는 이미지와 겹치는 파일(예를 들어, ubuntu)이 있다면? - 놀랍게도 알아서 추가적인 부분만 다운 받음
  • 유니온 파일 시스템을 이용해 여러개의 레이어를 하나의 파일처럼 사용할 수 있게 한다.

install

Linux

curl -fsSL https://get.docker.com/ | sudo sh

sudo 없이 사용하기 위한 세팅

sudo usermod -aG docker $USER # 현재 접속중인 사용자에게 권한주기
sudo usermod -aG docker your-user # your-user 사용자에게 권한주기

설치 확인

docker version

컨테이너 실행 명령어

docker run [OPTIONS] IMAGES[:TAG|@DIGEST] [COMMAND] [ARG...]

-it # -i + -t 터미널 입력을 위한 옵션
-d # detached mode 백그라운드 모드
-p # 포트 연결
-v # 디렉토리 연결(마운트)
-e # 컨테이너 내에서 사용할 환경변수 설정
--name # 컨테이너 이름 설정
--rm # 프로세스 종료시 컨테이너 자동 제거
-Pit # 모든 포트를 열고 상호 대화적 셸 사용 가능하게 함

ubuntu container

docker run ubuntu:16.04
docker run --rm -it ubuntu16:04 /bin/bash

# in container
$ cat /etc/issue
$ ls

redis container

docker run -d -p 1234:6379 redis
# -d : detached mode
# -p : port connect

$ telnet localhost 1234 # 1234포트로 접속
set mykey hello
+OK
get mykey
$5
hello

quit
+OK
Connection closed by foreign host.

MySQL5.7 container

Host OS에 MySQL 클라이언트가 설치되어있어야 함. 처음 실행 시에는 준비 시간 때문에 에러가 날 수 있음

docker run -d -p 3306:3306\
  -e MYSQL_ALLOW_EMPTY_PASSWORD=true \ # 환경변수 설정 (패스워드없이 root 계정 생성)
  --name mysql \ # 이름 할당, 안하면 랜덤 생성
  mysql:5.7

# MySQL 접속
$ mysql -h127.0.0.1 -uroot

mysql> quit

도커 기본 명령어

컨테이너 목록 확인 (ps)

docker ps [OPTIONS]

docker ps -a #  종료된 컨테이너까지 표시

컨테이너 중지 (stop)

docker stop [OPTIONS] CONTAINER [CONTAINER..]

docker ps
docker stop ${CONTAINER_ID} # 앞자리 몇 자만 입력해도 가능
docker ps -a

컨테이너 제거 (rm)

docker rm [OPTIONS] [CONTAINER] [CONTAINER..]

docker ps -a
docker rm ${CONTAINER_ID}
docker ps -a

# 중지된 컨테이너 일괄 삭제
docker rm -v $(docker ps -a -q -f status=exited)

이미지 목록 확인 (images)

docker images [OPTIONS] [REPOSITORY[:TAG]]

docker images

이미지 다운로드 (pull)

run을 입력하면 자동 다운 받지만, pull을 이용하여 최신 버전으로 다시 다운 받을 수 있다.

docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker pull ubuntu:18.04

이미지 삭제 (rmi)

실행 중인 이미지는 삭제되지 않음

docker rmi [OPTIONS] IMAGE [IMAGE..]
docker rmi ${IMAGE_ID}

컨테이너 체크

컨테이너 로그 (logs)

docker log [OPTIONS] CONTAINER

docker ps
docker logs ${CONTAINER_ID}

# 마지막 10줄만 출력
docker logs --tail 10 ${CONTAINER_ID}

# 실시간 출력 (ctrl+c로 중지)
docker logs -f ${CONTAINER_ID}

컨테이터 명령어 실행 (exec)

run은 컨테이너를 새로 만들어서 실행. exec는 실행중인 컨테이너에 명령 실행

docker exec [OPTIONS] CONTAINER COMMAND [ARG..]

# bash shell 접속
docker exec -it mysql /bin/bash
$ mysql -uroot

# 한방에 접속
docker exec -it mysql mysql -uroot
  # 이제 Host OS에 mysql이 없어도 사용 가능

컨테이너 업데이트

  1. 새 버전의 이미지를 다운 받고
  2. 기존 컨테이너를 삭제
  3. 새 컨테이너를 실행

2.컨테이너 삭제 -> 컨테이너에서 생성된 파일 증발

  • 따라서 유지해야하는 데이터는 반드시 컨테이너 외부 스토리지에 저장
    • 클라우드 서비스 (ex. AWS S3)
    • Data volumes을 컨테이너에 추가

호스트의 디렉토리를 마운트하여 데이터 볼륨 사용 (-v)

docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--name mysql \
-v /my/own/datadir:/var/lib/mysql \ # <- volume mount
mysql:5.7

호스트의 /my/own/datadir 디렉토리에 데이터베이스 파일 저장. 최신 이미지 업데이트 시에도 동일 사용 가능


References

이 포스트보다 훨씬 자세하게 정리되어있다.

댓글남기기