결론부터 말하자면, 프로그램을 다운 받은 과정을 가장 간단하게 만들기 위해서 사용하기 위해서이다.
도커 없이 프로그램을 받을 때 어떻게 하더라?를 생각해보자
인스톨러 내려받기 => 인스톨러 실행하기 => 프로그램 설치 완료
이러한 순서대로 이루어진다.
그런데 갖고 있는 서버와 패키지 버전, 운영체제 등에 따라서 프로그램을 다운받는 과정에서 에러가 발생하고 설치 과정이 복잡해지기도 한다.
도커를 사용할때와 사용하지 않을 때의 차이를 한번 비교해보자. 이 비교는 redis를 다운받는 것의 차이점을 비교함으로부터 시작해보려고 한다.
다운받으려고 하다가 보니까 먼저 getw라는 것을 먼저 깔으란다..우우우 깔기도 전에 기가 다 빨렸다!
나는 redis만 받고 싶은데 getw과 같은 프로그램을 또 깔아야 하는 것이 생기고 에러도 많이 생기는 것이 문제이다. 그런데 redis를 설치하는 것을 docker를 사용하여 받는다면 쉽게 받을 수 있는 것이 바로 docker의 장점이다.
하지만 나는 docker를 깔고 나서 docker un -it redis
이렇게 명령어까지 입력한다면 다운로드와 실행까지 끝마칠 수 있도록 효율적으로 살 수 있는 것이다!
예상치 못한 에러 감소와 편리한 설치과정을 거칠 수 있다는 것이 docker의 장점이라고 정리할 수 있다.
그럼 도커가 어떤 일을 하는 친구인지 한번 정리해 보고자 한다.
도커는 컨테이너를 사용하여 응용프로그램을 더 쉽게 만들고, 배포하고 실행할 수 있도록 설계된 도구이며 컨테이너 기반의 오픈소스 가상화 플랫폼이다. 이렇게 정리하면 이해가 되지 않으니 단어 하나하나 풀어 정리해보고자 한다.
그림에 나와 있는 컨테이너처럼, 우리가 아는 컨테이너는 다양한 물건들을 넣고 배와 같은 운송수단에 담아 물건을 원하는 곳으로 이동시킬 수 있는 수단 중의 하나로 컨테이너를 인식하고 있다. 도커의 컨테이너도 이와 비슷한 원리와 의미를 가지고 있는데, 도커도 컨테이너 안에 다양한 프로그램, 실행 환경을 컨테이너로 추상화하고, 동일한 인터페이스를 제공하여 프로그램의 배포, 및 관리를 단순하게 해 준다. 물건을 손쉽게 이동해주는 컨테이너처럼 프로그램을 손쉽게 이동하고 배포할 수 있도록 도와주는데 특히 AWS, Google cloud등 어디에서든 실행할 수 있는 환경을 가지고 있다.
Hello, World!
를 수행해 보도록 하자.자 그럼 docker는 그런거 몰라요~ 하면서 안내 문구가 좌라락 뜨게 되는데, 지금 내가 docker run hello-world
라고 입력한 것은 도커 클라이언트에 커멘드를 입력한 것이고, 입력한 결과로 클라이언트에서 서버로 해당 이미지에 대한 요청을 보내게 된 것이다.
그럼 서버에서 hello-world
라는 이미지가 이미 로컬에 cache되어 있는지 확인합니다.
아직은 캐시된 것이 없기 때문에, Unable to find image 'hello-world:latest' locally
라는 안내 문구가 뜨는 것이다.
그러니, Docker Hub에 방문하여 이미지가 저장되어 있는 곳에서, 해당 이미지를 가져오고 로컬에 cache로 저장하면 된다.
즉 위의 명령어를 다시 한번 더 입력하게 되면, 캐시된 것을 가져와 아래와 같은 결과가 바로 뜨게 된다.
즉 입력받은 것이 없으면 이미지를 캐시 보관 장소에 저장하고, 도커 허브에서 이제 꺼내 쓸 수 있도록 하는 것이다. 캐시된 이미지를 이용하여 컨테이너를 만들고, 프로그램을 잘 실행하는 것이다.
이미지 안에는 프로그램을 실행하는 데 필요한 모든 것이 포함되어 있다.
필요한 모든 것이란 무엇인가?
이 두가지가 이미지라고 이야기할수 있는 것이다.
docker run <이미지>
를 입력해준다.결론적으로 이미지에서 가지고 있는 명령어를 이용하여 카카오톡을 실행하는 것이다.
1. 도커 파일 작성 : 이미지를 만들기 위한 설정 파일, 컨테이너가 어떻게 행동해야 하는지를 정의한다.
2. 도커 클라이언트 전달 : 도커 파일에 작성된 명령들이 도커 클라이언트에 전달되어야 한다.
3. 도커 서버 : 도커 클라이언트에 전달된 모든 중요한 작업을 수행합니다.
4. 이미지 생성 완료
FROM
은 이미지 생성 시 기반이 되는 이미지 레이어이고, <이미지이름>:<태그>
형식으로 작성한다. 태그를 붙이지 않으면 자동적으로 최신 버전으로 다운된다.
RUN
은 도커 이미지가 생성되기 전, 수행할 쉘 명령어를 입력할 수 있다.
마지막으로 CMD
는 컨테이너가 시작될 때, 실행할 실행파일 또는 쉘 스크립트이고, 해당 명령어는 단 1 회만 작성할 수 있다.
이제, 베이스 이미지부터 실제 값으로 설정을 해보자.
ubuntu
를 사용해도 되고, centos
를 사용해도 되는데, 단순한 값을 출력할 때는 alpine
만 써도 충분해서 그것을 베이스 이미지로 사용한다.
이제 만든 파일을, 도커 서버가 인식하게 만들어야 하기 때문에 docker build ./
또는 docker build .
를 입력해보자.
alpine이미지를 가져오고, 임시 컨테이너를 생성해 줍니다. 그리고 컨테이너 시작 시 사용할 명령어를 포함시켜, 새로운 이미지로 완성을 한다.
즉 베이스 이미지에서 다른 종속성이나, 새로운 커맨드를 추가할 때에는 임시 컨테이너를 만든 이후, 그 컨테이너를 토대로 새로운 이미지를 만들어 준다. 그리고 이후 임시 컨테이너는 지워 주는 것이다.
Hello
가 정상적으로 출력됨을 알 수 있다!