본문 바로가기
공부/Container

[Container] 컨테이너 & 도커 입문

by haejang 2021. 7. 11.
728x90
728x90

 

 

참조

 

 

1. 서버 가상화에 대해


우리는 흔히 물리 서버의 공간/비용 절약을 위해 서버 가상화 기술을 사용하며, 여기엔 3가지 기술이 있다

1) 하이퍼바이저 형 (Native 또는 베어메탈 방식)

  • 호스트 OS 없이, 하드웨어 위에 바로 하이퍼바이저라는 가상화 소프트웨어를 올린 뒤 여러 게스트 OS를 구동시키는 방식
  • 여기서 각각의 가상 머신들은 독립한 호스트 시스템과 같이 행동
  • 하이퍼바이저 소프트웨어 : VMWare ESXi, Microsoft Hyper-V 등

2) 호스트 OS 형

  • 호스트 OS 위에서 가상화 소프트웨어를 돌리고, 그 안에서 가상 머신들을 작동시키는 방식
  • 가상화 소프트웨어 : VMWare Workstation, VirtualBox 등
  • +) 가상화 소프트웨어 없이 가상 머신들을 그저 임대해서 사용하는게 클라우드 기술

3) 컨테이너 형

  • 하나의 OS(호스트 OS) 환경에서 애플리케이션을 실행하기 위한 영역 을 가상화한 것
  • 해당 사용자 영역들을 컨테이너라 부르며, 각각의 컨테이너는 다른 컨테이너에 영향을 미치지 않고 애플리케이션을 실행시킴
  • 호스트 OS 입장에서 하나의 컨테이너는 하나의 프러세스이며, 멀티 OS 환경 구현도 가능하다
  • 컨테이너 관리 소프트웨어 : Docker

 

 

2. Container의 장점


OS 레벨이 아닌, 실행 환경만을 이미지화해서 저장하기 때문에 굉장히 가볍고 빠르다

또한 한 서버에서 여러 애플리케이션을 돌려야 하는데 사용하는 스택이 다를 때, 각각의 컨테이너 안에서 방해 없이 돌릴 수 있다

근데 사실 나는 개발자가 아닌데다가 실제로 사용해본 적은 없어서 잘은 모르겠다

그저 좋다고 하니 도전해보는 것,,,,

참고로 컨테이너들은 OS의 커널을 공유하기 때문에 윈도우즈용 이미지는 윈도우에서만, Linux용 이미지는 Linux에서만 실행 가능하다

 

+) 각각의 애플리케이션들을 컨테이너화 하는 플랫폼이 Docker라면, 컨테이너화 된 여러 애플리케이션들을 관리할 수 있게 하는 서비스가 쿠버네티스라고 한다

 

 

3. 간단한 Docker 실습!


실습 진행할 호스트 OS : Ubuntu 18.04 (AWS EC2)

왜인진 모르겠는데 컨테이너, 도커 관련 실습은 거의 다 우분투 글들이길래,,,,나도 따라함

 

3-1) Ubuntu에 Docker 설치 (sudo)

# Docker Repository 등록 위한 package 설치
apt-get update
apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

# Docker GPG Key 등록
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# Docker Repository 등록
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# Docker 설치
apt-get install docker-ce docker-ce-cli containerd.io

잘 깔렸는지 확인을 위해 버전을 확인해보자

$ docker -v
Docker version 20.10.7, build f0df350

 

3-2) CentOS 실행 환경 사용해보기

먼저 Image란걸 이해해보자

사실 VM이나 클라우드를 좀 사용해봤다면 알겠지만, 어떤 애플리케이션을 실행하기 위한 특정 실행 환경 을 캡쳐해둔 것이라고 생각하면 된다

 

먼저 내가 갖고 있는 이미지들을 확인하는 명령은 아래와 같다

docker images

 

당연하게도 아직 아무 이미지도 없다

 

그렇다면 이미 존재하는 CentOS를 하나 땡겨와보자 -> 이미지 검색은 search명령을 사용하면 된다

docker search [검색할 내용]
docker search centos

 

 

가장 위의 centos official 이미지가 보인다 -> pull명령으로 땡겨오자

docker pull [이미지 이름:태그]
docker pull centos

참고로 이미지 이름은 이미지 이름:태그 이지만, 태그 생략 시 latest 태그로 자동 사용된다

즉, centos == centos:latest

 

 

참고로 이미지를 업로드할 땐 push명령이라고 한다

아무튼 images명령을 다시 내려보면,

 

 

centos:latest 이미지가 추가된걸 확인할 수 있다 -> 바로 이 센토스 환경에 접속해보자

docker run [옵션] [이미지] [명령]
docker run -it centos:latest bash

-i (interactive) : 표준 입력 활성화 -> 컨테이너 환경에 들어가서 직접 명령을 내릴 때 (bash 명령)

