기술보안/컨테이너

Docker 개념 및 구동해보기

  • -

1. Docker 란?

컨테이너 기반으로 애플리케이션을 개발, 제공 및 실행하기 위한 개방형 가상화 플랫폼이다.

 

Docker 기술은 Linux 커널과 함께 Cgroups 및 네임스페이스와 같은 커널의 기능을 사용하여 프로세스를 분리함으로써 독립적으로 실행될 수 있도록 한다. 여러 프로세스와 애플리케이션을 서로 개별적으로 실행하여 인프라를 더 효과적으로 활용하고 개별 시스템을 사용할 때와 동일한 보안을 유지할 수 있다.

 

네임스페이스는 프로세스 하나의 리소스 분리를 처리하고, Cgroups는 프로세스 그룹의 리소스를 관리한다.

 

Dokcer


2. Docker Container 란?

격리된 공간에서 프로세스가 동작하는 기술로, 우리가 흔히 알고 있는 컨테이너로 생각하면 쉽다. 운반해야 할 물건들을 담는 큰 박스로 한 척의 선박에 컨테이너들을 빽빽이 싣더라도 각각의 내용물은 서로 섞이지 않는다. 즉, 컨테이너들은 독립성이 보장된다.


우리가 개발할 소스코드와 개발, 실행 환경 또한 도커 컨테이너(Docker Container)라는 가상의 공간에 넣고 관리할 수 있습니다. 각각의 컨테이너는 도커의 관리하에 독립성을 보장받으며, 생성한 컨테이너를 복제하여 다른 PC에 배포할 수도 있다.

 


3. Docker를 사용하는 이유

  • 애플리케이션을 인프라에서 분리할 수 있으므로 소프트웨어를 빠르게 제공할 수 있다.
  • 애플리케이션을 관리하는 것과 동일한 방식으로 인프라를 관리할 수 있다.
  • 코드를 빠르게 전달, 테스트 및 배포하는 Docker의 방법론을 활용하면 코드 작성과 프로덕션 실행 사이의 지연을 크게 줄일 수 있다.
  • 컨테이너의 크기가 매우 작고 하나의 물리적 서버에 다수의 컨테이너를 가동시킬 수 있다.

기존의 가상화 방식은 주로 OS를 가상화한다. 우리에게 익숙한 VMware나 VitualBox 가상 머신은 호스트 OS 위에서 Guest OS 전체를 가상화하여 사용하는 방식이다. 이 경우 비교적 사용법이 간단하지만 무겁고 느리다.

 

Vitual machine VS Docker


4. Docker Architect

도커는 클라이언트-서버 아키텍처를 사용한다. 도커 클라이언트는 도커 컨테이너를 빌드, 실행 및 배포하는 무거운 작업을 수행하는 도커 데몬과 통신한다. 도커 클라이언트와 데몬은 동일한 시스템에서 실행되거나 도커 클라이언트를 원격 도커 데몬에 연결할 수 있다. 도커 클라이언트와 데몬 UNIX 소켓 또는 네트워크 인터페이스를 통해 REST API를 사용하여 통신한다. 또 다른 도커 클라이언트는 Docker Compose로 컨테이너 세트를 구성된 애플리케이션으로 작업할 수 있음

 

Docker Architect

Docker 데몬 
Docker 데몬 ( dockerd)은 Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리한다. 데몬은 다른 데몬과 통신하여 Docker 서비스 관리할 수 있다.

Docker 클라이언트 
Docker 클라이언트 ( docker)는 많은 Docker 사용자가 Docker와 상호 작용하는 기본 방법이다. 와 같은 명령을 사용 docker run 하면 클라이언트가 명령을 dockerd에 전송하여 실행한다. 이 docker명령은 Docker API를 사용한다. Docker 클라이언트는 둘 이상의 데몬과 통신할 수 있다.

Docker 레지스트리 
Docker 레지스트리 는 Docker 이미지를 저장한다. Docker Hub는 누구나 사용할 수 있는 공용 레지스트리이며 Docker는 기본적으로 Docker Hub에서 이미지를 찾도록 구성된다. 자신의 개인 레지스트리를 실행할 수 있다.

 

Docker 객체

  • 이미지
    자신의 이미지를 만들거나 다른 사람이 만들고 레지스트리에 게시 한 이미지 만 사용할 수 있다. 고유 한 이미지를 빌드하려면 이미지를 만들고 실행하는 데 필요한 단계를 정의하는 간단한 구문으로 Dockerfile을 만든다.
  • 컨테이너
    컨테이너는 이미지의 실행 가능한 인스턴스다. Docker API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동 또는 삭제할 수 있다. 컨테이너를 하나 이상의 네트워크에 연결하거나 스토리지를 연결하거나 현재 상태를 기반으로 새 이미지를 만들 수도 있다.

