본문 바로가기
서버

Docker 정리

by 탁구치는 개발자 2017. 1. 4.

[설치 - Ubuntu 14.04]

Docker를 설치하기 위해서는 64bit 리눅스 운영체제 및 커널 버전이 3.10 이상이어야 한다.

uname -r 명령어를 통해 커널 버전을 확인할 수 있음


Ubuntu 14.04 버전에는 기본적으로 1.5.0 버전의 Docker가 설치되어 있는 것을 확인할 수 있었고, 최신 버전으로 업그레이드 하기 위해서 다음과 같이 진행하였다.

패키지 인덱스 정보 업데이트

$ sudo apt-get update


패키지 설치

$ sudo apt-get install apt-transport-https ca-certificates


apt 매니저 키 등록

$ sudo apt-key adv \

               --keyserver hkp://ha.pool.sks-keyservers.net:80 \

               --recv-keys 58118E89F3A912897C070ADBF76221572C52609D


docker 인덱스 정보 등록

$ echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" | sudo tee /etc/apt/sources.list.d/docker.list


패키지 인덱스 정보 업데이트

$ sudo apt-get update


이건 뭘까?

$ apt-cache policy docker-engine


패키지 설치

$ sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual


Docker 설치

$ sudo apt-get install docker-engine

$ docker version





[기본 구성]

docker 구성

  • docker client
  • docker daemon
  • images
  • registry
  • containers


Docker client

다음과 같은 명령어를 실행

윈도우, 리눅스, Mac OS등 docker client가 설치되어 있다면 어디서든 사용 가능하다.

# docker build ...

# docker pull ...

# docker run ...


Docker daemon

docker daemon이 동작하는 환경을 DOCKER_HOST라고 하며 해당 장비에 컨테이너들이 동작하게 된다.

docker daemon, docker container는 각각 별도의 프로세스로 동작


Images

컨테이너가 생성되는 이미지 템플릿

모든 도커 컨테이너는 이미지에 기반을 두며, 이미지는 도커에 배포하고 실행하기 위한 모든 것의 기반을 제공한다. 하나의 컨테이너를 실행하려면 공개된 이미지를 먼저 다운받거나 직접 이미지를 만들어야 한다.


Registry

docker 이미지 저장 공간

https://hub.docker.com/

JFrog

Quay.io

Google Container Registry


Containers

도커 이미지 템플릿을 기반으로 한 프로세스


Dockerfile

Dockerfile은 이미지를 만드는 데에 필요한 모든 단계를 기술하고 있다.

빌드 시 다음의 각 명령어 단계는 이미지 레이어가 된다.

FROM

ADD

COPY

USER

ENV

VOLUME

WORKDIR

CMD

ENTRYPOINT



[Docker 컨테이너 실행하기]

tomcat 기본 이미지에 app.jsp 파일을 배포한 새로운 이미지를 빌드하고 해당 이미지를 컨테이너로 구동하는 방법에 대해서 설명 한다.

1.

도커 호스트에서 테스트 디렉토리 생성한 후 Dockerfile 생성

app.jsp 파일도 동일 디렉토리에 생성

from tomcat

COPY app.jsp /usr/local/tomcat/webapps/ROOT/app.jsp



2.

다음 명령어를 실행하면 Dockerfile 빌드 스크립트를 기준으로 빌드가 진행된다.

tomcat 기본 이미지가 도커 데몬 서버에 존재하지 않는 다면 다운로드를 진행하고 -t 옵션 뒤에 있는 "tomcat_test1" string 값이 repository name이 된다.

# docker build -t tomcat_test1 .


3.

Dockerfile 빌드 파일을 통해 새로 생성된 tomcat_test1 respository 이미지 기반의 도커 컨테이너를 실행하자.

# docker run -d -p 8080:8080 tomcat_test1

-d 옵션 : Run container in background and print container ID

-p 옵션 : Publish a container's port(s) to the host


4.

실행 중인 도커 컨테이너 내부에 접속하여 app.jsp 파일이 copy되었는지 확인한다.

docker ps 명령어를 통해 CONTAINER ID를 알아낸 후 다음 명령어를 실행

docker exec -i -t <CONTAINER ID> /bin/bash


5.

컨테이너 중지 및 삭제

중지 : docker stop <CONTAINER ID>

삭제 : docker rm -f <CONTAINER ID>


6.

도커 이미지를 삭제

<IMAGE ID>는 docker images 명령어를 실행하면 확인 가능하다.

# docker rmi -f <IMAGE ID>



[Docker 명령어 모음]

