최근 만들던 서비스를 배포하기 위해 도커를 사용하는 것을 연습하고 있습니다.
Home
Docker Documentation is the official Docker library of resources, manuals, and guides to help you containerize applications.
docs.docker.com
도커 어플리케이션을 다운 받고 내가 만든 Node 프로젝트 안에 'Dockerfile' 이라는 파일을 하나 만들어줍시다.
Dockerfile
FROM | 베이스 이미지를 통해 사용할 언어, 환경, 버전을 설정합니다. |
WORKDIR | 컨테이너 내부 작업 디렉토리를 지정합니다. |
COPY | 호스트 파일을 컨테이너 내부로 복사합니다. |
RUN | 이미지를 빌드할 때 실행될 명령을 정의합니다. |
CMD | 컨테이너가 시작될 때 실행할 명령을 정의합니다. (하나의 도커파일에서는 마지막 명령어만 실행됩니다) |
Dockerfile은 순차적으로 도커 이미지를 빌드하고 실행합니다.
도커는 캐시가 있어 변동된 레이어부터 다시 빌드하고 컨테이너를
실행하기 때문에 변동사항이 높은 부분을 마지막 레이어에 놓는 것이 효율적입니다.
FROM node:21
WORKDIR /app
COPY package*.json .
RUN npm install
COPY ./index.js .
CMD ["node", "index.js"]
다음 노드 프로젝트 도커파일을 보면 이해하기 쉽습니다.
비교적 의존성파일보다는 소스코드가 변동사항이 많기에 높은 레이어에 둡니다.
docker build .
위 명령어를 통해 Dockerfile이 있는 디렉토리에 이미지를 빌드합니다.
docker image list
docker images
위 명령어를 통해 빌드 or pull 해온 이미지들을 확인할 수 있습니다.
docker run image_name
위 명령어를 통해 우리가 만든 이미지를 실행시킬 수 있습니다.
docker ps
위 명령어를 통해 실행되고 있는 컨테이너들을 확인할 수 있습니다.
docker run -p 8080:8080 image_name
-p 옵션을 통해 호스트 환경과 도커환경 포트포워딩을 할 수 있습니다.
docker run -v <호스트 경로>:<컨테이너 경로> image_name
docker run -v /host/data:/container/data image_name
-v 옵션을 통해 호스트 환경과 도커환경에 볼륨 마운트를 통해 컨테이너가 종료되어도 파일을 저장할 수 있게 됩니다.
docker run -e "PASSWORD=password" mysql
-e 옵션을 통해 환경변수를 넘겨줄 수도 있습니다.
docker stop container_id
docker rm container_id
위 명령어를 통해 실행되고 있는 컨테이너를 중지 및 삭제 할 수 있습니다.
docker exec -it container_id /bin/bash
위 명령어를 통해 실행되고 있는 쉘에 접근이 가능합니다.
결론
도커를 사용하며 배포하는 것이 엄청 간단해지는 것을 느낍니다.
하지만 도커 환경이 복잡해지고 여러 컨테이너를 쓰게된다면 CLI가 자동적으로 길어지기 마련이죠
다음에는 docker-compose.yml을 통해 여러 컨테이너를 동시에 빌드하고 의존성을 주입하여
도커 환경 간에 연결하여 실행하는 예제로 만나뵙겠습니다.