비전공자가 이해한 docker
도커를 사용하기 위한 가장 기초적인 것들을 정리하였다. linux 환경을 기초로 작성. 혹시 맥을 사게 된다면 맥 환경도 추가해야지.
도커란?
컨테이너를 관리하는 플랫폼이다.
- 컨테이너 기반
- 오픈소스
- 가상화
- 플랫폼이라고도 한다.
1 - 컨테이너: 격리된 공간에서 동작하는 각각의 프로세스(혹은 프로그램?)
- 이미지(Image) 라는 것에 컨테이너를 실행하기 위한 모든 것(의존성 파일 등)이 저장되어 있다.
- 따라서 이미지 파일이 있다면 컨테이너의 무한 생성이 가능(리소스가 따라주는 한)
2 - 오픈소스: 무료
3 - 가상화: 컴퓨터 리소스의 추상화..라고 한다.
- 기존에는 VirtualBox같은 가상머신으로 OS 전체를 가상화했다면(맥에서 윈도우를 돌린다던지), 도커는 각각의 컨테이너(프로세스)를 가상화하여 사용.
- 훨씬 가볍게 사용이 가능하다!
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이 없어도 사용 가능
컨테이너 업데이트
- 새 버전의 이미지를 다운 받고
- 기존 컨테이너를 삭제
- 새 컨테이너를 실행
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
이 포스트보다 훨씬 자세하게 정리되어있다.
Leave a comment