Docker의 정의 및 필요한 이유
Docker는 리눅스 운영체제의 기술인데 쉽게 말해 어플리케이션을 패키징하는 툴이다. 예를 들어 로컬에서 돌아가는 애플리케이션이 내가 배포하려는 서버나 다른 곳에서는 여러가지의 이유로 안 돌아갈 수 있다. 그 이유 중에는 애플리케이션이 구동되는 환경이 각각 달라서 그럴 수 있다. Docker는 이 문제를 해결할 수 있는데 로컬에서 돌아가는 환경을 Dockerfile이라는 곳에 저장해두고 파일을 container에 올려 로컬 환경과 동일하게 사용할 수 있게 해준다. 내가 만든 이미지는 Registry(ex. DockerHub)에 저장해 두었다가 필요 시 다운 받아 사용할 수 있다
Docker를 이용하기 위해서는 크게
1. Dockerfile 생성
2. 이미지 생성(빌드)
3. 생성된 이미지를 컨테이너로 구동
Dockerfile 은 쉽게 말해 애플리케이션 설명서라고 생각하면 된다. Dockerfile에는 크게
- 어플리케이션을 구동하기 위해 필요한 파일
- 외부 라이브러리
- 환경 설정
- 구동방식
등을 포함한다
Dockerfile은 커스터마이징 할 수 있는데 이 Dockerfile을 이용해 수많은 이미지를 만들 수 있고 각각의 이미지는 컨테이너라는 독립적인 환경에서 운영체제를 공유하며 해당 애플리케이션을 구동할 수 있게 해주는데 이것이 가상화를 이용하는 VMWARE와의 차이점이다
Container vs VMWARE
기존의 VMWARE는 각각의 애플리케이션을 구동시키기위해 운영체제를 개별로 포함했다. 즉 컴퓨터 위에 여러 개의 다른 컴퓨터가 있는 것인데 굉장히 구동을 무겁게 만들고 비효율적이었다. 반면 Docker는 운영체제를 따로따로 생성해서 만드는 것이 아닌 앞서 말했듯이 운영체제를 공유하여 애플리케이션을 실행한다
그림에서 볼 수 있듯이 이미 만들어져있는 수많은 이미지들을 docker hub 에서 다운 받고 다운 받은 이미지로 container를 구동할 수 있다. 쉽게 말해 이미지는 클래스, 컨테이너는 인스턴스라고 이해하면 좋을 꺼 같다
예를 들어 docker hub 에 들어간 후 httpd 를 검색한 후 docker pull httpd(이미지명)을 명령 프롬프트 에 치면 다운로드가 완료된다 이 이미지를 통해 컨테이너를 구동할 수 있다. 즉 이미지는 원래 존재하던 이미지를 사용하거나 내가 이미지를 Dockerfile을 통해 직접 만들 수 도 있다
Dockerfile 생성
Dockerfile은 이런 식으로 구성되어 있는데 node.js를 이용한 실습이었기에 FROM 명령어에 node js 버전을 명시해준다. 여기서 16은 node.js 버전, alpine은 리눅스의 아주 작은 최소 단위를 말한다
FROM : baseImage 지정, Dockerfile을 만들 때는 기본으로 가지고 가는 이미지가 필요하며 이를 설정하는 명령어이다
WORKDIR : 컨테이너가 실행될 시점의 디렉토리, 애플리케이션을 담아놓을 디렉토리를 의미한다
COPY : WORKDIR에 복사할 파일을 명시함
* 이미지는 layer 형태로 되어있기에 빈번히 바뀌는 파일은 나중에 작성하는 것이 좋아 index.js의 copy가 뒤에 있다
RUN : 빌드가 될 시점에 실행되는 명령어,
npm install : 버전을 자동으로 갱신하며 package-lock json에 있는 모든 라이브러리들을 설치한다
npm ci : 애플리케이션을 만들 당시의 버전을 그대로 사용할 수 있음
ENTRYPOINT : 컨테이너가 구동될 때 실행되는 명령어. 여기서는 index.js를 실행하라는 의미이다
Docker 이미지 생성
docker build 명령어를 통해 이미지를 생성한다
-f 명령어는 Dockerfile을 가리킨다
-t 명령어는 이미지의 이름을 지정할 수 있다
명령어가 순차적으로 하나씩 진행되는 것을 볼 수 있다.
그러면 이런식으로 fun-docker 라는 이름으로 이미지가 생성된 것을 볼 수 있다
이제 이 이미지로 컨테이너를 구동해보겠다
Docker 컨테이너 구동하기
node.js 어플리케이션이기 때문에 background 에서 계속 동작해야 하는데 이 명령어를 수행하면 terminal이 따로 수행이 가능하다
-p 명령어는 호스트의 포트와 컨테이너의 포트를 지정해서 연결해준다
각각의 컨테이너는 개별적인 환경에서 동작하고 있다
그럼 이렇게 컨테이너가 구동되어 8080포트로 연결되어 index.js가 뜬것을 볼 수 있다
만든 이미지 Registry에 올리기
dockerhub에 들어가서 로그인 후 create repository를 누른다
repository에 올리기 위해서는 아이디/도커 리포지토리 이름 순으로 image 이름이 되어야 한다
그래서 다시 터미널로 돌아와서 이런 식으로 이름을 변경할 수 있다
그러면 이런 식으로 동일한 이미지가 2개의 이름으로 되어있는 것을 볼 수 있다
푸시하기 전에는 로그인을 해야하는데
이렇게 명령어를 치고 로그인하면 된다(근데 나는 왜 비밀번호가 안 쳐지는 걸까....)
이런 식으로 명령어를 치면 dockerhub에 업로드 된다
이미지가 올라간 것을 확인할 수 있다
출처 및 참고
https://www.youtube.com/watch?v=EbTJtanJUfE&list=PLuHgQVnccGMDeMJsGq2O-55Ymtx0IdKWf&index=3
https://www.youtube.com/watch?v=LXJhA3VWXFA&list=PLX3z4NU88yGhuJdfLGA67NxdWodiY6nzD&index=4