# 도커 ## Docs - [[hadolint]] - [[도커 파일]] - [[가장 빨리 만나는 Docker]] - [[도커 무작정 따라하기]] - [[도커 커맨드]] - [[docker-compose]] - [[도커 실습]] - [[Docker Error]] - [[컨테이너 이미지]] - [[docker networking]] ## 도커는 왜 인기를 끌게 되었나? - 복잡한 리눅스 애플리케이션을 컨테이너로 `묶어서 실행` 할 수 있음 - 개발, 테스트, 서비스 환경을 `하나로 통일`하여 `효율적으로 관리`할 수 있음 - 컨테이너(이미지)를 전 세계 사람들과 `공유` ## 컨테이너 기술 컨테이너는 가상화보다 훨씬 가벼운 기술 # 가상 머신과 도커 ## 가상 머신의 등장 컴퓨터 안에서 컴퓨터를 만들어내기 위한 시도, 1960년 때에 가상화 개념이 처음 등장 ## 리눅스 컨테이너 - 컨테이너 안에 `가상 공간`을 만들지만 실행 파일을 `호스트에서 직접 실행` - 리눅스 커널의 `cgroups`와 `namespaces`가 제공하는 기술 ## 도커의 특징 도커는 게스트 OS를 설치하지 않음 - 이미지에 서버 운영을 위한 프로그램과 라이브러리만 격리해서 설치 - 이미지 용량이 크게 줄어듦 - 호스트와 OS 자원(시스템 콜)을 공유 도커는 이미지 `생성`과 `배포`에 특화 `이미지 버전 관리`또 제공하고 `중앙 저장소`에 `이미지를 올리고 받을 수 있음` (push/pull) github 와 비슷한 형태로 `도커 이미지를 공유하는 Docker Hub` 제공 다양한 `API`를 제공하여 원하는 만큼 `자동화`가 가능하여 개발과 서버 운용에 매우 유용 ## 도커의 성능 도커는 하드웨어 가상화 계층이 없음 - 메모리 접근, 파일 시스템, 네트워크 전송 속도가 가상 머신에 비해 월등히 빠름 - 호스트와 도커 컨테이너 사이의 성능 차이가 크지 않음(오차 범위 안) # 도커 이미지와 컨테이너 ## 도커 이미지 이미지는 서비스 운영에 필요한 서버 프로그램, 소스 코드, 컴파일된 실행 파일을 `묶은 형태` 저장소에 올리고 받는 건 `이미지` (push/pull) ## 도커 컨테이너 컨테이너는 이미지를 `실행한 상태` 이미지로 여러 개의 컨테이너를 만들 수 있음 운영체제로 치면 `이미지는 실행파일`이고 `컨테이너는 프로세스` ## 도커의 이미지 처리 방식 유니온 파일 시스템 형식(aufs, btrfs, devicemapper) 도커는 베이스 이미지에서 `바뀐 부분만 이미지로 생성` 컨테이너로 실행할 때는 베이스 이미지와 `바뀐 부분을 합쳐서 실행` docker hub 및 개인 저장소에서 이미지를 공유할 때 `바뀐 부분만 주고 받음` # 서비스 운영 환경과 도커 ## 지금까지의 서버 환경 - 물리 서버를 직접 운영 - 호스팅 또는 IDC 코로게이션 서비스 사용 - 서버 구입과 설치에 비용과 시간 소요 ## 클라우드 환경 가상화가 발전하면서 `클라우드` 환경으로 변화 가상 서버를 `임대`하여 사용한 만큼만 `요금 지불` ## Immutable Infrastructure `Imuutable Infrastructure` 라는 패러다임이 나옴 `호스트 OS`와 `서비스 운영 환경`(서버 프로그램, 소스 코드, 컴파일 된 바이너리)을 `분리` 한 번 설정한 운영 환경은 `변경하지 않는다(Immutable)`는 개념 서비스 운영 환경을 `이미지로 생성`한 뒤 `서버에 배포하여 실행` 서비스가 `업데이트되면` 운영 환경 자체를 변경하지 않고, `이미지를 새로 생성하여 배포` ## Immutable Infrastructure의 장점 편리한 관리 - 서비스 환경 `이미지만 관리`하면 됨 - 중앙 관리를 통한 `체계적인 배포와 관리` - 이미지 생성에 `버전 관리 시스템 활용` 확장 - 이미지 하나로 `서버를 계속 찍어낼 수 있음` - 클라우드 플랫폼의 `자동 확장(Auto Scaling)` 기능과 연동하여 `손쉽게 서비스 확장` 테스트 - 개발자 PC, 테스트 서버에서 이미지를 실행만 하면 서비스 운영 환경과 `동일한 환경이 구성됨` - 테스트가 `간편` 가볍다 - 운영체제와 서비스 환경을 `분리`하여 `가볍고(Lightweight) 어디서든 실행 가능한(Portable) 환경` 제공 도커는 Immutable Infrastructure 를 구현한 프로젝트 # 도커 요약 고래는 서버에서 `여러 개의 컨테이너(이미지)를 실행`하고 `이미지 저장과 배포(운반)`을 의미 도커(Docker)는 `부두 노동자`를 뜻함. `컨테이너를 다루는` 도커의 기능과 비슷함 도커는 서비스 운영 환경을 묶어서 손쉽게 배포하고 실행하는 경량 컨테이너 기술 # 도커 설치하기 ## Windows - Windows 에서는 Boot2Docker 를 이용하여 Docker를 사용할 수 있음 - 다음 URL에서 docker-install.exe 파일을 받기 - https://github.com/boot2docker/windows-installer/releases - 파일 다운로드가 끝났으면 docker-install.exe 파일을 실행 - 설치 화면이 표시되면 Next 버튼을 클릭 # 도커 사용해보기 ## 도커 명령 - 도커의 명령은 `docker <명령>` 형식 - 항상 root 권한으로 실행 ### search 명령으로 이미지 검색하기 `docker search <이미지 이름>` - 도커는 `Docker Hub`(https://registry.hub.docker.com)를 통해 `이미지`를 공유하는 생태계가 구축되어 있음 - 유명 리눅스 배포한과 오픈 소스 프로젝트(Redis, Nginx 등)의 이미지를 모두 Docker Hub에서 구할 수 있음 - 이미지와 관련된 명령은 기본적으로 Docker Hub를 이용하도록 설정되어 있음 ### pull 명령으로 이미지 받기 `docker pull <이미지 이름>:<태그>` - Docker hub 에서 우분투 이미지 받아보기 ```sh sudo docker pull ubuntu:latest ``` ### run 명령으로 컨테이너 생성하기 `docker run <옵션> <이미지 이름> <실행할 파일>` - 이미지를 컨테이너로 생서한 뒤 bash 쉘 실행해보기 ```sh sudo docker run -i -t --name hello ubuntu /bin/bash ``` - ubuntu 이미지를 컨테이너로 생성한 뒤 ubuntu 이미지 안의 `/bin/bash`를 실행 - -i(interactive), -t(pseudo-tty) 옵션을 사용하면 실행된 Bash 쉘에 입력 및 출력 가능 - --name 옵션으로 컨테이너에 이름을 지정할 수 있음. 이름을 지정하지 않으면 도커가 자동으로 이름을 생성하여 지정 ### ps 명령으로 컨테이너 목록 확인하기 `docker ps` - 모든 컨테이너 목록을 출력하기 ```bash sudo docker ps -a ``` - -a 옵션을 사용하면 정지된 컨테이너까지 모두 출력됨 - 옵션을 사용하지 않으면 실행되고 있는 컨테이너만 출력됨 ### start 명령으로 컨테이너 시작하기 `docker start <컨테이너 이름>` - 방금 정지한 컨테이너를 다시 시작하기 ```bash sudo docker start hello ``` ### restart 명령으로 컨테이너 재시작하기 `docker restart <컨테이너 이름>` - os 재부팅하면 컨테이너를 다시 시작해보기 ```bash sudo docker restart hello ``` ### exec 명령으로 외부에서 컨테이너 안의 명령 실행하기 `docker exec <컨테이너 이름> <명령> <매개 변수>` - 현재 컨테이너가 `/bin/bash`로 실행된 상태 - /bin/bash 를 통하지 않고 외부에서 컨테이너 안의 명령 실행해보기 ```bash sudo docker exec hello echo "Hello World" ``` - 컨테이너 이름 대신 컨테이너 id 를 사용해도 됨 - 컨테이너가 실행되고 있는 상태에서만 사용할 수 있으며 `정지된 상태에서는 사용할 수 없음` ### stop 명령으로 컨테이너 정지하기 `docker stop <컨테이너 이름>` ### rm 명령으로 컨테이너 삭제하기 `docker rm <컨테이너 이름>` - 생성된 컨테이너를 삭제해보기 ```bash sudo docker rm hello ``` ### rmi 명령으로 이미지 삭제하기 `docker rmi <이미지 이름>:<태그>` - 이미지 삭제해보기 ```bash sudo docker rmi ubuntu:latest ``` # 도커 이미지 생성하기 ## Dockerfile 작성하기 - 도커 `이미지 설정 파일` - Dockerfile에 설정된 대로 이미지를 생성하게 됨 먼저 example 디렉터리를 생성한 뒤 example 디렉터리로 이동하기 ```bash mkdir example cd example ``` ```bash FROM ubuntu:14.04 MAINTAINER Foo Bar RUN apt-get update RUN apt-get install -y nginx RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf RUN chown -R www-data:www-data /var/lib/nginx VOLUME ["/data", "/etc/nginx/site-enabled", "/var/log/nginx"] WORKDIR /etc/nginx CMD ["nginx"] EXPOSE 80 EXPOSE 443 ``` ## build 명령으로 이미지 생성하기 `docker build <옵션> ` - 앞에서 작성한 Dockerfile 로 이미지 생성해보기 - Dockerfile이 저장된 example 디렉터리에서 명령 실행 ```bash sudo docker build --tag hello:0.1 ``` 앞에서 생성한 이미지를 실행해보기 ```bash sudo docker run --name hello-nginx -d -p 80:80 -v /root/data:/data hello:0.1 ``` - `-d` 옵션은 컨테이너를 백그라운드로 실행 - `-p 80:80` 옵션으로 호스트의 80번 포트와 컨테이너의 80번 포트를 연결하고 외부에 노출 - -v /root/data:/data 옵션으로 호스트의 /root/data 디렉터리를 컨테이너의 /data 디렉터리에 연결 만약 Boot2Docker 를 사용한다면, boot2Docker 는 가상 머신 안에 도커를 실행한 것이므로 호스트 IP 는 ngnix에 바로 접속할 수 없다. ## Links - 도커 커맨드 레퍼런스, https://docs.docker.com/engine/reference/commandline/cli - 도커 도큐먼트, https://docs.docker.com # 출처 - http://www.slideshare.net/pyrasis/docker-fordummies-44424016 - http://www.pyrasis.com/private/2014/11/30/publish-docker-for-the-really-impatient-book - https://docs.google.com/document/d/1-yNddpgu71tbFaupqrOrQ23xv8SV_6Y_8OfokPuEQTk/edit {{tag>docker, 이미지, 컨테이너}}