도커 컴포즈 도커 컴포즈를 사용하는 이유 여러 개의 컨테이너가 하나의 애플리케이션으로 동작할 때 이를 테스트하려면 각 컨테이너를 하나씩 생성해야 한다. 매번 run 명령어에 옵션을 설정해 CLI로 컨테이너를 생성하기보다는 여러 개의 컨테이너를 하나의 서비스로 정의해 컨테이너 묶음으로 관리할 수 있다면 좀더 편리하다. 이를 위해 도커 컴포즈는 컨테이너를 이용한 서비스의 개발과 CI를 위해 여러 개의 컨테이너를 하나의 프로젝트로서 다룰 수 있는 작업 환경을 제공한다. 도커 컴포즈 설치 # ubuntu, 루트에서 해야함, 최신버전찾기 : https://github.com/docker/compose $ curl -L https://github.com/docker/compose/releases/download/(..
도커 데몬 도커의 구조 $ which docker $ ps aux | grep docker 컨테이너나 이미지를 다루는 명령어는 /usr/bin/docker/에서 실행되지만 도커 엔진의 프로세스는 /usr/bin/dockerd 파일로 실행된다. 이는 docker 명령어가 실제 도커 엔진이 아닌 클라이언트로서의 도커이기 때문이다. 도커의 구조는 크게 두 가지로 나뉜다. 하나는 클라이언트로서의 도커이고, 다른 하나는 서버로서의 도커이다. 실제로 컨테이너를 생성하고 실행하며 이미지를 관리하는 주체는 도커 서버이고, 이는 dockerd 프로세스로서 동작한다. 도커 엔진은 외부에서 API 입력을 받아 도커 엔진의 기능을 수행하는데, 도커 프로세스가 실행되어 서버로서 입력을 받을 준비가 된 상태를 도커 데몬이라고 이..
Dockerfile 이미지를 생성하는 방법 아무것도 존재하지 않는 이미지로 컨테이너 생성 애플리케이션을 위한 환경을 설치하고 소스코드 등을 복사해 잘 동작하는 것을 확인 컨테이너를 이미지로 커밋(commit) 위의 방법은 애플리케이션이 동작하는 환경을 구성하기 위해 일일이 수작업으로 패키지를 설치해야한다. 그래서 도커는 아래와 같이 일련의 과정을 손쉽게 기록하고 수행할 수 있는 빌드 명령어를 제공한다. 완성된 이미지를 생성하기 위해 컨테이너에 설치해야 하는 패키지, 추가해야 하는 소스코드, 실행해야 하는 명령어와 셸 스크립트 등을 하나의 파일에 기록해 두면 도커는 이 파일을 읽어 컨테이너에서 작업을 수행한 뒤 이미지로 만들어낸다. 이러한 작업을 기록한 파일의 이름을 Dockerfile이라 하며, 빌드 명..
도커 이미지 도커는 기본적으로 도커 허브라는 중앙 이미지 저장소에서 이미지를 내려받는다. 이미지 저장소를 다른 사람들에게 공개하지 않기 위해 비공개 저장소를 사용하려면 비공개 저장소의 수에 따라 요금을 지불해야 한다. 이를 해결하기 위해 도커 이미지 저장소를 직접 구축해 비공개로 사용할 수도 있다. 도커 엔진에서 docker search 명령어를 사용하여 어떤 이미지가 있는지 확인할 수 있다. $ docker search ubuntu 도커 이미지 생성 컨테이너에 애플리케이션을 위한 특정 개발 환경을 직접 구축한 뒤 사용자만의 이미지를 직접 생성해야 하는 경우가 많다. 컨테이너 안에서 작업한 내용을 이미지로 만드는 방법을 알아보자. $ docker run -it --name commit_test ubunt..
컨테이너 로깅 json-file 로그 사용하기 도커는 컨테이너의 표준 출력과 에러 로그를 별도의 메타데이터 파일로 저장하며 이를 확인하는 명령어를 제공한다. $ docker run -d --name mysql \ > -e MYSQL_ROOT_PASSWORD=1234 \ > mysql:5.7 docker logs 명령어는 컨테이너 내부에서 출력을 보여주는 명령어이다. $ docker logs mysql 컨테이너가 정상적으로 실행 및 동작하지 않고 docker attach 명령어도 사용하지 못하는 개발 환경에서 docker logs 명령어를 쓰면 간단하고 빠르게 에러 확인 가능. --since 옵션에 유닉스 시간을 입력해 특정 시간 이후의 로그를 확인할 수 있으며, -t 옵션으로 타임스탬프를 표시할 수도 있..
도커 네트워크 도커 네트워크 구조 도커는 컨테이너에 내부 IP를 순차적으로 할당하며, 이 IP는 컨테이너를 재시작할 때마다 변경될 수 있다. 이 내부 IP는 도커가 설치된 호스트, 즉 내부 망에서만 쓸 수 있는 IP이므로 외부와 연결될 필요가 있다. 이 과정은 컨테이너를 시작할 때마다 호스트에 veth(virtual ethernet)…라는 네트워크 인터페이스를 생성함으로써 이뤄진다. 도커가 설치된 호스트에서 ifconfig 같은 명령어로 인터페이스를 확인하면 실행 중인 컨테이너 수만큼 veth로 시작하는 인터페이스가 생성된 것을 알 수 있다. veth 인터페이스뿐 아니라 docker0이라는 브리지도 존재하는데 docker0 브리지는 각 veth 인터페이스와 바인딩돼 호스트의 eth0 인터페이스와 이어주는..
도커 컨테이너 다루기 컨테이너를 외부에 노출 컨테이너는 가상 머신과 마찬가지로 가상 IP 주소를 할당 받는다. 기본적으로 도커는 컨테이너에 172.17.0.x의 IP를 순차적으로 할당한다. 아무런 설정을 하지 않았다면 이 컨테이너는 외부에서 접근할 수 없으며 도커가 설치된 호스트에서만 접근할 수 있다. 외부에 컨테이너의 애플리케이션을 노출하기 위해서는 eth0의 IP와 포트를 호스트의 IP와 포트에 바인딩해야 한다. 컨테이너에 아파치 웹서버를 설치하고 외부에 노출해보자. $ docker run -i -t --name mywebserver -p 80:80 ubuntu:14.04 -p 옵션은 컨테이너의 포트를 호스트의 포트와 바인딩해 연결할 수 있게 설정한다. 호스트포트:컨테이너포트 형식으로 쓰면된다. $ ..
도커 엔진 도커 이미지와 컨테이너 도커 엔진에서 사용하는 기본 단위는 이미지와 컨테이너임. 도커 이미지 이미지는 컨테이너를 생성할 때 필요한 요소이며, 가상 머신을 생성할 때 사용하는 iso 파일과 비슷한 개념이다. 이미지는 여러 개의 계층으로 된 바이너리 파일로 존재하고, 컨테이너를 생성하고 실행할 때 읽기 전용으로 사용된다. 도커 명령어로 내려받을 수 있다. 도커 컨테이너 이미지로 컨테이너를 생성하면 해당 이미지의 목적에 맞는 파일이 들어 있는 파일시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간이 생성되고, 이것이 바로 도커 컨테이너가 된다. 생성된 각 컨테이너는 각기 독립된 파일시스템을 제공받으며 호스트와 분리돼 있으므로 특정 컨테이너에서 어떤 애플리케이션을 설치하거나 삭제해..
도커란? 일반적으로 도커라고 하면 도커 엔진이라는 의미이다. 도커 엔진이 컨테이너를 생성하고 관리하는 주체로서 이 자체로도 컨테이너를 제어할 수 있고 다양한 기능을 제공하는 도커의 주 프로젝트 이기 때문. 가상 머신과 도커 컨테이너 가상 머신은 완벽한 운영체제를 생성할 수 있다는 장점이 있지만 일반 호스트에 비해 성능 손실이 있으며, 수 기가바이트에 달하는 가상 머신 이미지를 애플리케이션으로 배포하기는 부담스럽다는 단점이 있음. 이에 비해 도커 컨테이너는 가상화된 공간을 생성하기 위해 리눅스의 자체 기능인 chroot, 네임스페이스, cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없음. 도커를 시작해야 하는 이유 애플리케이션의 개발과 배포가 편함. 도커 이미지는 ..