[설치 - 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 |