Docker 기초

2022. 10. 12. 23:44[개발] 지식/Docker

Docker의 필요성

Docker를 사용하기 전에 “이미지”와 “컨테이너”의 의미를 짚고 넘어갈 필요가 있다. Windows 를 예로 들자면 아래와 같이 비유할 수 있다.

  • 이미지 : Windows 설치 CD
  • 컨테이너 : 컴퓨터에 설치된 Windows

만약 설치한 Windows에 파워포인트를 설치했다고 가정해보자. 그래도 Windows 설치 CD의 내용은 변화가 없다. 이것을 이미지의 불변성(immutable) 이라고 한다. 다시말해 이미지 기반으로 생성한 컨테이너를 아무리 변경한다고 해도 원본 이미지는 변하지 않는다.

그런데 새 PC에 동일한 환경을 설치할 필요가 생겼다. 그렇다면 새 PC에 Windows를 설치하고 파워포인트를 설치하는 동일한 작업을 반복해야 한다. PC 한대면 그냥 설치하겠지만, 만약 여러대라면? 매번 똑같은 작업을 수행하는 것은 비효율적이다.

이를 해결하기 위해 파워포인트가 설치된 Windows PC를 통째로 이미지로 만들어 CD로 굽기로 했다. 그리고 이 CD의 이름을 Windows:powerpoint 라고 이름지었다. 여기서 Windows는 이미지의 이름이고, :powerpoint는 버전의 이름이다. 이제 다른 PC에 Windows:powerpoint CD로 설치하면 파워포인트가 설치된 Windows가 세팅된다.

Windows:powerpoint를 나만 사용하는게 아니라 온라인에서 공유하면 더 많은 이점을 얻을 것 같다. 생성한 CD 이미지를 공유할 수 있는 플랫폼을 Registry라고 한다. Registry에 이미지를 올리면 아래와 같은 여러가지 장점이 있다.

  • 내가 만든 이미지를 온라인을 통해 다양한 환경에서 손쉽게 다운받아 사용이 가능하다.
  • 내가 만든 이미지를 다른 사람이 사용할 수 있고, 나도 다른 사람이 올린 이미지를 사용할 수 있다.
  • 다른 사람의 이미지를 개량하여 다시 공유할 수 있다. 반대로 다른 사람이 내가 올린 이미지를 개량할 수 있다.

여기서 Docker의 이미지를 Windows CD로, 컨테이너를 컴퓨터에 설치된 구동중인 Windows로, Docker hub를 Registry로 비유하였다. Registry는 Docker hub 외에 다른 플랫폼도 있으며, 자체 구축도 가능하다.

Docker 기초

기본을 모두 다루는 것은 아니다. 그때 그때 필요한 것을 포스팅 할 것이고, 모든 그림이 잡혔을 때 정리하는 내용을 따로 작성하고자 한다.

이미지 다운로드

$ docker pull centos
$ docker pull ubuntu:bionic

위와 같은 명령어로 이미지를 다운받을 수 있다.

$ docker pull centos

centos 이미지를 다운받는다.

Using default tag: latest
latest: Pulling from library/centos
8a29a15cefae: Pull complete
Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

: 를 기준으로 이미지 이름과 태그로 구분되는데, 태그를 지정하지 않으면 기본값으로 lastest를 사용한다.

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              470671670cac        8 weeks ago         237MB

다운받은 이미지를 확인한다.

컨테이너 실행

$ docker run -it centos:latest bash
  • i : 사용자가 입출력이 가능하게 한다.
  • t : 가상 터미널 환경을 에뮬레이션한다.

centos:latest 이미지를 컨테이너에서 실행한다. → bash가 실행된다.

$ exit

(bash 터미널) 컨테이너를 종료한다.

$ docker ps -a

실행중 컨테이너 목록을 출력한다. 방금 종료한 컨테이너의 STATUS가 Exited 상태일 것이다. → CONTAINER_ID를 복사한다.

  • -a : 종료된 컨테이너도 출력한다.
$ docker restart d3fef9c0f9e9

복사한 CONTAINER_ID로 컨테이터를 재시작한다.

$ docker attach d3fef9c0f9e9

컨테이너 안으로 다시 접속한다.

$ exit

다시 빠져나온다(컨테이너 종료).

이미지 생성

$ docker pull ubuntu

이번에는 ubuntu 이미지를 다운받는다.

$ docker run -it centos:latest bash

ubuntu 이미지를 컨테이너에서 실행하여 터미널에 접속한다.

$ apt-get update

apt-get을 최신화하고

$ apt-get install -y git

git을 설치한다.

$ exit

컨테이너를 종료하고 빠져나온다.

$ docker commit caafb5add606 ubuntu:git

방금 종료한 컨테이너의 CONTAINER_ID를 가지고 ubuntu:git이라는 새로운 이미지를 생성한다.

컨테이너 & 이미지 삭제

$ docker rm caafb5add606

컨테이너 삭제

$ docker rmi ubuntu:git

이미지 삭제

Dockerfile

위의 과정을 Dockerfile이라는 형태로 작성하여, 한번에 컨테이너에 올릴 수 있다. Dockerfile만 있으면 다른 환경에서 동일한 서버 구성을 쉽게 구축할 수 있다.

FROM ubuntu:bionic
RUN apt-get update
RUN apt-get install -y git

Dockerfile 이라는 이름의 파일을 생성 후, 위와 같이 작성한다. FROM은 기반이 되는 BaseImage를 명시하고, RUN에서 명령어를 수행한다. 여기서는 apt-get을 최신화하고, git을 설치하는 내용이 작성되었다.

$ docker build -t ubuntu:git-from-dockerfile .

파일이 있는 디렉터리로 이동해서 위 명령어 수행 → 이미지 생성

$ docker build -t ubuntu:git-from-dockerfile -f ./docker-file-test .

만약 Dockerfile 이 아닌 별개의 파일명으로 작성했다면 위와 같이 -f 옵션을 준다.

<