본문 바로가기
Programming

[Docker] 도커(Docker) 사용법

by 개발자 염상진 2022. 7. 27.

도커(Docker)란?

 

도커(Docker)는 리눅스 컨테이너를 기반으로 소프트웨어의 격리성을 제공하고 배포를 유연하게 해주는 오픈소스 툴입니다. 도커를 사용하면 실행환경을 일치시킬 수 있고, 네트워크 충돌을 줄일 수 있습니다. 여기서 리눅스 컨테어너는 소프트웨어 개발에 필요한 라이브러리 + 애플리케이션들을 모아서 마치 별도의 서버처럼 작동하도록 구성한 것입니다.

 

리눅스 컨테이너 환경에서는 프로세스, 네트워크, 파일 시스템이 구분됩니다.

프로세스

특정 컨테이너에서 작동하는 프로세스는 컨테이너 내에서만 접근가능하며, 다른 컨테이너에서 작동하고 있는 프로세스에 영향을 미치지 않습니다.

네트워크

컨테이너들은 각각 개별적인 IP를 할당받습니다. 즉 독립적인 네트워크 환경을 구축할 수 있습니다.

파일 시스템

컨테이너 내에서는 파일 시스템이 구성되어 있습니다. 

 

 

도커(Docker)를 사용하는 이유?

 

만약 웹 개발을 완료하고 서비스를 배포하기 위해서는 Heroku나 AWS EC2를 사용하게 됩니다. 이것도 아니면 자체적으로 서버 컴퓨터를 구성하고 애플리케이션을 배포할 수도 있습니다. 여기서 굳이 도커라는 또 다른 미들웨어를 사용해서 배포 과정에 사용하는 이유는 뭘까요?

도커는 실행/개발환경을 표준화 해줍니다

현재 가장 많이 사용되고 있는 OS는 윈도우, 리눅스, Mac 입니다. 모바일 생태계에서는 안드로이드, IOS가 있습니다. 개발자 입장에서는 어떤 환경에서 프로그램이 작동할지 예측하고 코드를 구성합니다. OS 별로 다른 버전의 코드를 작성한다는 건 매우 귀찮고 에너지 소모가 많은 일입니다.

