각각 올리고 내릴 수 있는 하나의 격리된 프로세스 모음 이다. 이미지를 기반으로 올릴 수 있고 이미지로 저장 할 수도 있다.
run과 stop이 자유로우며, 속도도 빠르다.
stop하게되면 해당 컨테이너 내부에서의 휘발성 데이터들은 날라가고(당연한건가.) delete까지 하게되면 컨테이너의 내부 데이터가 다 날라간다.
이를 방지하기위해 리눅스 특유의 path별 외부 mnt를 사용하기도 한다.(도커 설정)
도커 컨테이너의 스냅샷이라고 보면 된다.
보통 해당 이미지를 중심으로 컨테이너가 실행이 되며, 이 이미지를 공유하고 가져와 실행 하므로써 도커 컨테이너가 서로 공유되고 저장되고 실행된다고 볼 수 있다.
이미지는 컨테이너가 실행되기위한 하나의 거대한 데이터 이기 때문에 보통 용량이 엄청 많은데, 이를 조금이라도 완화시키기 위해서 레이어라는 개념을 사용한다.
레이어는 git의 저장 기법과 같은 방식으로 이전 이미지의 상태 위에 변경된 레이어만 추가하는 방식으로 저장하는 기법이다.
하나의 docker 클라이언트에 여러개의 이미지를 다운 받을 수 있는데 만약 하나의 이미지가 다른 이미지를 기반으로 만든 이미지라면 추가 변경된 레이어만 저장하므로 데이터는 제일 하단, 자식이되는 이미지의 크기와 비슷하게만 사용 하게 된다.
사실 컨테이너도 레이어라는 것을 내부적으로 사용하는데 이미지가 read-only 레이어들의 집합이라면 컨테이너 실행 시에는 그 위에 read_write 레이어가 추가되는 방식이다.
도커는 git과 같이 이미지들을 서로 공유하는 서버-클라이언트 구조의 시스템이다.
gitlab과 같이 폐쇄망에 docker-registry 서버를 설치하여 도커 서버에 이미지를 올려놓고 관리 할 수도 있고, 인터넷에 도커 허브라는 무료 공개 서버가 있기도 하다.
도커 서버는 자신의 이미지를 전부 공개하는 조건으로 무료로 사용 가능하다.
도커 이미지 빌드 방법은 일반 쉘 스크립트와 다르므로 일반 쉘로 설치 하는 방식과 비교해서 여기에 기록만 해둔다.
주의점은 빌드 방식도 리팩토링 할 수 있는데 도커빌드는 한줄마다 새로운 컨테이너를 만들고 실행하고 삭제를 반복하는데 이전상태가 캐싱이 가능하면 바로바로 빌드가 진행이 가능해져서, 무거운 작업이면서, 설치하는 작업이거나 환경을 변경시키지 않을 작업을 먼저 하고 소스코드 빌드나 설정 변경 등 의존성이 강하거나 파일을 변경시켜서 캐싱을 깨트릴만한 작업들을 뒤로 미루는게 좋다.
또 한가지는 이미지마다 레이어의 최대 갯수가 있기때문에 명령어는 줄일 수 있으면 줄이는게 좋다.
쉘 설치법
# 1. ubuntu 설치 (패키지 업데이트)
apt-get update
# 2. ruby 설치
apt-get install ruby
gem install bundler
# 3. 소스 복사
mkdir -p /usr/src/app
scp Gemfile app.rb root@ubuntu:/usr/src/app # From host
# 4. Gem 패키지 설치
bundle install
# 5. Sinatra 서버 실행
bundle exec ruby app.rb
이미지 빌드용 Dockerfile 저장 법
# 1. ruby 레이어로 시작
FROM ruby:2.3
MAINTAINER subicura@subicura.com
# 2. 소스 복사
COPY Gemfile* /usr/src/app/
# 3. Gem 패키지 설치
WORKDIR /usr/src/app
RUN bundle install --no-rdoc --no-ri
# 4. 소스 복사
COPY . /usr/src/app
# 5. Sinatra 서버 실행
EXPOSE 4567
CMD bundle exec ruby app.rb -o 0.0.0.0
도커에서 컨테이너 실행 시 설정이 복잡해 지는 경우 yml 파일로 저장하여 쉽게 실행 가능하다.
설치 방법
curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
아래는 mysql 컨테이너와, wordpress컨테이너를 각각 실행 시킨 뒤 wordpress 서비스를 구동하는 설정 파일이다.
version: '2'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wp_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
wp_data: