설치
sudo apt-get update
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh
curl -fsSL https://get.docker.com/ | sudo sh
sudo docker version
기본 커맨드
https://docs.docker.com/engine/reference/commandline/run/ 를 참고
컨테이너 기동시키기
docker run
을 사용한다.
docker run [OPTIONS] IMAGE [COMMAND] [ARG]...
다음과 같은 옵션이 있다.
- –rm : 프로세스가 종료되면 컨테이너가 자동으로 삭제됨
- -d: detached mode (백그라운드 모드)
- -p: 포트번호. 호스트포트:컨테이너포트 이다. 포트는 같아도 상관없다. 컨테이너 포트는 해당 컨테이너의 로컬IP의 포트라는 의미이므로 호스트 포트와는 별도의 포트가 된다. 따라서 동일해도 문제없다.
- -e: 환경변수 설정 값
- –name : 컨테이너의 이름을 지정(생략하면 도커가 알아서 지어준다)
–name 옵션으로 컨테이너 이름을 지정하는 예제
docker run --name mynginx nginx
컨테이너로 웹 서버를 돌리는 예제
- -d 옵션을 줘서 백그라운드 모드로 돌린다.
- –rm 옵션을 줘서 프로세스가 종료되면 자동으로 삭제되도록 한다.
- -p 옵션을 줘서 호스트 포트가 어떤 컨테이너 포트로 연결될지 지정해준다.
- 호스트 포트와 컨테이너 포트는 동일해도 상관없다.
docker run -d --rm -p 8080:8080 [이미지명]
실행중인 컨테이너 내에서 명령을 실행
docker exec
를 사용한다.
예를 들면 다음과 같이 e7672f8a10c5
container id를 가지는 컨테이너를 지정한 뒤 -it 옵션으로 셸을 지정하여 컨테이너에 접속할 수 있다.
docker exec e7672f8a10c5 -it /bin/bash
컨테이너 목록 확인하기
- 현재 실행중인 컨테이너들을 확인할 수 있다.
- -a 옵션으로 모든 컨테이너를 확인할 수 있다.
docker ps [OPTIONS]
컨테이너 중지하기
참고로 도커 ID는 중복되지 않는다면 처음 몇 자만 입력해도 된다.
docker stop [OPTIONS] CONTAINER [CONTAINER...]
컨테이너 재구동
docker start -i [container_name]
컨테이너삭제
실행중인 컨테이너는 삭제할 수 없다. 일단 중지(stop)해야 한다. 그렇다면 이 명령어가 존재하는 이유는?
docker rm [container_name]
가동중인 컨테이너의 ip확인
docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" [container_name]
로그보기
docker logs [OPTIONS] CONTAINER
이미지 목록보기
docker images
이미지 삭제
docker rmi [image_name:tag]
네트워크 설정 보기
각 컨테이너의 IP설정을 확인할 수 있다. 다음 명령으로 확인가능하다.
docker inspect --format '' (컨테이너이름 혹은 ID) | jq
관련 개념
컨테이너
- 가상화 기술의 하나로 격리된 공간에서 프로세스가 동작하는 기술
- 기존의 가상화는 주로 OS를 가상화했다(VMware나 VirtualBox 등).
- 이는 사용법이 간단한 반면, 무겁고 느린 단점이 존재했음
- 이후 CPU 가상화, 반가상화 등의 방식이 등장 (이는 클라우드 환경 구현에 활용됨)
- 이후 OS 위에서 프로세스만을 격리시켜 가상화하는 방식이 등장(가볍고 빠름)
- 하나의 서버 위에 다양한 구동환경(컨테이너)이 존재하는 것(마치 가벼운 VM을 여러 대 사용하는 것처럼)
이미지
- 컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 것
- 상태 값을 가지지 않고 변하지 않는다(Immutable)
- 컨테이너는 이미지를 실행한 상태라고 볼 수 있고, 추가되거나 변하는 값은 컨테이너에 저장된다.
- 같은 이미지에서 여러 개의 컨테이너를 생성할 수 있다.
- 예를들어 ubuntu 이미지는 ubuntu를 실행하기 위한 모든 파일들을 가지고 있고, MySQL이미지는 debian을 기반으로 MySQL을 실행하는데 필요한 파일과 명령어, 포트 정보 등을 가지고 있다.
- 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더 이상 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없다.와우!
- 도커 이미지는 Docker Hub에 등록하거나 아니면 직접 저장소를 만들어 관리할 수 있다. (Github처럼)
- 현재 공개된 도커 이미지는 50만개가 넘는다.
- 이미지의 이름은 URL방식으로 관리하며 태그를 붇일 수 있다.
- 태그 기능을 이용해 테스트나 롤백을 할 수 있다.
레이어
- 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 보통 용량이 수백메가임
- 이미지가 변경될 때마다 새로 수백메가를 다운받는 것은 매우 비효율적임
- 이 문제를 해결하기 위한 것이 레이어임
- 이미지는 여러개의 레이어로 이루어지는데 공통인 레이어는 처음에 하나만 받아서 공용으로 사용되는 개념
DockerFile
- 이미지를 만들기 위해 Dockerfile 이라는 파일에 자체 DSL(Domain-specific language)언어를 이용해서 이미지 생성 과정을 적는다.
이미지 만들고 배포하기
- FROM : 베이스 이미지를 지정, 반드시 지정해야 하며 어떤 이미지도 베이스 이미지가 될 수 있다. 될 수 있으면 구체적인 버전의 태그 값을 지정하는 것이 좋다.
- MAINTAINER : Dockerfile을 관리하는 사람의 이름 또는 이메일. 빌드에 영향을 주지는 않음.
- COPY: 파일이나 디렉토리를 이미지로 복사.
- ADD: COPY와 비슷하며 몇 가지 추가 기능 있음. src에 URL입력가능. 자동 압축 해제 기능 등
- RUN: 명령어를 그대로 실행. (ex) RUN bundle install
- CMD: 도커 컨테이너가 실행되었을 때 실행되는 명령어. 빌드할 때는 실행되지 않는다.
- WORKDIR: RUN, CMD, ADD, COPY 등의 작업이 이루어질 기본 디렉토리 설정
- EXPOSE: 도커 컨테이너가 실행되었을 때 요청을 기다리고 있는 포트
- VOLUME: 컨테이너 외부에 파일시스템을 마운트할 때
- ENV: 컨테이너에서 사용할 환경 변수를 지정할 때
참고로 RUN 과 CMD 의 차이는? RUN 은 이미지를 만들 때 기동되는 커맨드. CMD 는 컨테이너를 기동할 때 사용되는 커맨드. 가장 마지막에 한번만 적는다.
참고 :CMD는 나중에 덮어쓰기 할수도 있다고 한다. 이미지가 아니라 컨테이너 레벨에서.
빌드하기
docker build --tag [이미지명]:[태그] .
예를 들면 다음과 같다.
docker build --tag hello:1.0 .
태그는 여러개를 쓸 수도 있다.
docker build -t whenry/fedora-jboss:latest -t whenry/fedora-jboss:v2.1 .
트러블슈팅
컨테이너가 실행이 안될 때
컨테이너를 실행시켰는데 docker ps 해보면 목록에 없는 경우가 있다. 이 경우에는 로그를 확인해본다.
참고로, 컨터이너를 구동할 떄 --rm
옵션을 줘서 구동하면 에러로 종료한 후에 컨테이너가 삭제되기 때문에 로그를 볼 수가 없다.
docker logs [컨테이너 ID]
도커 데몬 관련
상태 확인
docker info
※ 아마존 리눅스에서는 다음 커맨드로 상태를 확인할 수 있다.
sudo service docker status
재구동
최악의 경우는 역시 재구동. docke info 해보면 나오는 컨테이너개수와 docker ps 로 확인했을 때 나오는 컨테이너 개수가 다른 경우가 있다. 이럴 때 재구동을 해본다. 이래도 문제가 해결안되면 서버 재구동을 해본다.
sudo service docker stop
sudo service docker start
참고링크
- 입문자를 위한 설명 Docker란? : https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html
- 초보를 위한 도커 안내서 - 설치하고 컨테이너 실행하기 : https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html
- 매뉴얼 : https://subicura.com/2017/02/10/docker-guide-for-beginners-create-image-and-deploy.html