도커(Docker) 는 리눅스 컨테이너(Linux Container) 기술을 기반으로 하는 오픈 소스 서비스입니다. 도커를 통해 애플리케이션 실행 환경을 코드로 작성할 수 있으며, OS를 격리화하여 관리합니다.
Linux Container는 Linux 기반의 기술 중 하나로, 필요한 라이브러리와 애플리케이션을 모아서 마치 별도의 서버처럼 구성한 것을 말합니다. 컨테이너를 이루는 네트워크 설정, 환경 변수 등의 시스템 자원은 각 컨테이너가 독립적으로 소유하고 있습니다.
리눅스 컨테이너의 특징은 아래와 같습니다.
도커는 이미지를 읽기 위해 명령어를 세 가지 정보로 나눌 수 있습니다.
docker/whalesay
를 예시로 들면,
Registry
는 Docker Hub입니다.
따로 지정해주지 않았기 때문에, 디폴트 값인 도커 허브기 기본 레지스트리가 됩니다.
레지스트리는 도커 이미지를 관리하는 공간입니다.
Repository
는 whalesay
입니다.
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]
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
명령이 필요하거나 추가로 다른 입력을 해야할 때, 이 옵션을 지정한 뒤 사용합니다.
다른 사람이 제공한 도커 이미지를 받아 사용하는 경우, 원하는 모든 기능이 구성되어 있지 않을 수 있습니다.
게임 서버, 웹 서버의 경우 사용자가 사용할 도구가 도커 이미지에 모두 구성되어 있지 않은 경우가 있습니다.
가령, 웹 서버는 도커 컨테이너로 실행하고, 웹 서버를 구성하는 파일은 직접 만들거나 가져온 파일로 구성하는 것입니다.
즉, 로컬에 있는 파일과 도커 이미지를 연결하는 것입니다. 이 방법은 크게 CP(Copy)와 Docker Volume 로 나뉩니다.
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
생성된 이미지를 실행합니다.