-t (tty) : TTY 모드 사용 - Bash 사용하려면 이 옵션을 사용해야된다고 한다

=> 컨테이너 안에서 터미널 실행 위해선 -it를 한꺼번에 쓴다

 

 

셸 프롬프트가 바뀌고 OS 정보도 바뀐걸 확인할 수 있다

 

그런데 여기서!

사실 센토스 환경에 접속했다란 말은 틀린 말이다

호스트 OS와 격리된 환경에서 bash 프로그램을 실행했다고 하는것이 정확하다고 한다

(물론 해당 컨테이너로 SSH 접속하는 것도 가능)

 

다른 터미널에서 현재 돌아가고 있는 도커 프로세스를 확인해보자

docker ps

 

 

다시 컨테이너 터미널로 돌아와서, exit 명령을 통해 나간 후 다시 ps를 해보면

 

 

이렇게 실행중인 도커 프로세스가 없다고 뜬다

docker ps -a 옵션을 통해 종료된 컨테이너들까지 확인할 수 있으며, 해당 컨테이너의 ID를 가지고 restart, attach 하는 것 또한 가능하다

docker ps -a
docker restart [도커ID]
docker attach [도커ID]

 

 

 

3-3) Dokcerfile을 통해 이미지 직접 만들기

위에서 받은 센토스 기본 이미지에는 git이 안깔려있다

 

 

Git이 깔려있는 이미지를 만들어보겠다

먼저 해당 Dockerfile을 저장하기 위한 디렉토리를 만든 후, Dockerfile이라는 파일을 만들어주자

mkdir ubuntugit
cd ubuntugit/
vi Dockerfile

Dockerfile엔 아래와 같이 작성해주자

FROM centos:latest

RUN yum install -y git

FROM : 어떤 이미지로부터 수정할것인지를 지정 (필수)

RUN : 실행할 명령 지정

 

이 Dockerfile을 가지고 이미지를 빌드하자

docekr build -t [이미지명:태그] [Dockerfile 있는 폴더]
docker build -t centos:installgit .

 

 

빌드가 잘 되었다

아까와 마찬가지로 run -it를 사용한 후 git이 잘 깔려있는지 확인해보자

docker run -it centos:installgit bash
git --version

 

 

아까 centos:latest 이미지와 다르게 git이 깔려있는걸 확인할 수 있다

 

Dockerfile에서의 명령엔 FROM, RUN 말고도 WORKDIR, ENTRYPOINT, CMD, ADD 등 더 많이 있으니 알아서 찾아보자

 

 

3-4) 컨테이너를 사용해 여러 웹서버 동시에 띄워보기

우분투와 센토스에서 아파치를 깔았을 때 나오는 기본 화면이 다르므로 그걸 사용해서 2개의 웹서버를 동시에 띄우는걸 확인해보도록 하겠다

 

 

먼저 호스트OS(우분투)에 아파치를 설치하자

apt-get install -y apache2
systemctl start apache2

이제 이 서버의 IP를 웹 브라우저에 치면

 

자동으로 80 포트로 연결되며 이런 페이지가 뜬다

 

이제 아파치가 깔려있는 센토스 이미지를 갖고와서 실행시켜보자

# httpd 있는 이미지 검색
docker search httpd

# 원하는 이미지 땡겨오기
docker pull centos/httpd

# 해당 이미지 백그라운드로 실행
docker run -d -p 9999:80 centos/httpd:latest

-d (detach) : 데몬 모드, 컨테이너 백그라운드 실행

-p (publish) : 포트 포워딩 기능 -> 9999:80 이면 9999 포트로 들어오는 트래픽을 이 컨테이너 내부에 80 포트로 보내준다는 뜻

 

 

아까 웹 브라우저에 친 IP 옆에 :9999를 붙여서 들어가보면

 

이랬던 화면이
이렇게 바뀐다

즉 80포트와 9999포트에 따라 각기 다른 웹서버로 접속된것이며, 9999로 들어간 웹서버는 컨테이너로 띄운 이미지이다

 

 

4. 마무리


말 그대로 입문 글이었기 때문에 별다른 실습은 하지 않고 겉핥기 식으로 도커를 한 번 사용해봤다

서버 자체를 가상화한것과는 다르게, 하나의 애플리케이션과 그 환경을 가상화하여 사용한다고 생각하면 쉬운 것 같다

또한 한 번 만들어둔 도커 파일을 언제 어느 서버에서든 사용할 수 있으므로 잘 쓰면 여러모로 유용할듯 하다

 

도커 개념이 여전히 잘 안잡힌다면 맨 위의 링크에 있는 얄팍한 코딩사전 님 유튜브를 보는것을 추천한다

 

끝!

 

 

728x90
728x90

댓글