티스토리 뷰

Server

Docker의 기본적인 개념

슈나우저 2022. 4. 16. 00:05
반응형

목차

  • Docker란 무엇일까요?
  • Docker Image의 이해
  • Docker 데스크탑에 설치해보기
  • Docker 기본 명령어 따라하기
  • Docker 기타 명령어

 

Docker란 무엇일까요?

Docker는 컨테이너를 기반으로 가상화 플랫폼을 제공하는 오픈소스입니다.

흔히 Docker는 Docker Engine 위에서 독립된 운영 환경을 제공하고 있습니다.

과거에는 개발환경을 구축하거나 또는 배포 환경을 구성하다보면 필연적으로 개발환경과 관련된 OS를 설치하고, 또 그에 맞는 관련된 툴을 모두 새롭게 설치하곤 했습니다.

그리고 반복된 테스트를 수행하다 보면 작업도 오래 걸리거나 서버를 늘려야 하는 작업이 필요한데, 그러다보면 환경에 따라 동일한 서버를 여러대로 늘리는 작업이 필요하겠지요.

흔히 Load Balancing 기능을 구현하기 위해서는 Scale-up 혹은 Scale-out 기술이 필요한데, 서버의 구축 시간을 단축시킬 수 있는 방법으로 흔히 가상머신(VMware)을 주로 사용하기도 했습니다.

 

 

VMware, VirtualBox 같은 가상머신은 한번 환경을 구축해 놓으면 반복해서 사용할 수 있기 때문에 유용합니다.

하지만 일일이 이미지를 만드는데 들어가는 노력도 크고, 무엇보다도 이미지 사이즈가(용량) 매우 큰 편입니다.

Docker는 운영체제 부분을 호스트 머신으로 그대로 사용하므로, 하나의 서버에 여러 운영체제를 설치해도 낭비되는 부분이 없이 빠른 설치가 가능합니다.

또한 Docker Hub라는 사이트를 통해 다른 사람들이 작성한 컨테이너 설정도 그대로 가져다가 쓸 수 있습니다.

예를 들어서 워드프레스로 구동되는 웹서버를 구축하려면, 기존에는 운영체제를 설치하면서 LAMP(Linux, Apache, MySQL, PHP) 툴도 같이 설치해야 하는 과정을 거쳐야만 했습니다.

하지만 Docker를 구동시킬 수 있는 리눅스 서버만 존재한다면, 워드프레스에서 제공되는 Docker Image를 적용하면 누구나 쉽고 빠르게 기본 환경을 구축할 수 있습니다.

 


 

Docker Image의 이해

 

Docker의 이미지는 Url 방식으로 관리되면서 :latest 같은 부가적인 태그를 붙일 수 있습니다.

Ubuntu 이미지를 다운받으려면 docker.io/library/ubuntu:14.04 또는 docker.io/library/ubuntu:trusty 경로를 이용하여 받을 수 있고, docker.io/library 부분은 생략도 가능하며 ubuntu:14.04로 사용할 수도 있습니다.

기본적인 Url 방식만 익힌다면 이해하기도 쉽고 편리하게 사용할 수 있으며, 태그 기능을 잘 이용한다면 Git과 연동하여 Docker 이미지를 버전별로 가져오거나 혹은 테스트나 롤백도 쉽게 할 수 있습니다.

 

DockerFile(예시)

# server image는 vertx3:3.3.1를 사용
FROM subicura/vertx3:3.3.1
# Dockerfile 작성자
MAINTAINER abbo@tistory.com

# build 명령문 사이에 호스트의 파일 또는 폴더를 이미지에 가져오는 작업
ADD build/distributions/app-3.3.1.tar /
ADD config.template.json /app-3.3.1/bin/config.json
ADD docker/script/start.sh /usr/local/bin/

# image가 올라갔을 때 수행되는 명령어
RUN ln -s /usr/local/bin/start.sh /start.sh

# expose를 이용해 port를 설정, server로 접근이 가능하도록 한다.
EXPOSE 8080
 
# 컨테이너가 생성 된 이후에 자동적으로 실행될 명령어
CMD ["start.sh"]

 

도커는 이미지를 만들기 위해 Dockerfile이라는 파일에 자체 DSL(Domain-specific language) 언어를 이용해서 이미지의 생성 과정을 적습니다.

서버에 어떤 프로그램을 설치하려고 여러가지의 의존성 패키지를 설치해보고 설정 파일을 만들었던 경험이 있다면, 더 이상은 그 과정을 블로깅 하거나 메모장에 적지 않고 모두 Dockerfile에 적어서 관리하면 됩니다.

Dockerfile은 소스와 함께 버전 관리가 가능하며, 필요에 따라 누구나 이미지 생성 과정을 보고 스스로 수정할 수 있습니다.

 


 

