[Docker] Docker 개념 정리 및 이미지 생성

김유진·2023년 3월 25일
0

결론부터 말하자면, 프로그램을 다운 받은 과정을 가장 간단하게 만들기 위해서 사용하기 위해서이다.
도커 없이 프로그램을 받을 때 어떻게 하더라?를 생각해보자

인스톨러 내려받기 => 인스톨러 실행하기 => 프로그램 설치 완료
이러한 순서대로 이루어진다.
그런데 갖고 있는 서버와 패키지 버전, 운영체제 등에 따라서 프로그램을 다운받는 과정에서 에러가 발생하고 설치 과정이 복잡해지기도 한다.

도커를 사용할때와 사용하지 않을 때의 차이를 한번 비교해보자. 이 비교는 redis를 다운받는 것의 차이점을 비교함으로부터 시작해보려고 한다.

다운받으려고 하다가 보니까 먼저 getw라는 것을 먼저 깔으란다..우우우 깔기도 전에 기가 다 빨렸다!
나는 redis만 받고 싶은데 getw과 같은 프로그램을 또 깔아야 하는 것이 생기고 에러도 많이 생기는 것이 문제이다. 그런데 redis를 설치하는 것을 docker를 사용하여 받는다면 쉽게 받을 수 있는 것이 바로 docker의 장점이다.

하지만 나는 docker를 깔고 나서 docker un -it redis 이렇게 명령어까지 입력한다면 다운로드와 실행까지 끝마칠 수 있도록 효율적으로 살 수 있는 것이다!

예상치 못한 에러 감소와 편리한 설치과정을 거칠 수 있다는 것이 docker의 장점이라고 정리할 수 있다.

그래서 도커가 뭔데?

그럼 도커가 어떤 일을 하는 친구인지 한번 정리해 보고자 한다.
도커는 컨테이너를 사용하여 응용프로그램을 더 쉽게 만들고, 배포하고 실행할 수 있도록 설계된 도구이며 컨테이너 기반의 오픈소스 가상화 플랫폼이다. 이렇게 정리하면 이해가 되지 않으니 단어 하나하나 풀어 정리해보고자 한다.

컨테이너


그림에 나와 있는 컨테이너처럼, 우리가 아는 컨테이너는 다양한 물건들을 넣고 배와 같은 운송수단에 담아 물건을 원하는 곳으로 이동시킬 수 있는 수단 중의 하나로 컨테이너를 인식하고 있다. 도커의 컨테이너도 이와 비슷한 원리와 의미를 가지고 있는데, 도커도 컨테이너 안에 다양한 프로그램, 실행 환경을 컨테이너로 추상화하고, 동일한 인터페이스를 제공하여 프로그램의 배포, 및 관리를 단순하게 해 준다. 물건을 손쉽게 이동해주는 컨테이너처럼 프로그램을 손쉽게 이동하고 배포할 수 있도록 도와주는데 특히 AWS, Google cloud등 어디에서든 실행할 수 있는 환경을 가지고 있다.

도커를 사용하는 큰 흐름

  1. 도커 Client에서 입력한 커멘드를 서버에게 전달한다.
  2. 도커 서버에서 대부분의 일을 처리한다. 서버는 커맨드를 받아서 그것에 따라 이미지를 생성하든, 컨테이너를 실행하든 작업을 하게 된다. 도커 사용 흐름에 대해 알아보기 위해서 도커에서 기본적으로 하는 Hello, World!를 수행해 보도록 하자.

자 그럼 docker는 그런거 몰라요~ 하면서 안내 문구가 좌라락 뜨게 되는데, 지금 내가 docker run hello-world라고 입력한 것은 도커 클라이언트에 커멘드를 입력한 것이고, 입력한 결과로 클라이언트에서 서버로 해당 이미지에 대한 요청을 보내게 된 것이다.

