[Docker] 개념 및 기본 명령어

Yalstrax·2021년 8월 16일
2

Back End

목록 보기
5/22

도커 (Docker)

도커(Docker)리눅스 컨테이너(Linux Container) 기술을 기반으로 하는 오픈 소스 서비스입니다. 도커를 통해 애플리케이션 실행 환경을 코드로 작성할 수 있으며, OS를 격리화하여 관리합니다.

Linux Container

Linux Container는 Linux 기반의 기술 중 하나로, 필요한 라이브러리와 애플리케이션을 모아서 마치 별도의 서버처럼 구성한 것을 말합니다. 컨테이너를 이루는 네트워크 설정, 환경 변수 등의 시스템 자원은 각 컨테이너가 독립적으로 소유하고 있습니다.

리눅스 컨테이너의 특징은 아래와 같습니다.

  1. 프로세스의 구획화
  • 특정 컨테이너에서 작동하는 프로세스는 기본적으로 그 컨테이너 안에서만 액세스 할 수 있습니다.
  • 컨테이너 안에서 실행되는 프로세스는 다른 컨테이너의 프로세스에게 영향을 줄 수 없습니다.
  1. 네트워크의 구획화
  • 기본으로 컨테이너 하나에 IP 주소가 할당되어 있습니다.
  1. 파일 시스템의 구획화
  • 컨테이너 안에서 사용되는 파일 시스템은 구획화되어 있습니다. 그래서 해당 컨테이너에서의 명령이나 파일 등의 액세스를 제한할 수 있습니다.

CLI 명령어

도커는 이미지를 읽기 위해 명령어를 세 가지 정보로 나눌 수 있습니다.

docker/whalesay를 예시로 들면,

Registry는 Docker Hub입니다.
따로 지정해주지 않았기 때문에, 디폴트 값인 도커 허브기 기본 레지스트리가 됩니다.
레지스트리는 도커 이미지를 관리하는 공간입니다.

Repositorywhalesay입니다.
docker라는 유저가 등록한 whalesay이미지 혹은 레포지토리 를 의미합니다.

이미지 이름이 사용되기도 합니다.
레포지토리는 레지스트리 내에 도커 이미지가 저장되는 공간입니다.
깃헙의 레포지토리와 유사합니다.

Tag는 위 예시로 보면 지정되어있지 않습니다.
지정되어있지 않은 경우, latest 태그를 붙인 이미지를 가져옵니다.
태그는 같은 이미지라 할지라도 버전 별로 안의 내용이 조금씩 다를 수 있습니다. 해당 이미지를 설명하는 버전 정보를 주로 입력합니다.

docker image pull docker/whalesay:latest

{image} pull 명령어는 레지스트리에서 이미지 혹은 레포지토리를 가져옵니다.
위 예시는 도커 허브 레지스트리의 docker라는 유저가 등록한 whalesay 이미지 혹은 레포지토리에서 latest 태그를 가진 이미지를 가져옵니다.

docker image ls

받아온 이미지 리스트를 출력합니다.

docker container run --name 컨테이너_이름 docker/whalesay:latest cowsay boo

받아온 이미지를 실행합니다.

  • {container} run
    • 컨테이너 실행
  • [OPTIONS]
    • --name : 컨테이너의 이름을 할당합니다.
  • [COMMAND]
    • command는 초기 컨테이너 실행 시 수행되는 명령어입니다.
    • cowsay : 컨테이너 실행 시 cowsay 명령어를 호출합니다. node를 호출하듯 이용합니다.
  • [ARG..]
    • boo : COMMAND인 cowsay에 넘겨질 파라미터입니다.
docker container ps -a

모든 컨테이너의 리스트를 출력합니다.

  • -a : Default 로는 실행되는 컨테이너지만 종료된 컨테이너를 포함하여 모든 컨테이너를 출력합니다.
docker container rm 컨테이너_이름

컨테이너_이름 이라는 이름을 가진 컨테이너를 삭제합니다.

docker container run --name 컨테이너_이름 --rm docker/whalesay cowsay boo

이미지를 받아오고, 컨테이너를 실행하고, 컨테이너와 관련된 리소스를 삭제하는 명령어를 한번에 입력할 수 있습니다.

위 명령어로, 이미지가 없다면 이미지를 먼저 받아오고(pull) 컨테이너를 실행합니다.

--rm은 컨테이너를 일회성으로 실행합니다. 컨테이너가 중지되거나 종료될 때, 관련된 리소스를 모두 제거합니다.

위 명령어를 터미널에 입력 후, 컨테이너 목록을 확인한 결과, 한 번 실행 후 삭제되었기 때문에 리스트에 나타나지 않습니다.

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

