실제 기업에서도 협업에 있어 Docker는 꽤나 중요한 역할을 한다.
OS에 구분 없이 단지 Container의 실행만으로 어플리케이션 구동이 가능하다.
즉, 가상화된 공간에 의해 이식성이 무한하다는 의미가 되겠다.

기존에는 이론적으로만 알고 있었지만, 이번 기회에 실제로 좀 적용을 해보려한다.

Docker의 기본

Docker는 기본적으로 설치한 뒤, zsh 환경에서 조작이 가능하다.
매우 편리한 점은 Docker Desktop을 통해 GUI 조작도 가능하다는 점이다.
하지만 나는 zsh 내에서 직접 명령어를 통해 조작하려 한다.

기본적으로 Docker의 구성은 imagecontainer이다.
누군가, 혹은 내가 구성한 image를 받아와 실행시키면 container가 되는 것이다.

Docker의 실제 적용

Dockerfile

실제로 프로젝트에서 image를 만드는 경우, Dockerfile이 사용된다.
아래의 사진이 그 예시이다.

스크린샷 2024-06-23 오후 3 26 38

실제로 만든 Springboot 프로젝트를 image화 하기 위해 명령어들을 적어 놓은 것이다.
docker build 명령어를 실행히면, 해당 명령어들이 수행되어 image가 build 된다.
명령어들에 대해 아래로 간단하게 알아보도록 하자.

  • FROM : 베이스 이미지를 지정하도록 한다.
    • 현재 내 프로젝트는 openjdk17을 베이스 이미지로 한다.
  • ARG : build 시 사용되는 매개변수를 의미한다.
    • 나는 image를 실행시키면, jarfile이 실행되어야 하므로, 해당 파일을 변수로 넣었다.
  • ADD / COPY : 이미지 생성 시 파일을 추가/복사하는 명령어이다.
    • 예를 들어, jarfile을 실행시키려하면 기본적으로 container 내에는 파일이 없다.
    • 따라서 ADD / COPY 명령어를 통해 파일을 생성해주어야 하는 것이다.
    • ADD 명령어는 COPY와 기본 동작은 같지만, 더 많은 기능을 지원한다.
      • 단순히 container내에 파일을 옮기려는 것이면 COPY를 사용하는게 좋다.
  • ENTRYPOINT, CMD : 컨테이너를 시작할 때 수행할 일련의 명령어를 지정한다.
    • jarfile의 실행 명령어는 java -jar ~~~.jar이므로, 사진과 같이 지정한다.
  • EXPOSE : 이미지가 실행될 때, 실행될 포트를 지정하는 명령어이다.
  • RUN : 이미지를 지정하면서 실행할 명령을 지정한다.
  • WORKDIR : 컨테이너 작업 디렉토리를 지정한다.
  • MAINTAINER, LABEL : 이미지의 작성자와 라벨을 명시하는 명령어이다.
  • ENV : 컨테이너의 환경 변수를 지정한다.
  • VOLUME : container의 볼륨을 지정한다.
  • USER : 컨테이너의 사용자를 지정한다.

Docker-compose

하지만, 실제로 서비스를 개발할 때에는 단순히 jarfile만 사용되는 것이 아니다.
DB나 어떤 Redis와 같은 부가적인 다양한 서비스들이 추가로 붙게 된다.
나의 경우에도 아래의 사진과 같이 DB가 없어 이미지가 실행되지 못했다.

스크린샷 2024-06-23 오후 3 38 50

즉, 성공적으로 서버를 돌리기 위해서는 부가적인 서비스들도 모두 컨테이너화 되어야 한다!
그럼 어떻게 한 번에 필요한 컨테이너들을 모두 실행시킬 수 있을까?
그럴 때 필요한 것이 바로 docker-compose.yml 파일이 되겠다.

아래는 내가 직접 SpringBoot 프로젝트에 작성한 docker-compose 파일이다.
아래의 사진에서 볼 수 있듯이, 여러개의 컨테이너를 동시에 실행시킬 수 있도록 이미지를 구성한다.

스크린샷 2024-06-24 오후 5 20 20

하지만 현재 제대로 인식을 하지 못하고 오류가 발생하고 있는데, 아래와 같이 해결하였다.
yml 파일을 작성할 때, 엔터 키를 입력하면 자동으로 인덴트가 들어가게 된다.
하지만 그대로 사용하면 위와 같은 오류가 발생함을 알 수 있었다.
조금 불편하지만, 오류를 발생시키지 않기 위해서 수동으로 인덴트를 조절해 주었다.

스크린샷 2024-06-24 오후 5 22 20

이후 해당 디렉토리 내에서 docker-compose build 명령을 수행해주었다.
아래와 같이 remindme-web 이라는 이미지가 하나 생성되었음을 확인할 수 있다.

스크린샷 2024-06-24 오후 5 23 40

이후 build된 파일을 실행시켜줄 docker-compose up 명령어를 실행시켰다.
하지만… 아래의 사진과 같이 정상적으로 실행이 되지 않았다.

스크린샷 2024-06-25 오후 8 23 34

내가 생각하기에는, dockermariadb의 데이터베이스 때문인 것 같다.
내 로컬 환경의 mariadb에는 당연히 내가 선언한 데이터베이스가 존재한다.
하지만 mariadb 이미지는 외부에서 받아왔기 때문에, 따로 데이터베이스가 정의되어 있지 않다.
그래서 직접 터미널에서 정의를 해주어야 할 것 같다.

스크린샷 2024-06-25 오후 8 30 42

위와 같이 mariadb image를 실행시킨 뒤, bash 명령어를 통해 접근할 수 있다.
mariadb -u root -p 명령어를 통해 mariadb 콘솔에 접근해서 조작해보도록 하자.