5. Docker 실습

구성환경
OS : CentOS 7.7
Docker : 1.13.1

 

※ CentOS 8 버전에서 설치하려면 도커 설치과정에서 에러가 발생한다. 해결방법은 검색하면 나오지만 CentOS 7 버전에서 설치하면 잘된다.


도커 설치하기 전에 OS에 도커가 설치되어 있을 수 있어 설치과정에서 충돌하는 에러가 발생하기도 한다. 
이 경우 미리 설치된 도커를 삭제해주는 게 좋다.

#sudo yum remove docker \
                          docker-client \                       
                          docker-client-latest \
                          docker-common \
                          docker-latest \
                          docker-latest-logrotate \
                          docker-logrotate \
                          docker-selinux \
                          docker-engine-selinux \
                          docker-engine

 

설치하기 전 yum update로 리스트 업데이트 해주고 혹시 모르니, Docker의 저장소를 추가 해준다.

#sudo yum update
#sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

 

저장소를 추가한 후, 도커를 설치해준다.

#sudo yum install -y docker-ce

 

설치가 완료된 후, 부팅 시 도커가 자동으로 실행되게 설정

#systemctl enable docker
#systemctl status docker

 

Docker 명령어

도커를 실습하기 전에 도커 명령어에 대해서 정리를 해보았다. 도커는 OS의 자원을 사용하기 때문에 기본적으로 ROOT 사용자에서 명령어를 사용해야 한다.

 

Search(이미지 검색)

#docker search [검색키워드]

 

Pull(이미지 다운로드)

#docker pull [다운로드할 이미지 이름]

 

Images(이미지 목록 보기)

#docker images

 

Run(컨테이너 생성과 동시에 컨테이너로 접속)

#docker run [options] image[:TAG|@DIGEST] [COMMAND] [ARG...]

#docker run -d -it --name centos docker.io /bin/bash

[옵션]
-d : detached mode 흔히 말하는 백그라운드 모드
-p : 호스트와 컨테이너의 포트를 연결 (포워딩)
-v : 호스트와 컨테이너의 디렉토리를 연결 (마운트)
-e : 컨테이너 내에서 사용할 환경변수 설정
--name : 컨테이너 이름 설정
--it : -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션 (컨테이너의 표준 입력과 로컬 컴퓨터의 키보드 입력을 연결)
--rm : 프로세스 종료시 컨테이너 자동 제거
--link : 컨테이너 연결 [컨테이너 명:별칭]

 

Ps(프로세스 리스트 출력)

#docker ps [options]

#docker ps -a

 

Start(컨테이너 시작) / Restart(컨테이너 재시작) / Stop(컨테이너 정지)

#docker start/restart/stop [컨테이너 id 또는 name]

  • Bash Shell에서 exit 또는 Ctrl + D를 입력하면 컨테이너가 정지된다.
  • Ctrl + P, Ctrl + Q를 차례대로 입력하여 컨테이너를 정지하지 않고, 컨테이너에서 빠져나온다.

Exec(컨테이너 접속)

#docker exec [options] [컨테이너 id 또는 name] /bin/bash

 

한번 실행된 컨테이너는 docker run이 아닌 docker start 명령으로 실행할 수 있다.

그 다음은 docker exe 명령을 통해 Docker 컨테이너에 /bin/bash를 실행시켜 접속한다.

 

Attach(컨테이너 접속)

#docker attach [컨테이너 id 또는 name]

 

Rm(컨테이너 삭제) / Rmi[이미지 삭제]

#docker rm [options] [컨테이너 id 또는 name]

#docker rmi [options] [이미지 id]

#docker rm/rmi -f [컨테이너 id / 이미지 id]


6. Docker로 Tomcat 구동하기

Tomcat 설치

#docker search tomcat

#docker pull docker.io/tomcat

Port Forwarding

#docker run -d -it -p 8080:8080 --name tomcat8 docker.io/ashince/tomcat8

톰캣은 8080포트를 사용하므로 8080포트를 열어 주고 이름은 임의로 편한 이름으로 지정해주면 된다. 이름을 지정해준 뒤 설치된 이미지 이름을 뒤에 적어주면 된다.

PORTS는 호스트의 0.0.0.0:8080이 컨테이너의 8080/tcp로 연결됨을 보여준다. 

 

이제 외부에서 이 컨테이너에서 실행중인 Tomcat 웹서버에 접속해본다. 컨테이너가 실행중인 호스트의 IP를 브라우저에 입력해본다.

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.