그럼 서버에서 hello-world 라는 이미지가 이미 로컬에 cache되어 있는지 확인합니다.
아직은 캐시된 것이 없기 때문에, Unable to find image 'hello-world:latest' locally 라는 안내 문구가 뜨는 것이다.
그러니, Docker Hub에 방문하여 이미지가 저장되어 있는 곳에서, 해당 이미지를 가져오고 로컬에 cache로 저장하면 된다.

즉 위의 명령어를 다시 한번 더 입력하게 되면, 캐시된 것을 가져와 아래와 같은 결과가 바로 뜨게 된다.

즉 입력받은 것이 없으면 이미지를 캐시 보관 장소에 저장하고, 도커 허브에서 이제 꺼내 쓸 수 있도록 하는 것이다. 캐시된 이미지를 이용하여 컨테이너를 만들고, 프로그램을 잘 실행하는 것이다.

이미지?

이미지 안에는 프로그램을 실행하는 데 필요한 모든 것이 포함되어 있다.

필요한 모든 것이란 무엇인가?

  • 컨테이너가 시작될 때 실행되는 명령어 ex) run kakakotalk
  • 파일 스냅샷 ex) 컨테이너에서 카카오톡을 실행하고 싶다면, 카카오톡 파일을 실행하는 데 필요한 파일

이 두가지가 이미지라고 이야기할수 있는 것이다.

이미지로 컨테이너를 만들기

  1. Docker 클라이언트에 docker run <이미지>를 입력해준다.
  2. 도커 이미지에 있는 파일 스냅샷을 컨테이너 하드 디스크에 옮겨준다.

결론적으로 이미지에서 가지고 있는 명령어를 이용하여 카카오톡을 실행하는 것이다.

도커 이미지 만들기

1. 도커 파일 작성 : 이미지를 만들기 위한 설정 파일, 컨테이너가 어떻게 행동해야 하는지를 정의한다.
2. 도커 클라이언트 전달 : 도커 파일에 작성된 명령들이 도커 클라이언트에 전달되어야 한다.
3. 도커 서버 : 도커 클라이언트에 전달된 모든 중요한 작업을 수행합니다.
4. 이미지 생성 완료

도커 파일 만들기

  1. 베이스 이미지를 명시해준다. (파일 스냅샷)
    보통 OS라고 생각해주면 된다.
  2. 추가적으로 필요한 파일을 다운 받기 위한 몇가지 명령어를 명시함(파일 스냅샷의 범위임)
  3. 컨테이너 시작 시, 실행될 명령어를 명시


FROM은 이미지 생성 시 기반이 되는 이미지 레이어이고, <이미지이름>:<태그> 형식으로 작성한다. 태그를 붙이지 않으면 자동적으로 최신 버전으로 다운된다.
RUN은 도커 이미지가 생성되기 전, 수행할 쉘 명령어를 입력할 수 있다.
마지막으로 CMD는 컨테이너가 시작될 때, 실행할 실행파일 또는 쉘 스크립트이고, 해당 명령어는 단 1 회만 작성할 수 있다.

이제, 베이스 이미지부터 실제 값으로 설정을 해보자.
ubuntu를 사용해도 되고, centos를 사용해도 되는데, 단순한 값을 출력할 때는 alpine만 써도 충분해서 그것을 베이스 이미지로 사용한다.

이제 만든 파일을, 도커 서버가 인식하게 만들어야 하기 때문에 docker build ./ 또는 docker build . 를 입력해보자.

alpine이미지를 가져오고, 임시 컨테이너를 생성해 줍니다. 그리고 컨테이너 시작 시 사용할 명령어를 포함시켜, 새로운 이미지로 완성을 한다.

즉 베이스 이미지에서 다른 종속성이나, 새로운 커맨드를 추가할 때에는 임시 컨테이너를 만든 이후, 그 컨테이너를 토대로 새로운 이미지를 만들어 준다. 그리고 이후 임시 컨테이너는 지워 주는 것이다.

만든 이미지를 실행해보자.


Hello가 정상적으로 출력됨을 알 수 있다!

0개의 댓글