도커의 특징
확장성/이식성
•
도커가 설치되어 있다면 어디서든 컨테이너를 실행할 수 있음
•
특정 회사나 서비스에 종속적이지 않음
•
쉽게 개발서버를 만들 수 있고 테스트서버 생성도 간편함
표준성
•
도커를 사용하지 않는 경우 ruby, nodejs, go, php로 만든 서비스들의 배포 방식은 제각각 다름
•
컨테이너라는 표준으로 서버를 배포하므로 모든 서비스들의 배포 과정이 동일해짐
이미지
•
이미지에서 컨테이너를 생성하기 때문에 반드시 이미지를 만드는 과정이 필요
•
Dockerfile을 이용하여 이미지를 만들고 처음부터 재현 가능
•
빌드 서버에서 이미지를 만들면 해당 이미지를 저장소에 저장하고 운영서버에서 이미지를 불러옴
설정 관리
•
설정은 보통 환경변수로 제어함
•
MYSQL_PASS=password와 같이 컨테이너를 띄울 때 환경변수를 같이 지정
•
하나의 이미지가 환경변수에 따라 동적으로 설정 파일을 생성하도록 만들어져야함
자원 관리
•
컨테이너는 삭제 후 새로 만들면 모든 데이터가 초기화됨
•
업로드 파일을 외부 스토리지와 링크하여 사용하거나 S3같은 별도의 저장소가 필요
•
세션이나 캐시를 memcached나 redis와 같은 외부로 분리
도커가 가져온 변화
•
클라우드 이미지보다 관리하기 쉬움
•
다른 프로세스와 격리되어 가상머신처럼 사용하지만 성능저하 (거의) 없음
•
복잡한 기술(namespace, cgroups, network, …)을 몰라도 사용할 수 있음
•
이미지 빌드 기록이 남음
•
코드와 설정으로 관리 > 재현 및 수정 가능
•
오픈 소스 > 특정 회사 기술에 종속적이지 않음
컨테이너의 미래
스케줄링
•
컨테이너를 적당한 서버에 배포해주는 작업
•
여러 대의 서버 중 가장 할일 없는 서버에 배포하거나 그냥 차례대로 배포 또는 아예 랜덤하게 배포
•
컨테이너 개수를 여러 개로 늘리면 적당히 나눠서 배포하고 서버가 죽으면 실행 중이던 컨테이너를 다른 서버에 띄워줌
클러스터링
•
여러 개의 서버를 하나의 서버처럼 사용
•
작게는 몇 개 안되는 서버부터 많게는 수천 대의 서버를 하나의 클러스터로
•
여기저기 흩어져 있는 컨테이너도 가상 네트워크를 이용하여 마치 같은 서버에 있는 것처럼 쉽게 통신
서비스 디스커버리
•
서비스를 찾아주는 기능
•
클러스터 환경에서 컨테이너는 어느 서버에 생성될지 알 수 없고 다른 서버로 이동할 수도 있음
•
따라서 컨테이너와 통신을 하기 위해서는 어느 서버에서 실행중인지 알아야하고 컨테이너가 생성되고 중지될 때 어딘가에 IP와 Port같은 정보를 업데이트 해줘야함
•
key-value 스토리지에 정보를 저장할 수도 있고 내부 DNS 서버를 이용
도커 설치하기
Linux
curl -s https://get.docker.com/ | sudo sh
Shell
복사
명령어를 입력하고 패스워드를 입력하면 리눅스 배포판에 따라 자동으로 최신 버전의 도커 설치
sudo usermod -aG docker ubuntu
Shell
복사
ubuntu 유저 권한 추가
MacOS or Windows
Docker for Mac / Docker for Windows - 가장 쉽고 빠르게 사용할 수 있는 방법
•
도커는 기본적으로 Linux를 지원하기 때문에 MacOS와 Windows에 설치되는 Docker는 가장머신에 설치됨
•
MacOS는 xhyve를 사용하고 Windows는 Hyper-V 사용
◦
Windows Pro에서만 설치가 가능했으나 Windows WSL 2를 이용하여 Home 버전도 설치 가능
◦
그 외에 Windows 사용자는 VirtualBox에 ubuntu 리눅스를 설치하여 실습
도커 기본 명령어
run - 컨테이너 실행
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
Shell
복사
-d | detached mode (백그라운드 모드) |
-p | 호스트와 컨테이너의 포트를 연결 |
-v | 호스트와 컨테이너의 디렉토리를 연결 |
-e | 컨테이너 내에서 사용할 환경변수 설정 |
—name | 컨테이너 이름 설정 |
—rm | 프로세스 종료 시 컨테이너 자동 제거 |
-it | -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션 |
—network | 네트워크 연결 |
stop - 컨테이너 중지
docker stop [OPTIONS] CONTAINER [CONTAINER...]
Shell
복사
•
실행중인 컨테이너를 중지하는 명령어
•
실행중인 컨테이너를 하나 또는 여러개(띄어쓰기) 중지할 수 있음
rm - 컨테이너 제거
docker rm [OPTIONS] CONTAINER [CONTAINER...]
Shell
복사
•
종료된 컨테이너를 완전히 제거하는 명령어
logs - 로그 확인
docker logs [OPTIONS] CONTAINER
Shell
복사
•
컨테이너가 정상적으로 동작하는지 확인하기 위해 로그를 확인하는 명령어
pull - 이미지 다운로드
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Shell
복사
•
이미지를 다운로드 하는 명령어
rmi - 이미지 삭제
docker rmi [OPTIONS] IMAGE [IMAGE...]
Shell
복사
•
이미지를 삭제하는 명령어
•
컨테이너가 실행중인 이미지는 삭제되지 않음
network create - 컨테이너 통신
docker network create [OPTIONS] NETWORK
Shell
복사
•
도커 컨테이너끼리 이름으로 통신할 수 있는 가상 네트워크를 만듦
•
ex) docker network create app-network
도커 이미지 만들기
이미지란
•
도커는 레이어드 파일 시스템 기반
•
AUFS, BTRFS, Overlayfs, …
•
이미지는 프로세스가 실행되는 파일들의 집합(환경)
•
프로세스는 환경(파일)을 변경할 수 있음
•
이 환경을 저장해서 새로운 이미지를 만듦
ex) docker build -t jjw/ubuntu:git01 .
Shell
복사
TDD 하듯이
한번에 성공하는 빌드는 없음
파란불(빌드 성공)이 뜰 때까지 많은 빨간불(빌드 실패)를 경험
일단 파란불이 켜져도 리팩토링을 통해 더 최적화된 이미지 생성\