Docker 데스크탑에 설치해보기

Docker를 Mac이나 Windows에 설치하려면 Docker for mac 또는 Docker for windows 경로에서 설치하시면 됩니다.

파일을 다운 받고 설치한 후에 재부팅하면 Docker Desktop 파일이 생성되며, 대부분 문제 없이 완료됩니다.

 

설치 과정이 매끄러워서 마치 네이티브스럽게 설치된 것 같지만, 사실 Docker는 Linux 컨테이너이므로 실제로는 데스크탑 내장의 가상머신에 설치가 된 상태입니다.

사용자가 가상머신을 사용한다는 느낌이 전혀 들지 않도록 그런 부분들이 굉장히 신경써서 설계됐다고 보여집니다.

사실 포트를 연결하기 위해서는 Docker 컨테이너의 특정 포트를 가상머신에 연결하고, 그리고 다시 Windows 포트와 연결해서 동작시켜야 합니다.

그리고 디렉토리를 연결한다면 가상머신과 공유할 부분을 설정하고 그 디렉토리를 다시 컨테이너와 연결하는 과정이 필요합니다.

이렇게 일일이 추가적으로 거쳐야 하는 부분들을 Docker는 자연스럽게 처리해주는 장점이 있습니다.

 

Windows PowerShell을 이용해서 Docker Version을 출력해보겠습니다.

Docker는 하나의 실행파일이지만, 실제로는 클라이언트와 서버역할을 각각 하기 때문에 버전정보가 두 개로 나뉘어져 있습니다.

따라서 커맨드를 입력하면 클라이언트가 서버로 명령을 전송하고 그 결과를 받아 터미널에 출력해 줍니다.

 


 

Docker 기본 명령어 따라하기

docker ps로 실행중인 컨테이너 확인

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

아직 아무것도 실행 중이지 않은 상태를 확인할 수 있습니다. 

 

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

# -p : 호스트와 컨테이너의 포트를 연결하는 옵션 (포워딩)
# -d : detached mode, 흔히 말하는 백그라운드 모드
$ docker run -p 4567:80 -d nginx:latest
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
b4d181a07f80: Pull complete
edb81c9bc1f5: Pull complete
b21fed559b9f: Pull complete
03e6a2452751: Pull complete
b82f7f888feb: Pull complete
5430e98eba64: Pull complete
Digest: sha256:47ae43cdfc7064d28800bc42e79a429540c7c80168e8c8952778c0d5af1c09db
Status: Downloaded newer image for nginx:latest
5909b49c4a0e677fae0146846bdf4feca1ef869ece4cc46499f58d00f311e3d1

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5909b49c4a0e nginx:latest "/docker-entrypoint.…" 1 second ago Up Less than a second 0.0.0.0:4567->80/tcp, :::4567->80/tcp musing_allen

docker run 명령어로 nginx 이미지 기반 컨테이너를 하나 실행해봅니다.

이미지가 모두 다운로드 되면 자동으로 실행됩니다.

그리고 다시 docker ps로 확인하면 nginx 컨테이너가 4567 포트로 실행된 것을 확인할 수 있습니다.

이제 웹 브라우저에서 127.0.0.1:4567(localhost)로 접속해보면, 'Welcome to nginx!' 메시지가 나타날 것입니다.

 

docker rm으로 이미지 삭제하기

$ docker rm -f 5909b49c4a0e

사용하지 않는 컨테이너는 docker rm 명령어로 삭제할 수 있습니다.

여기서 5909b49c4a0e는 docker ps에서 확인할 수 있는 CONTAINER ID의 항목입니다.

 


 

Docker 기타 명령어

컨테이너 중지하기(stop)

docker stop [OPTIONS] CONTAINER [CONTAINER...]

 

컨테이너 로그 보기(logs)

docker logs [OPTIONS] CONTAINER

--tail 마지막 줄부터 몇 줄을 출력할지 설정할 수 있다. ( ex, --tail 10)
-f 실시간으로 생성되는 로그를 볼 수 있다.

 

컨테이너 명령어 실행하기(exec)

docker exec [OPTIONS] CONTAINER COMMAND [ARG..]

 

이미지 목록 확인하기(images)

docker images [OPTIONS] [REPOSITORY[:TAG]]

 

이미지 다운로드 하기(pull)

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

(run 명령어는 이미지가 없을 때 자동으로 받아지며, pull 명령어는 최신버전을 다운로드를 할 경우에 사용됩니다.)

 

이미지 삭제하기(rmi)

(컨테이너가 실행 중인 이미지는 삭제되지 않습니다.)

docker rmi [OPTIONS] IMAGE [IMAGE...]

 

 

반응형
댓글
공지사항