설치

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