예를 들어 경로를 표시함에 있어 유닉스 계열인 리눅스와 Mac에서는 ('/')을 사용하지만 윈도우에서는 ('\')를 사용합니다. 이런 사소한 차이로 인해 프로그램이 작동하지 않을 가능성이 존재합니다. 도커는 이 문제를 기적적으로 해결해줍니다.

 

 

도커는 환경구성을 자동화합니다

프로그램이 실행되는 환경별로 환경변수가 다릅니다. 즉, 개발자가 코드를 작성하고 프로그램 테스트를 진행하는 환경과 실제 프로그램이 동작하는 환경이 다를 수 있습니다. 프로그램을 돌리기 위해서는 환경변수를 설정해주는 수동작업이 필요하게 됩니다. 

또한 방화벽 설정, 사용자 권한, PORT 설정 등등 프로그램 하나 돌리기 위해 필요한 환경 구성이 꽤 복잡하게 필요한 경우가 많습니다. 대표적으로 JAVA 계열의 프로그램을 작동하기 위해서는 환경변수에 JDK를 설치해줘야 하는 경우가 있습니다. 도커는 이런 귀찮은 환경 구성 작업을 자동화 시켜줍니다.

도커는 리소스의 격리성을 보장합니다

도커는 프로세스, 네트워크, 파일 시스템을 컨테이너 별로 구분해 환경을 구성하므로, 격리성을 보장합니다.

 

도커(Docker) 사용방법

 

1. 기본 사용방법

 

도커를 사용할 때 가장 먼저 봐야 할 것은 공식문서입니다.

 

도커는 컨테이너라는 개념을 가지고 일정 Lifecycle 내에서 작동합니다.

도커는 Registry에서 image를 가져와 Container를 생성해 사용합니다.

 

 

도커 허브에 저장되어 있는 Image는 아래와 같습니다.

Registry는 기본적으로 Docker Hub를 사용합니다. 도커 이미지를 관리하는 공간입니다.

Repository는 레지스트리 내에는 도커의 Image가 저장되는 Repository로 구획화 되어 있습니다. 

Tag는 동일한 Image에 다른 버전을 명시합니다. 특정한 버전을 지정하지 않으면 가장 최근의 Image인 latest 태그가 붙은 Image를 가져옵니다.

 

Docker CLI로 간단하게 Registry에서 Image를 가져와 실행해봅니다.

① 레지스트리의 이미지를 가져옵니다.

 

$ sudo docker image pull docker/whalesay:latest
latest: Pulling from docker/whalesay
Image docker.io/docker/whalesay:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
e190868d63f8: Pull complete 
909cd34c6fd7: Pull complete 
0b9bfabab7c1: Pull complete 
a3ed95caeb02: Pull complete 
00bf65475aba: Pull complete 
c57b6bcc83e3: Pull complete 
8978f6879e2f: Pull complete 
8eed3712d2cf: Pull complete 
Digest: sha256:178598e51a26abbc958b8a2e48825c90bc22e641de3d31e18aaf55f3258ba93b
Status: Downloaded newer image for docker/whalesay:latest
docker.io/docker/whalesay:latest

 

② 도커 이미지를 조회합니다.

$ sudo docker image ls

 

③ Pull 한 Image로 Container를 실행합니다.

공식문서에 안내되어 있는 Container 실행 명령어입니다.

$ sudo docker run [OPTION] IMAGE [COMMAND] [ARG...]

받아온 Image를 가지고 Container를 실행합니다.

$ sudo docker container run --name containerName docker/whalesay:latest cowsay boo

 

컨테이너 실행 결과입니다.

< boo >
 ----- 
    \
     \
      \     
                    ##        .            
              ## ## ##       ==            
           ## ## ## ##      ===            
       /""""""""""""""""___/ ===        
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~   
       \______ o          __/            
        \    \        __/             
          \____\______/
  • run은 컨테이너 실행 명령어입니다.
  • --name은 컨테이너에 이름을 지정할 수 있습니다. 만약 이름을 지정하지 않으면 랜덤한 string이 이름으로 지정됩니다.
  • command는 컨테이너 실행시 초기 수행되는 명령입니다. cowsay는 컨테이너 초기 실행 시 cowsay 명령어를 호출합니다.
  • boo는 cowsay에 넘겨지는 파라미터(ARG...)입니다.

 

④ 컨테이너의 목록을 출력합니다.

-a 옵션으로 종료된 컨테이너까지 모두 조회할 수 있습니다.

$ sudo docker container ps -a

 

⑤ 실행이 완료된 Container를 삭제합니다.

$ sudo docker container rm containerName

 

⑥ 실행이 완료된 Image를 삭제합니다.

$ sudo docker image rm docker/whalesay

 

 

2. 동시에 여러 작업 수행하기

동시에 여러 작업을 수행할수도 있습니다. 

  1. 이미지를 가져오는 작업(docker image pull)
  2. 컨테이너 실행(docker container run)
  3. 컨테이너 삭제(docker container rm)
$ sudo docker container run --name ContainerName --rm docker/whalesay:latest cowsay AboutTech

 

명령어를 실행하면 로컬에서 이미지를 찾을 수 없다는 문구가 출력됩니다. 로컬에서 찾을 수 없는 경우 Image를 PULL 한 뒤 컨테이너를 실행하게 됩니다. 

Unable to find image 'docker/whalesay:latest' locally

 

실행이 완료된 이미지를 삭제합니다.

$ sudo docker rmi docker/whalesay:latest

 

3. 상호작용 컨테이너 실행

이미지를 받아와서 컨테이너를 실행할 때 -it 옵션(interaction)을 사용할 수 있습니다. 컨테이너와 사용자 간 지속적인 상호작용이 필요한 경우 사용합니다. danielkraic/asciiquarium:latest로 테스트를 진행합니다.

로컬에 이미지가 없으므로 Docker Hub에서 이미지를 가져와 컨테이너를 실행합니다. 상호작용(-it) 가능하므로 터미널에서 이미지가 계속 움직입니다. --rm 옵션으로 실행 종료 후 컨테이너와 관련된 리소스들은 모두 삭제합니다.

$ sudo docker container run -it --rm danielkraic/asciiquarium:latest

 

 

 

[Docker] 도커 사용하는 이유?

컨테이너 사용 배경? 부산항에서는 무역에 필요한 물동량을 컨테이너를 이용해 처리한다. 대형 트럭이 싣고 전국 구석구석 누비는 컨테이너가 존재하지 않는다면 재래식 방법으로 현재와 같은

about-tech.tistory.com

 

 

[Docker] Ubuntu 우분투 20.04 LTS 도커 설치 방법

How to install Docker in Ubuntu 20.04 LTS? 도커(Docker) 설치방법 ① apt package update $ sudo apt-get update ② Install curl $ sudo apt-get install curl ③ Add Docker official GPG key Docker Engine..

about-tech.tistory.com

 

 

[Docker] Node.js Dockerfile로 배포 하는 방법

Node.js 웹 어플리케이션 컨테이너화 Node.js express 모듈로 서버를 완성한 이 후 배포할 때 Docker를 사용합니다. Docker는 프로세스, 파일 시스템, 네트워크의 독립성을 보장해주고, Dockerfile 혹은 Docker-

about-tech.tistory.com

 

댓글