도커 (Docker)

이지수·2022년 7월 2일
0

도커란?

리눅스 컨테이너에 여러 기능을 추가함으로써 좀 더 쉽게 사용할 수 있게 만들어진 가상화 컨테이너 오픈소스 프로젝트. 기존에 쓰이던 하이퍼바이져, VirtualBox, VmWare대비하여 이미지의 용량이 작고, 배포시간이 빠르며, 가상환경의 성능 손실이 거의 없다.

가상 머신과 도커 컨테이너

기존 가상화 기술 (VmWare, VirtualBox)

하이퍼바이저를 이용하여 여러 개의 운영체제를(각 리눅스, 우분투 등 각 운영체제가 하나의 가상머신) 하나의 호스트에서 생성하여 사용하는 방식.

하이퍼바이저에 의하여 생성되고 관리되는 운영체제를 Geust OS라고 하고, VmWare, VirtualBox 등이 있다.

Pros
  • 독립된 공간과 시스템 자원을 할당 받아서 사용.
  • 라이브러리, 커널등을 포함한 완벽한 운영체제 환경 생성.
Cons
  • 하이퍼바이저를 통해서 GuestOs가 생성/관리 되기 때문에 하이퍼바이저에서 사용하는 리소스의 성능 손실이 발생.
  • 이미지파일에 운영체제를 사용하기 위한 라이브러리, 커널등을 포함하기 때문에 이미지 크기가 큼.
  • 이미지 크기가 커서 배포에도 시간이 걸리고 부담이 크다.

Docker 의 경우는

하이퍼바이져를 사용하지 않고, chroot, namespace, cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만들기 때문에 성능 손설이 거의 없다.

  • 컨테이너에 필요한 커널은 호스트의 커널 공유.
  • 컨테이너 내부에는 어플리케이션 구동하는데 필요한 라이브러리 및 실행파일만 존재.
  • 하이퍼바이저 환경 대비 이미지 용량이 작다. (=배포시간이 빠르다)
  • 가상화된 컨테이너 사용시 성능 손실이 거의 없다.

도커엔진

도커 이미지와 컨테이너

도커 이미지

  • 이미지는 컨테이너를 생성할때 필요한요소.
  • 가상머신의 iso 파일과 비슷한 개념.
  • 이미지는 여러 개의 계층으로 된 바이너리 파일로 존재.
  • 프로세스를 실행하기 위한(즉, 컨테이너 생성(실행)에 필요한) 모든 파일과 설정값(환경)을 지닌 것으로, 더 이상의 의존성 파일을 컴파일하거나 이것저것 설치할 필요 없는 상태의 파일

도커 컨테이너

  • 도커 이미지를 이용하여 생성된 프로세스(가상환경 => 컨테이너)
  • 컨테이너는 이미지를 읽기 전용으로 사용하고 변경사항은 컨테이너 자체에 저장
  • 즉, 같은 이미지라도 각 컨테이너의 변경사항은 독립적이다.

도커 명령어

버젼확인

> docker -v

Docker version 20.10.16, build aa7e414

컨테이너 실행

> docker run -i -t ubuntu:14.04

root@a2e26bed26c2:/#
root@b561878054fd:/# exit
exit
  • run: 이미지를 통해 컨테이너 실행 (이미지가 존재하지 않으면 Docker Hub 에서 자동 Pull)
  • -i: 상호 입출력 (interactive)
  • -t: tty 활성화 (tty를 활성화 하여 bash 셸 접속)
  • exit: 컨테이너 셸에서 나오고 컨테이너 정지
  • Ctrl + P, Q: 컨테이너 셸에서 나오기만 하고 컨테이너는 계속 동작
  • create -> start -> attach (-i -t 옵션이 있을때) 를 합쳐놓은 명령어

이미지 다운 받기

> docker pull centos:7

7: Pulling from library/centos
6717b8ec66cd: Pull complete
Digest: sha256:c73f515d06b0fa07bb18d8202035e739a494ce760aa73129f60f4bf2bd22b407
Status: Downloaded newer image for centos:7
docker.io/library/centos:7

도커엔진에 존재하는 이미지 확인

> docker images

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
centos       7         c9a1fdca3387   4 months ago   301MB
ubuntu       14.04     7304c635fe52   8 months ago   187MB

도커 이미지 실행 (컨테이너생성)

> docker create --name MyCentos7 centos:7
a8da55ff3bbeb66864c42d9b134a0f857f85de158ec3d557c1a92bea74ba1965

> docker start MyCentos7
MyCentos7

> docker attach MyCentos7
[root@a8da55ff3bbe /]#
  • create: 컨테이너를 생성만하고 실행시키지는 않는다. (-i -t 옵션은 의미가 없을듯?)
  • start: 컨테이너를 실행시킨다.
  • attach: 컨테이너 내부 터미널을 실행하여 접속한다.

컨테이너 목록 확인하기

> docker ps

CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS         PORTS     NAMES
a8da55ff3bbe   centos:7   "/bin/bash"   6 minutes ago   Up 3 seconds             MyCentos7
> docker ps -a

CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS                      PORTS     NAMES
413b72a0fb0e   centos:7       "/bin/bash"   3 minutes ago    Created                               MyCentos8
a8da55ff3bbe   centos:7       "/bin/bash"   9 minutes ago    Up 2 minutes                          MyCentos7
b561878054fd   ubuntu:14.04   "/bin/bash"   31 minutes ago   Exited (0) 31 minutes ago             sharp_almeida
a2e26bed26c2   ubuntu:14.04   "/bin/bash"   33 minutes ago   Exited (0) 33 minutes ago             priceless_merkle
  • -a: 정지된 컨테이너도 함께 보여준다.
  • COMMAND: 컨테이너가 시작될 때 실행될 명령어 ("/bin/bash"는 이미지에 내장된 기본 값)
  • # docker run -i -t centos:7 echo hello world! 명령어를 통해 컨테이너를 수행하는 경우 이미지에 내장된 기본 커맨드 bin/bash를 덮어쓰기 때문에 hello world!만 출력되고 종료.

컨테이너 이름변경

> docker ps
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS         PORTS     NAMES
a8da55ff3bbe   centos:7   "/bin/bash"   14 minutes ago   Up 8 minutes             MyCentos7

> docker rename MyCentos7 HelloCentos7

> docker ps
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS         PORTS     NAMES
a8da55ff3bbe   centos:7   "/bin/bash"   15 minutes ago   Up 8 minutes             HelloCentos7

컨테이너 삭제

일반적으로 정지 후 삭제

> docker stop HelloCentos7
> docker rm HelloCentos7

강제 삭제시 -f 옵션

> docker rm -f HelloCentos7 

모든 컨테이너 삭제 prune

> docker container prune

컨테이너 외부 노출

도커 컨테이너는 호스트의 포트와 컨테이너 포트를 바인딩하여 외부로 노출시킨다.

-p {호스트포트}:{컨테이너포트} 옵션

docker run -i -t --name mywebserver -p 80:80 ubuntu:14.04

워드프레스와 데이터베이스 구축해보기

MYSQL DB 컨테이너

docker run -d \ # -d 옵션은 detached 모드로 백그라운드에서 컨테이너 실행
--name mysqldb \
-e MYSQL_ROOT_PASSWORD=1234 \
-e MYSQL_DATABASE=wordpress \
mysql:5.7

WORDPRESS 컨테이너

docker run -d \
--name wordpress \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=1234 \
--name wordpress \
--link mysqldb:mysql \ #mysql 컨테이너 이름과 연결
-p 80 \
wordpress

도커볼륨 (2.2.6)

profile
공부합시다

0개의 댓글