2024. 9. 22. 16:58ㆍ개발
회사 내에서 도커를 사용하게 되어 간략하게 기본적인 개념과 활용에 대해 알아보고자 한다.
간략하게 설명하면, 도커(Docker)란 소프트웨어를 격리된 환경에서 실행할 수 있게 해주는 플랫폼이다. 여기서 격리된 환경을 컨테이너(Container)라고 정의하며 컨테이너를 만들기 위해 템플릿 형태의 이미지(Image)를 활용한다. 격리된 환경을 만들면 일관적인 환경을 구성할 수 있기에 "내 컴퓨터에선 잘되던데" 문제를 해결할 수 있다.
도커는 공식 홈페이지에서 다운로드할 수 있으며 각자의 운영체제에 맞춰 다운로드하면 된다. 도커 설치가 완료되면 아래 명령어를 입력했을 때 오류가 발생하지 않아야 한다.
docker images
Docker: Accelerated Container Application Development
Docker is a platform designed to help developers build, share, and run container applications. We handle the tedious setup, so you can focus on the code.
www.docker.com
로컬 환경에서 활용하기
당신이 프론트엔드 개발자라면 백엔드가 개발한 API를 도커를 통해 로컬에서 컨테이너를 실행하여 테스트할 수 있다. 테스트 이전에 준비되어야 할 내용이 몇 가지 있는데, 이는 아래와 같다.
- 당연하게도 도커를 설치해야 한다. 도커 설치가 되어있지 않다면 앞의 도커 홈페이지에서 다운로드하도록 하자.
- 백엔드 도커 이미지가 존재해야 한다. 이를 위해 도커 허브(Docker Hub)와 같은 곳에 업로드 된 이미지를 불러와 활용할 수 있다.
도커 허브에 백엔드 도커 이미지가 업로드되어 있다는 가정 하에 이미지를 `docker pull` 명령어를 통해 받아올 수 있다. 자세한 옵션에 대한 내용은 공식 문서를 통해 확인할 수 있다.
docker image pull [OPTIONS] NAME[:TAG|@DIGEST]
# 약식
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
# 예시: httpd
docker pull httpd
도커 이미지가 정상적으로 다운로드되었으면 `docker images` 명령어를 입력했을 때, 다운로드 한 도커 이미지를 확인할 수 있다. 이제 도커 이미지를 활용하여 컨테이너를 실행해 보자. 컨테이너 실행 명령어는 `docker run` 이다. 자세한 내용은 역시 공식 문서를 통해 확인할 수 있다.
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
다양한 옵션이 존재하지만 몇 가지 주요 옵션에 대해서만 간단히 정리해보도록 하자. 아마 당신이 도커를 처음 활용한다면 다음 옵션들은 바로 활용할 일이 생길 것이라 생각된다.
- `-d` 컨테이너를 백그라운드에서 실행할 수 있다.
- `-it` 터미널 입력을 컨테이너로 전달할 수 있다. `-i` 와 `-t` 옵션으로 분리할 수 있지만 주로 같이 쓰인다.
- `--name` 컨테이너 이름을 설정할 수 있다.
- `-e` 환경변수를 설정할 수 있다. `Dockerfile` 의 `ENV` 설정을 덮어쓴다.
- `-p` 호스트와 컨테이너의 단일 혹은 포트 범위를 매핑한다.
- `--platform` 컨테이너를 실행할 때, 운영체제(OS) 혹은 아키텍처를 지정하여 실행한다.
적절한 옵션을 활용하여 명령어를 실행했으면 `docker ps` 명령어를 실행했을 때, 실행 중인 컨테이너를 확인할 수 있을 것이다.
도커 허브에 업로드 하기
앞서 도커 허브를 언급했는데, 간단히 말해 도커 이미지를 저장하고 공유하는 플랫폼이다. 이를 활용하여 공개 혹은 비공개 형태로 클라우드 환경에서 도커 이미지를 공유할 수 있고 원활한 협업을 진행할 수 있다. 이번엔 도커 허브에 이미지를 업로드하는 방법을 알아보자.
우선 도커 이미지를 업로드하기 위해 도커 이미지를 빌드해야 한다. 보통 도커 이미지 빌드는 `Dockerfile` 을 생성하여 빌드 프로세스를 정의하고 이를 활용하여 실행한다. 아래는 `vite` 기반 리액트 애플리케이션 기준 `Dockerfile` 의 간단한 예시다.
# 가져올 이미지를 정의
FROM node:18
# 경로 설정하기
WORKDIR /app
# package.json 워킹 디렉토리에 복사 (.은 설정한 워킹 디렉토리를 뜻함)
COPY package*.json ./
# 명령어 실행 (의존성 설치)
RUN npm install
# 현재 디렉토리의 모든 파일을 도커 컨테이너의 워킹 디렉토리에 복사한다.
COPY . .
# 환경변수 설정
ENV KEY=VALUE
# 5173 포트 노출
EXPOSE 5173
# npm start 스크립트 실행
CMD ["npm", "run", "dev", "--", "--host"]
이외 `vite` 에서 필요한 추가적인 설정은 생략한다. 이렇게 `Dockerfile` 추가가 완료되었다면, `docker build` 명령어를 통해 도커 이미지를 빌드한다.
docker buildx build [OPTIONS] PATH | URL | -
# 약식
docker build
도커 이미지 빌드가 완료되었다면 앞의 `docker images` 명령어를 통해 빌드된 도커 이미지를 확인할 수 있다. 마찬가지로 도커 이미지 빌드 시에도 여러 옵션을 사용하여 이미지 이름, 플랫폼 등을 사전 설정할 수 있다.
이제 생성된 이미지를 `docker image push` 명령어를 통해 도커 허브에 업로드해 보자. 그전에 도커 허브에 레포지토리를 생성하여 도커 이미지를 업로드할 공간을 만든다.
깃허브의 레포지토리 생성 화면이 생각나는 장면이다. 친절하게도 옆에 이미지를 `push` 하는 방법을 자세히 설명하고 있다. 기존에 만든 이미지에 `docker tag` 명령어를 통해 이름과 태그를 부여하여 업로드할 수 있다고 한다.
docker image tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
# 약식
docker tag
docker image push [OPTIONS] NAME[:TAG]
# 약식
docker push
아마 `docker push` 명령어를 입력하면 권한 오류가 발생할 것이다. 깃허브에 업로드하기 위해 깃허브 로그인을 해야 하는 것처럼 당연하게도 도커 허브에 로그인해야 한다. 도커 허브 계정이 있다는 가정 하에 `docker login` 명령어를 통해 로그인을 할 수 있다.
docker login [OPTIONS] [SERVER]
로그인하는 과정에서 비밀번호를 입력해야 하는데 Personal Access Token을 활용하면 된다. 일종의 인증을 위한 토큰이라고 생각하면 된다.
해당 토큰은 My Profile - Edit Profile를 통해 Settings 페이지로 접근할 수 있는데, 해당 페이지 Security 섹션에서 이를 생성할 수 있다. 권한은 Read, Write, Delete를 부여하여 활용하자.
토큰이 생성되면 도커 허브 로그인을 할 수 있는 명령어와 토큰을 제공한다. 다음은 너무나도 간단하다 해당 명령어를 입력하고 패스워드를 입력하는 단계에서 토큰을 복사 붙여 넣기 해주면 된다.
로그인을 완료했다면 `docker push` 명령어가 정상적으로 동작할 것이다. 예시로 `push-example` 이라는 레포지토리를 생성했고 `0.0.1` 태그를 붙여 업로드를 진행했다. 아래와 같은 화면을 마주했으면 성공적으로 업로드된 것이다.
마치며
업무를 진행하면서 기본적으로 활용하는 도커 명령어와 도커 허브 활용 방법 등을 알아봤다. 처음엔 도커 개념도 몰랐기에 활용에 앞서 막막하기만 했는데 볼수록 깃과 유사해 익숙하다는 느낌을 어느 정도 받은 것 같다. 현재는 도커 이미지 빌드를 수동으로 진행하고 이를 업로드하는 과정을 거치고 있는데, 이제 GitHub Actions를 활용하여 특정 분기에 빌드한 이미지를 업로드하도록 만들어 봐야겠다.
'개발' 카테고리의 다른 글
FSD(Feature-Sliced Design) 개념 정리 및 Next.js 적용 (1) | 2024.10.05 |
---|