위 명령어는 -it 옵션을 설정했고, 일회성으로 실행하며, danielkraic이라는 사람이 만든 asciiquarium이라는 이미지의 latest 태그를 가진 이미지를 실행합니다.

-it-i-t를 동시에 사용한 옵션입니다.

사용자와 컨테이너 간 인터랙션이 필요한 경우 이 옵션을 사용합니다.
위 이미지는 출력되는 화면을 사용자가 지속적으로 보기 위해 사용되었습니다.

위 이미지는 수족관의 다양한 물고기들이 움직이는 애니메이션을 사용자가 지속적으로 보기 위해 위 옵션이 사용됐습니다.

위 옵션은 예를 들어 Python 명령이 필요하거나 추가로 다른 입력을 해야할 때, 이 옵션을 지정한 뒤 사용합니다.

이미지 복사 / Dockerfile

다른 사람이 제공한 도커 이미지를 받아 사용하는 경우, 원하는 모든 기능이 구성되어 있지 않을 수 있습니다.

게임 서버, 웹 서버의 경우 사용자가 사용할 도구가 도커 이미지에 모두 구성되어 있지 않은 경우가 있습니다.

가령, 웹 서버는 도커 컨테이너로 실행하고, 웹 서버를 구성하는 파일은 직접 만들거나 가져온 파일로 구성하는 것입니다.

즉, 로컬에 있는 파일과 도커 이미지를 연결하는 것입니다. 이 방법은 크게 CP(Copy)와 Docker Volume 로 나뉩니다.

  • CP(Copy) : 호스트와 컨테이너 사이에 파일을 복사(Copy)
  • Volume : 호스트와 컨테이너 사이에 공간을 마운트(Mount)

CP는 말 그대로 로컬의 파일을 도커 이미지에 복사하는 것이고, 볼륨은 호스트와 컨테이너 사이의 저장 공간을 다른 장치에서 접근할 수 있도록 경로를 허용하는 것입니다.

이러한 방식의 장점으로는 다음과 같습니다.

  • 서버에 문제가 생기는 것을 호스트와 별개로 파악할 수 있다.
  • 문제가 생긴 서버를 끄고, 공장 초기화를 하듯 도커 이미지로 서버를 재구동할 수 있다.

로컬의 pacman-canvas 파일은 팩맨 게임이며, 이 파일을 웹 서버에 업로드하여 사용할 수 있습니다.

웹 서버는 httpd(http daemon)을 사용합니다. 이는 Apache HTTP Server를 실행할 수 있는 오픈소스 웹 서버 소프트웨어입니다.

docker container run --name httpdserver --rm -d -p 818:80 httpd

위 명령어로 컨테이너를 실행합니다. -p 옵션은 로컬호스트의 포트와 컨테이너의 포트를 연결합니다. 818은 로컬 호스트, 80은 컨테이너의 포트입니다.

--rm 옵션으로 일회성 실행했고, -d 옵션으로 백그라운드에서 실행되도록 했습니다.

이후, 게임 파일의 디렉토리로 이동 후, httpd 이미지에 파일을 복사합니다.

docker container cp ./ httpdserver:/usr/local/apache2/htdocs/

httpd 도커 이미지는 /usr/local/apache2/htdocs/ 경로에 웹 서버와 관련된 파일들이 저장되어 있다면, 해당 파일을 기반으로 웹 서버가 실행되도록 합니다.

위와 같이 입력 후 localhost:818로 접속하면 복사된 이미지를 확인할 수 있습니다.

이렇게 만들어진 컨테이너를 이미지 파일로 변환할 수 있습니다.

이미지 파일로 변환할 때 장점은 배포, 관리가 유용하며 이전에 작업했던 내용을 다시 수행하지 않아도 됩니다.

docker container commit httpdserver my_pacman:1.0

위와 같이 commit 명령으로 변환할 수 있습니다.

docker run --name my_web -p 900:80 my_pacman:1.0

생성된 이미지를 새로운 포트로 구동합니다.

Docker 이미지 빌드를 위한 파일인 Dockerfile로 만들 수 있습니다.

Dockerfile은 Dockerfile을 만들고, Dockerfile 대로 이미지를 빌드하는 방법입니다.

로컬 파일의 디렉토리에서 아래와 같이 입력하는 것으로 Dockerfile을 생성할 수 있습니다.

docker build .
docker build --tag my_pacman:2.0 .

위 명령으로 Dockerfile로 도커 이미지 파일을 생성할 수 있습니다.

docker run --name my_web2 -p 901:80 my_pacman:2.0

생성된 이미지를 실행합니다.

profile
즐겁다면 그것만으로 만만세!

0개의 댓글