>> 빌드 하기 (Dockefile 존재 디렉토리에서)

docker build -t example/docker-node-hello:latest .

-t 옵션은 Repository name 이다.


>> 태그 이름 바꾸기

docker tag example/docker-node-hello:latest lng1982/docker-node-hello:latest


>> hub 에 push하기

docker push lng1982/docker-node-hello:latest


>> 도커 이미지 리스트

docker images


>> 도커 이미지 삭제

docker rmi -f openjdk:8-jre


>> 도커 컨테이너 실행 from 이미지

docker run -d -p 8080:8080 example/docker-node-hello:latest

-d 옵션 : Run container in background and print container ID

-p 옵션 : Publish a container's port(s) to the host


>> 도커 컨테이너 실행 from 이미지 (인자 추가)

docker run -d -p 7001:7001 -e WHO="namkyu" example/docker-node-hello:latest


>> 도커 컨테이너 실행

docker ps -a 를 통해 도커 컨테이너 리스트를 확인하고 실행하고자 하는 컨테이너를 시작할 수 있다.

docker start <CONTAINER ID>


>> 도커 컨테이너 프로세스 확인

docker ps


>> 실행 중인 도커 컨테이너 내부에 접속

docker exec -i -t <CONTAINER ID> /bin/bash


>> 도커 컨테이너 stop

docker rm -f ba619b0c2a1e

ba619b0c2a1e는 docker ps를 통해 얻어진 container id 값이다.


>> 도커 호스트의 모든 컨테이너 삭제

docker rm $(docker ps -a -q)


>> 도커 로그

docker log <CONTAINER ID>

docker log -f <CONTAINER ID>

docker logs --tail=1 <CONTAINER ID>


>> 기타

docker version

docker info

docker inspect 컨테이너ID

docker stats 컨테이너ID

docker events

docker top 컨테이너ID

docker history 이미지ID



[Docker Compose]

여러 개의 컨테이너 실행을 관리하는 툴이다.

설치는 다음과 같이 간단하다.

# 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

# docker-compose --version


docker multi container 실행

1.

docker_compose_section_test.yml 파일 생성 후 아래 정보 추가

version: '2'

services:

  service1:

    image: ubuntu

    command: sleep 3600

    networks:

      - default

      - internal1

    volumes:

      - data:/data

  service2:

    image: ubuntu

    command: sleep 3600

    networks:

      - internal1

    volumes:

      - data:/data

  service3:

    image: ubuntu

    command: sleep 3600

    networks:

      - default

    volumes:

      - data:/data

networks:

  internal1:

    driver: bridge

volumes:

  data:

    driver: local


docker compose version2에는 3개의 section이 존재한다.

  • Services
  • Networks
  • Volumes

   

services section에 추가되는 service1, service2, service3 각각이 도커 컨테이너가 된다.

위의 설정을 보면 networks section에는 internal1 이 추가되어 있고, internal1을 service1, service2 컨테이너가 사용하고 있다.

이처럼 구성하면 service1 컨테이너 안에서 service2 컨테이너와 통신이 가능하게 된다. service3 컨테이너는 internal1 네트웍을 사용하고 있지 않기 때문에 service1, service2 컨테이너와는 통신할 수 없다.

volumes section에 추가되는 /data는 3개의 컨테이너가 함께 공유해서 사용하게 되는 디렉토리가 된다.

가령 service1 컨테이너 내부에 접속하여 /data 디렉토리 이동 후 test.jsp 파일을 생성하게 된다면 service2, service3 컨테이너 내에서도 /data/test.jsp 파일을 확인할 수 있다.



2.

docker compose 실행

docker_compose_section_test.yml 파일이 존재하는 디렉토리에서 다음의 명령어를 실행해야 한다.

# docker-compose up -d


3.

docker compose 중지

# docker-compose down


docker compose를 이용하면 compose 설정 파일을 통해 개발 환경에 맞는 컨테이너들을 입맛에 맞게 구성할 수 있다.

'서버' 카테고리의 다른 글

EFK Stack 구축 using Docker compose  (0) 2017.08.24
Google App Engine 환경에 Spring Boot 배포하기  (0) 2017.08.09
kubernetes 정리  (2) 2017.01.12
Kubernetes 설치  (6) 2017.01.12
리눅스 컨테이너 (LXC)  (0) 2017.01.04
MQTT (mosquitto broker 오픈소스)  (0) 2016.11.02
tomcat 구동 시 /dev/random 블로킹 이슈  (6) 2016.08.25
Nginx  (0) 2016.07.15