Summary
Docker 이미지 생성은 다음과 같이 할 수 있습니다.(제가 모르는 방법이 있다면 댓글로 알려주시면 감사하겠습니다!)
1. pull을 이용하여 docker hub로부터 이미지 다운로드
// 이미지 pull
sudo docker pull {image_name:tag}
//해당 이미지 docker hub에 존재하는지 확인
sudo docker serarch {image_name:tag}
2. commit을 이용하여 생성된 컨테이너를 이미지화
이 과정에서 이미지화 하기 전 까지의 과정을 간단하게 설명하면 다음과 같습니다.
이미지 pull -> 이미지로 컨테이너 run(이때 베이스 이미지 없으면 자동으로 pull) -> 내부에 코드, 필요모듈 세팅
이후 아래와 같이 이미지화 할 수 있습니다.
// 컨테이너가 생성 되었다고 가정하고 해당 컨테이너 이용하여 이미지 생성
sudo docker commit {container_name} {new_image_name:tag}
3. Dockerfile을 이용한 이미지 빌드
위의 두 방법으로도 이미지를 생성할 수 있지만 Dockerfile이라는 것을 이용하여 이미지를 만드는 것도 가능합니다. 이번 포스팅에서는 이 Dockerfile을 이용한 이미지 빌드 방법에 대해 알아보겠습니다.
Dockerfile
Dockerfile 이란?
지금까지 도커 이미지를 다운받고, 그 다운받은 이미지를 바탕으로 컨테이너를 생성하고, 해당 컨테이너 내부에 필요한 코드, 모듈, 툴 등을 세팅하고 그것을 다시 이미지로 만드는 과정으로 진행하였습니다. 하지만 이런 과정을 배번 반복한다는 것은 효율적이지 않은 방법일 것입니다. 더군다나 혼자 작업하는 것이 아닌 여러 개발자가 작업 시에는 위와 같은 과정으로 진행할 시 실수가 발생할 가능성도 적지않게 있을 것으로 생각됩니다.
이러한 문제들을 간소화하기 위해 Dockerfile이라는 것이 존재합니다. Dockerfile이란 패키지, 소스코드, 명령어, 환경변수 등 필요한 것을 기록해놓은 파일입니다. 간단히 말하면 '이렇게 설치/설정 해줘' 라고 명시되어있는 설명서에 비유하면 좋을 것 같습니다.
Dockerfile 작성
Dockerfile 작성은 간단한 예제를 통해 알아보겠습니다.
FROM node:16-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 80
CMD [ "node", "app.js" ]
1. FROM : 생성할 이미지의 베이스 이미지를 지정해줍니다. 여기서는 node:16-alpine이 베이스 이미지 입니다.
2. WORKDIR : 명령어를 실행할 디렉토리입니다. 배시 셸의 cd 명령어와 같은 기능을 합니다.
3. COPY : Docker 외부의 파일을 복사하여 내부에 추가합니다. COPY . . 은 현재 디렉토리에 있는 것을 전부 복사하여 workdir로 추가하는 것을 의미합니다.
4. RUN : 이미지 빌드시 실행되는 명령어입니다.
5. EXPOSE : 이미지에서 노출할 포트를 설정합니다.
6. CMD : 컨테이너 생성 시 실행되는 명령어로, Dockerfile에서 한번만 사용할 수 있습니다.
💡 RUN/CMD/ENTRYPOINT 차이
1. RUN - 도커 파일로부터 도커 이미지를 빌드하는 순간 실행되는 명령어로 라이브러리 설치 부분에서 주로 활용됩니다.
2. CMD - 이미지로부터 컨테이너를 생성하여 최초로 실행할 때 실행되는 명령어입니다.
3. ENTRYPOINT - CMD와 동일하나 최초 실행시 꼭 실행되어야하는 명령어가 있을때 사용합니다. (CMD는 docker run 명령어 사용 시 변경 가능)
더 많은 내용이 있지만 추후에 Dockerfile 작성에 대한 정리를 다시 진행하겠습니다.
이 과정까지 끝나고 docker build를 하게 되면 이미지가 생성이 됩니다. 여기서 캐시를 비활성화 하려면 --no-cache를 추가하면됩니다.
sudo docker build --no-cache -t {image_name:tag} .
sudo docker images
docker-compose.yml
docker-compose.yml은 이렇게 생성된 다수의 컨테이너를 하나의 yml 파일로 통합하여 관리하기 위해 사용됩니다. docker-compose.yml 파일을 이용하면, 컨테이너를 쉽게 생성할 수 있습니다. 스프린트 간 사용했던 예제를 통해 간단하게 알아보겠습니다.
version: "3.0"
services:
frontend:
build: frontend
image: liveloperJay/client
ports:
- target: 80
published: 80
x-aws-protocol: http
depends_on:
- backend
backend:
build: backend
image: liveloperJay/server
ports:
- target: 3333
published: 3333
x-aws-protocol: http
저도 간단한 스프린트로 진행한 것이라 지금은 일단 target은 내부 포트, published는 바인딩 되어질 포트를 지정하는 것이며, x-aws-protocol은 ALB(Application Load Balancer)를 위한 리스너 정도라는 것만 이해했습니다. 추후에 기회가 되면 해당 부분에 대한 자세한 포스팅 진행하도록 하겠습니다.
위 과정이 모두 끝나면 아래의 두 명령을 실행해주면 빌드 및 컨테이너 생성이 완료됩니다.
//도커 이미지 빌드
sudo docker-compose build
//compose up
sudo docker-compose up
이 두 명령을 한꺼번에 실행하고 싶을때는 다음과 같이 작성해주면 됩니다. 또한 도커를 백그라운드로 실행하고 싶을 때는 -d 옵션을 사용합니다.
// 한꺼번에 실행
sudo docker-compose up --build
//compose up을 백그라운드 데몬으로 실행
sudo docker-compose up -d
이렇게 실행중인 컨테이너를 종료하고 싶으면 compose down을 해주시면 됩니다.
sudo docker-compose down
참고자료:
'DevOps 부트캠프 > Docker' 카테고리의 다른 글
Fastify서버 Docker 실행 시 접속 문제 (0) | 2022.03.31 |
---|---|
Docker란?_ 컨테이너와 Docker (0) | 2022.03.18 |
댓글