1. 도커의 인기?
스택오버플로우에서 조사한 결과, 2022년 Other tools 분야에서 도커가 가장 많이 사랑 받고 있는 것으로 뽑혔다.
게다가 도커를 사용하고자 하는 비중이 전년도 30%에서 37%로 높아졌다.
이를 통해 개발자들 사이에서 도커가 사랑 받고 있는 것을 알 수 있고, 앞으로도 인기가 계속될 것으로 보인다.
https://survey.stackoverflow.co/2022/#most-loved-dreaded-and-wanted-tools-tech-love-dread
Stack Overflow Developer Survey 2022
In May 2022 over 70,000 developers told us how they learn and level up, which tools they’re using, and what they want.
survey.stackoverflow.co
2. 도커란?
도커는 간단하게 말해, 소프트웨어를 컨테이너라는 단위로 패키징할 수 있는 툴이다.
컨테이너에는 코드, 런타임, 시스템 도구, 라이브러리, 환경설정 등 어플리케이션이 동작하기 위한 모든 것이 담겨있다.
이를 통해 다양한 컴퓨팅 환경에서도 언제나 동일하게 실행될 수 있는 안정성을 지닌다.
따라서 개발 환경에 구애받지 않고 빠른 개발과 배포가 가능하다는 장점이 있다.
3. 컨테이너와 가상머신 비교
가상머신은 하이퍼바이저(ex. VMware, VirtualBox)라는 플랫폼 위에 독립적으로 존재한다.
이 독립적인 가상머신에 OS를 설치하여 필요한 프로그램을 실행시킨다.
독립된 공간에 서로 다른 OS를 설치하여 사용할 수 있지만 OS를 포함해야하기 때문에 무겁다.
반면에 컨테이너는 프로세스를 격리(?)하는 방법으로 OS는 포함하지 않는다.
가상머신과 같이 독립적으로 실행되어 가상머신과 같이 사용할 수 있다.
OS를 포함하지 않기 때문에 컨테이너를 만드는 시간이 매우 짧고 가볍다.
4. 이미지
앞에서 설명한 컨테이너를 만들기 위해서는 이미지가 필요하다.
(나중에 보겠지만 이미지를 만들기 위해서는 Dockerfile이 필요하다. 줄줄이 사탕?)
이미지는 컨테이너 실행에 필요한 파일과 설정값들을 포함하고 있다.
마치 붕어빵(컨테이너)과 붕어빵틀(이미지)처럼 한 이미지에서 여러 컨테이너를 실행할 수 있다.
배포를 위해서는 이 이미지가 필요하며 DockerHub를 통해 공유, 배포할 수 있다.(마치 git과 github 같다.)
만들어놓은 이미지를 보기 위한 명령어는 `docker images` 이다.
5. 도커 설치 방법
도커 홈페이지에 들어가서 Docker Desktop을 다운 받아 설치한다.
(윈도우의 경우 WSL2가 필요한건지 함께 설치된다.)
https://www.docker.com/get-started/
Developers - Docker
Developer productivity tools and a local Kubernetes environment.
www.docker.com
6. 도커 간단 사용법(실습)
node로 간단한 서버를 만들어서 도커 이미지로 만든 후 배포까지 해보자.
1. 컨테이너로 만들 소스코드를 작성한다.
- 터미널에 `npm init -y` 를 입력하여 node 개발 환경을 만든다.
- 터미널에 `npm install express` 를 입력하여 express를 설치한다.
- index.js 파일을 생성하여 http 요청이 들어오면 "Hello Docker!" 를 응답하는 서버를 만든다.
// index.js
const express = require("express");
const app = express();
app.get("/", (_, res) => res.send("Hello Docker!"));
app.listen(80);
2. 컨테이너로 만들 디렉토리에 Dockerfile을 작성한다.
FROM node:18-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY index.js ./
ENTRYPOINT [ "node", "index" ]
https://docs.docker.com/engine/reference/builder/
Dockerfile reference
docs.docker.com
3. Dockerfile을 통해 이미지를 만든다.(build)
docker build -t test-docker .
확인하려면 docker images 명령어를 통해 이미지 확인
4. 이미지를 통해 컨테이너를 만든다.(run)
docker run -d -p 80:80 test-docker
확인하려면 docker ps 명령어를 통해 실행중인 컨테이너 확인 및 curl 127.0.0.1로 응답이 오는지 확인
5. 도커허브에 가입 후 "test"라는 레포지토리를 만든다.
Docker Hub Container Image Library | App Containerization
We and third parties use cookies or similar technologies ("Cookies") as described below to collect and process personal data, such as your IP address or browser information. You can learn more about how this site uses Cookies by reading our privacy policy
hub.docker.com
6. 이미지 이름을 "[도커허브 아이디]/test" 로 바꾼다.
docker tag test-docker:latest [도커허브 아이디]/test:latest
7. 도커 로그인한 뒤 푸쉬한다.
docker login (이후에 아이디와 비밀번호 입력)
docker push [도커허브 아이디]/test:latest
확인하려면 도커허브 사이트에 들어가본다.
7. 배포 방법
- ec2: docker설치 -> docker login -> docker pull [도커허브 아이디]/test:latest -> 웹브라우저에서 퍼블릭 IP로 접속하여 "Hello Docker!" 가 잘 나오는지 확인
우분투에 도커 설치 방법
https://docs.docker.com/engine/install/ubuntu/
Install Docker Engine on Ubuntu
docs.docker.com
- ecs??
8. 더 공부하기!
- node + nginx 로 클러스터, 로드밸런싱 이용하기
http://labs.brandi.co.kr/2018/05/25/kangww.html
Docker, NodeJS, Nginx! 너로 정했다!
편집자 주아래와 같이 용어를 표기하기로 저자와 협의함Docker, NodeJS, Nginx
labs.brandi.co.kr
- pm2
https://engineering.linecorp.com/ko/blog/pm2-nodejs
PM2를 활용한 Node.js 무중단 서비스하기
2022-LINE-engineering-site
engineering.linecorp.com
9. 삽질을 통해 알아낸 좋은 정보들
- sudo docker exec -it [컨테이너] [쉘]
- docker commit -a [저자] -m [메시지] [컨테이너] [레포지토리:태그]
- 깃헙 액션으로 자동화하려면 Dockerfile 안에 build 작업을 꼭 넣어줄 것! 안 그러면 docker build할 때 build파일이 없다...
- 한 컨테이너에서는 한 프로세스?만
- 여러 컨테이너를 쉽게 다루기 위해서는 docker-compose 사용!
- docker-compose를 사용하려면 ec2에 미리 준비할 것... -> docker 설치, docker-compose 설치, docker-compose.yml파일, (.env 파일)
- docker desktop 안 쓸 때는 꺼두기! vmmem?이 메모리를 너무 많이 잡아먹는다...ㅠㅠ
10. 참고
Dockerfile 에서 RUN CMD ENTRYPOINT 차이
- RUN은 build 단계에서 실행됨
- CMD는 run 단계에서 실행되며 덮어쓰기 가능함
- ENTRYPOINT는 CMD랑 같으나 덮어쓰기 불가능
https://seokhyun2.tistory.com/61
[Docker] RUN, CMD, ENTRYPOINT 차이점
도커파일 작성 시에, 사용할 수 있는 명령어 중에 실행하는 것과 관련된 명령어는 RUN, CMD, ENTRYPOINT 세 가지가 있습니다. 세 명령어에 대한 차이점을 예시와 함께 확인해보도록 하겠습니다. 1. RUN
seokhyun2.tistory.com