Docker 분석/정리
과거 (메모), 자료 기억상, 2019년 자료 인듯
목차
Docker 개요
- Docker 소개
- Docker 특징
Docker의 보조 도구
- Docker 소개
- Docker 특징
Docker 사용
- Docker 이미지
- DockerFile
- Docker 명령어
Docker 개요
[소개]
해당 소개는 Docker의 등장 배경 및 관련 기술과 VM의 차이점을 간략하게 설명한다.
서버 시장은 2010년이 지나면서 물리적인 서버의 구입보다는 사용 요금만 내고 가상 서버를 빌려 쓰는 클라우드 환경으로 변하고 있다. 물리적인 서버에 비해 클라우드의 장점은 1대가 되었든 1000대가 되었든 서버 가상화 기술을 통해 여러 대의 서버 환경을 구성할 수 있다(가상서버의 복사). 그러나, 생성된 서버에 각종 소프웨어를 설치하고 설정해야 한다. 쉘 스크립트를 통한 설정 자동화를 구현하여도 한계가 있다.
이 때 Immutable Infrastructure라는 개념이 등장했다. 호스트 OS와 서비스 운영환경을 분리하는 개념이다. 즉 서비스 운영환경을 이미지로 생성한 뒤 서버에 배포하고 실행하는 개념이다. 해당 이미지는 재활용될 수 있고, 운영환경은 변경하지 않는다.
이 Immutable Infrastructure를 구현한 것이 Docker이다.
많은 사람들은 Docker와 VM을 헷갈린다. 해당 사항은 다음의 그림으로 쉽게 설명할 수 있다.
가상머신은 가상화된 하드웨어 위에 OS를 올려 호스트 OS와 완전히 분리한다. Docker는 호스트 OS를 공유하기 때문에 호스트 OS의 커널 또한 공유한다.
가상머신의 장점은 다양한 OS를 설치하여 환경을 구성할 수 있지만, 리얼 머신에 비해 턱없이 느리다는 단점을 갖고 있다. 그러나, Docker의 경우, 호스트 OS의 하나의 프로세스로 분류되며, 하드웨어 가상화 계층이 없기 때문에 메모리/파일시스템 네트워크 접근 속도가 빠르다.
위에서 Docker가 사용하는 기술은 LXC(LinuX Containers) 기술이다. 이미 많은 리눅스 환경에서는LXC를 사용해왔다. LXC는 호스트OS와 여러 개의 리눅스 시스템(컨테이너)들을 분리하여 실행하기 위한 OS 레벨 가상화 방법이다. 즉, 호스트 OS 커널 레벨에서 제공되는 격리된 가상 공간이다.
이미 있는 기술인데, 왜 주변은 Docker에 환장을 하는가?
LXC는 격리된 공간만 제공할 뿐 개발 및 서버 운영에 필요한 부가 기능이 부족했다. Docker는 이와 같은 이미지, 컨테이너 생성 및 관리 기능 등의 다양한 부가 기능을 추가하였다. 해당 기능들을 통해 우리는 서버의 소프트웨어를 정말 편리하게 관리할 수 있다.
[특징]
해당 특징은 Docker의 특징과 장점을 살펴본다. 이와 같은 특징을 통해 우리가 Docker를 사용해야 하는 이유에 대해 설명한다.
Docker의 특징은 다음과 같다.
편리한 관리
- 서비스 운영 환경을 이미지로 생성했기 때문에 이미지 자체만 관리하면 된다. 특히 이미지를 중앙 관리하여 체계적인 배포와 관리를 할 수 있다. 이미지 생성 설정도 파일로 되어있기 때문에 버전 관리 시스템을 활용할 수 있다.
확장성
- 이미지 하나로 서버를 계속 찍어낼 수 있다. 클라우드의 Auto Scaling 기능과 연동하여 서비스 확장 또한 어렵지 않다.
- 또한 Docker-Compose, Docker-Swarm과 같은 다양한 보조 도구를 통해 Docker의 기능성을 더욱 향상시킬 수 있다.
이식성
- 같은 개발/테스트/운영 환경, Docker는 Immutable Infrastructure이기 때문에 같은 환경과 같은 경험을 제공한다. 개발자는 더이상 “로컬에서는 잘 되는데요”와 같은 말을 할 필요가 없다.
- 또한 클라우드 서비스의 변경, 서버의 리눅스 버전 변경, 서버의 리눅스 계열 변경 등과 같은 변화에 유연한다. Docker만 설치되어 있으면, 모두 같은 환경이다.
경량성
- VM과 다르게 Docker는 가상 하드웨어를 사용하지 않기 때문에 VM에 비해 빠르다. 또한 리얼머신에 올라가는 서비스와 Docker 위에 올라가는 서비스의 속도 차이는 1~2%이다.
리눅스와 Docker가 설치된 환경이면 모든 소프트웨어는 평등하다. 개발 서버와 로컬 서버에서 잘 되는 기능이 운영과 고객사에 올라가면 되지 않는 슬픈 일을 방지할 수 있다. 이와 같은 사항만으로도 우리는 Docker를 사용해야 한다. Dev와 Ops의 간극을 줄여주며 개발의 연속성을 제공한다.
간략하게 정리하면 사용 이유는 다음과 같다.
- 개발/테스트/운영의 같은 환경, 경험 제공
- 소프트웨어 설치 및 관리 복잡도 감소
- 간결한 배포
Docker의 보조 도구
단순 Docker를 사용하면 불편함이 굉장히 많다. 해당 불편함을 보조 도구를 통해 해결한다. 해당 보조 도구는 Docker 환경에서 사용하는 보조 도구에 대해 설명한다.
[Docker-Compose]
Docker의 최대 단점은 실행할 때 다양한 명령어의 입력이 필요한 것이다. 해당 명령은 각 컨테이너 별로 다르고 장황하다. 해당 문제는 Docker-Compose를 통해 개선할 수 있다.
Docker-Compose는 컨테이너 실행에 필요한 옵션을 docker-compose.yml 이라는 파일에 기록할 수 있다. 또한 컨테어니 간의 실행 순서나 의존성을 관리할 수 있다. 이와 같은 기능을 통해 Docker의 멀티 컨테이너 구성을 좀 더 간결하게 할 수 있고, Docker의 장점을 극대화할 수 있다.
Docker-Compose의 적용 전 후는 다음과 같다.
적용 전
docker run --rm -d -p 8080:8080 --name tomcat-7 \ -v /root/docker/kms/admin/conf/context.xml:/usr/local/tomcat/conf/context.xml \ -v /root/docker/kms/admin/conf/server.xml:/usr/local/tomcat/conf/server.xml \ -v /root/docker/kms/admin/bin/catalina.sh:/usr/local/tomcat/bin/catalina.sh \ -v /root/docker/kms/admin/webapps:/usr/local/tomcat/webapps \ -v /root/docker/kms/admin/logs:/usr/local/tomcat/logs \ -u kms tomcat:7 |
적용 후
docker-compose.yml(부분 발췌)
version: '2' services: kms-admin: image: dream-tomcat:7 command: ["catalina.sh", "run"] user: $install_user container_name: ***-admin ports: - '8180:8180' volumes: - ./***/admin/conf/context.xml:/usr/local/tomcat/conf/context.xml - ./***/admin/conf/server.xml:/usr/local/tomcat/conf/server.xml - ./***/admin/bin/catalina.sh:/usr/local/tomcat/bin/catalina.sh - ./***/admin/webapps:/usr/local/tomcat/webapps - ./***s/admin/logs:/usr/local/tomcat/logs depends_on: - postgres links: - postgres |
위와 같이 docker-compose는 docker run에 해당하는 옵션을 규격화 하여 파일로 관리할 수 있게 했다. 모든 docker 컨테이너들을 docker-compose 명령어와 docker 명령어를 통해 쉽게 다중 컨테이너 환경을 관리할 수 있다.
[Docker-Swarm]
클라우드 환경에서의 오토 스캐일링과 Docker를 연동하면 HA의 구성을 할 수 있다. 그러나 그렇지 못한 환경은 어떻게 HA를 구성할 수 있을까?
Docker-Swarm은 Docker의 오케스트레이션을 제공해주는 도구이다. 오케스트레이션을 간단하게 얘기하면 다음과 같다. 여러 대의 서버와 여래 개의 서비스를 편리하게 관리해주는 작업 언뜻 보면 Docker-Compose와 비슷할 수 있지만, Docker-Swarm은 다음과 같은 더 큰 기능을 제공한다.
- Cluster management integrated with Docker Engine
- Decentralized design
- Declarative service model
- Scaling
- Desired state reconciliation
- Multi-host networking
- Service discovery
- Load balancing
- Secure by default
- Rolling updates
자세한 기능 명세는 Docker-Swarm 공식 홈페이지 또는 기타 블로그에서 확인할 수 있다. Docker-Swarm을 통해 아래와 같은 환경을 구성할 수 있다.
Docker 사용
[이미지]
Docker 컨테이너에 가동하는 서비스(이미지)이다. Docker의 이미지는 Docker Hub에서 중앙 관리한다. 모든 Docker의 이미지는 Docker Hub에서 관리하는 이미지를 참조해서 생성한다. 이미지는 Dockerfile 작성과 빌드를 통해 생성할 수 있다. 사용자는 언제든지 사용자 임의 이미지를 생성할 수 있으며, 해당 이미지를 Docker 컨테이너에 적재하여 서비스를 활성화할 수 있다.
[Dockerfile]
Docker 이미지를 만들기 위한 설정 파일이다. Dockerfile은 예를 통해 설명한다. 다음은 apache 웹서버 이미지를 생성하는 Dockerfile의 간단한 예이다.
FROM ubuntu:14.04
# app 디렉토리 생성 RUN mkdir -p /app
#Docker 이미지 내부에서 RUN, CMD, ENTRYPOINT의 명령이 실행될 디렉터리를 설정합니다. WORKDIR /app
# 현재 디렉터리에 있는 파일들을 이미지 내부 /app 디렉터리에 추가함 ADD . /app
RUN apt-get update RUN apt-get install apache2 RUN service apache2 start
VOLUME ["/data", "/var/log/httpd"]
# 하기 포트를 외부로 노출합니다. EXPOSE 80
# 쉘을 사용하지 않고 컨테이너가 시작되었을 때 logbackup 스크립트를 실행 CMD ["/app/log.backup.sh"]
|
[명령어]
1. 빌드
Docker build -t dream-tomcat:7 -f Dream-Dockerfile . Docker build -t dream-tomcat:7 . |
2. 이미지 받아오기(from Docker Hub)
docker pull tomcat:latest |
3. 이미지 Export
docker save -o dream-tomcat-6.tar tomcat:6 |
4. 이미지 Import
docker load -I dream-tomcat-6.tar |
5. Docker 이미지 출력
docker images |
6. Docker 프로세스 상태 출력(most)
docker ps -a |
7. Docker 정지 관련 명령
docker stop ***-tomcat-6 // 이미지 가동을 정지한다(docker 컨테이너 정지). docker rm ***-tomcat-6 // 이미지의 존재를 삭제한다(docker 컨테이너 삭제). docker rmi ***-tomcat-6 // 이미지를 완전 삭제한다(docker의 이미지 완전 삭제). |
8. docker run 명령
docker run --rm -p 8280:8280 --name ***-auth \ -v /root/***/auth/conf:/usr/local/tomcat/conf \ -v /root/***/auth/logs:/usr/local/tomcat/logs \ -v root/***/auth/webapps:/usr/local/tomcat/webapps tomcat:6 |
|
run |
Docker 컨테이너를 가동하는 명령어 |
--rm |
컨테이너 중복할 경우, 기존 것 삭제 후 서비스 가동 |
-p |
통신 포트 설정 |
--name |
Docker 컨테이너 이름 지정 |
-v |
볼륨 매핑, 호스트 OS에 있는 파일을 Docker 컨테이너에 적재 및 Sync |
9. Docker 컨테이너 진입
가동하고 있는 Docker 컨테이너에 진입한다. 예는 다음과 같다.
docker exec -it postgresql-9.1 psql -U postgres docker exec -it postgres chmod -R 770 /var/lib/postgresql docker exec -it postgresql-9.1 bash |
10. Docker-Compose 명령
docker-compose up -d // 백그라운드에서 Docker 컨테이너 실행 docker-compose up -d postgres // 특정 Docker 컨테이너 실행 docker-compose rm -fsv postgres // 특정 Docker 컨테이너 rm docker-compose stop postgres // 특정 Docker 컨테이너 stop |
'개발관련 > (과거)메모' 카테고리의 다른 글
HKDF 간단 메모 (2) | 2022.02.21 |
---|---|
Runnable/ExecutableJAR with Maven(Java 배치프로그램/메이븐 빌드) (0) | 2021.05.19 |
ChartJS 소개 및 기본 예제 (0) | 2021.02.04 |
Postgresql Streaming Replication(9.1) (0) | 2021.01.20 |
PostgreSQL 백업 & 복구 (0) | 2021.01.20 |