home
자바
home
🤔

Docker

강의명
초보를 위한 도커 안내서
강의순서
1
과목
기타
수강상태
진행중

도커의 특징

확장성/이식성

도커가 설치되어 있다면 어디서든 컨테이너를 실행할 수 있음
특정 회사나 서비스에 종속적이지 않음
쉽게 개발서버를 만들 수 있고 테스트서버 생성도 간편함

표준성

도커를 사용하지 않는 경우 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 하듯이

한번에 성공하는 빌드는 없음
파란불(빌드 성공)이 뜰 때까지 많은 빨간불(빌드 실패)를 경험
일단 파란불이 켜져도 리팩토링을 통해 더 최적화된 이미지 생성\

Dockerfile