본문으로 바로 가기

Docker on Linux/macOS

본 가이드에서는 Linux(또는 macOS) 환경에서 Docker를 사용해 MyEMS를 배포하는 방법을 설명합니다.

선행 조건

  • 호스트에 docker와 npm이 설치되어 있어야 합니다.
  • MySQL 서버가 설치되어 있어야 합니다.
  • Docker Engine이 실행 중인 호스트에서 MySQL 데이터베이스에 접근할 수 있어야 합니다.
  • 하드웨어 요구사항: 최소 4GB RAM, 20GB 저장 공간 (데이터베이스 및 Docker 컨테이너용).

소스 코드 클론:

cd ~
git clone https://github.com/myems/myems

1단계: 데이터베이스

데이터베이스 문서를 참조하십시오.

2단계: myems-api

이 섹션에서는 Docker에 myems-api를 설치합니다.

  • 소스 코드를 루트 디렉토리에 복사
cp -r myems/myems-api /
cd /myems-api
  • example.env 파일을 기반으로 .env 파일 생성
주의

수동으로 127.0.0.1을 실제 호스트(HOST) IP 주소로 교체하십시오.

cp example.env .env
  • 소스 코드로부터 이미지 빌드
docker build -t myems/myems-api .

빌드를 실행하는 사용자의 아키텍처 및 운영 체제가 아닌 여러 플랫폼을 대상으로 빌드하려면, buildx를 사용하고 --platform 플래그를 설정하여 빌드 출력의 대상 플랫폼을 지정할 수 있습니다 (예: linux/amd64, linux/arm64, darwin/amd64).

docker buildx build --platform=linux/amd64 -t myems/myems-api .
  • Docker 컨테이너 실행

호스트에서 공유 업로드 파일 폴더 생성:

mkdir /myems-upload

컨테이너를 생성하고, 공유 폴더를 컨테이너에 바인드 마운트하며, .env 파일도 컨테이너에 바인드 마운트:

docker run -d -p 8000:8000 -v /myems-upload:/var/www/myems-admin/upload -v /myems-api/.env:/app/.env:ro --log-opt max-size=1m --log-opt max-file=2 --restart always --name myems-api myems/myems-api
  • -d: 컨테이너를 백그라운드에서 실행하고 컨테이너 ID를 출력합니다.

  • -p: 컨테이너의 포트를 호스트에 공개합니다. 8000:8000 (호스트:컨테이너)는 컨테이너의 8000 포트(오른쪽)를 호스트 머신의 TCP 8000 포트(왼쪽)에 바인드합니다.

  • -v: -v 또는 --volume을 사용하여 Docker 호스트에 아직 존재하지 않는 파일 또는 디렉토리를 바인드 마운트하면, -v가 해당 엔드포인트를 자동으로 생성합니다 (항상 디렉토리로 생성됩니다). ro 옵션이 있으면 바인드 마운트가 컨테이너에 읽기 전용으로 마운트됩니다. v4.7.0 이전 버전의 경우 /app/.env 대신 '/code/.env'를 사용하십시오.

  • --log-opt max-size=2m: 로그가 롤링되기 전의 최대 크기입니다. 양의 정수에 단위를 나타내는 수식어(k, m, g)를 붙입니다.

  • --log-opt max-file=2: 존재할 수 있는 최대 로그 파일 수입니다. 로그 롤링으로 인해 파일이 너무 많아지면 가장 오래된 파일이 삭제됩니다. 양의 정수 값을 사용합니다.

  • --restart: 컨테이너가 종료될 때 적용할 재시작 정책입니다.

  • --name: 컨테이너에 이름을 할당합니다.

콜론 앞의 절대 경로는 호스트의 경로이며 시스템에 따라 다를 수 있습니다. 콜론 뒤의 절대 경로는 컨테이너 내의 경로이며 변경할 수 없습니다. .env 파일을 바인드 마운트 파라미터로 전달하면 나중에 구성 값을 변경할 수 있습니다. .env 파일을 변경한 경우 변경 내용을 적용하려면 컨테이너를 재시작해야 합니다.

이미지를 다른 컴퓨터로 이전하려면,

  • 이미지를 tar 파일로 내보내기
docker save --output myems-api.tar myems/myems-api
  • tar 파일을 다른 컴퓨터에 복사한 후 tar 파일에서 이미지 로드
docker load --input .\myems-api.tar

3단계: myems-admin

이 섹션에서는 Docker에 myems-admin을 설치합니다.

  • 소스 코드를 루트 디렉토리에 복사
cp -r myems/myems-admin /
cd /myems-admin
주의

nginx.conf 파일 내의 127.0.0.1:8000을 myems-api의 실제 호스트(HOST) IP 주소와 포트로 수동으로 교체하십시오.

nano nginx.conf
      proxy_pass http://127.0.0.1:8000/;
  • 소스 코드로부터 이미지 빌드
docker build -t myems/myems-admin .

빌드를 실행하는 사용자의 아키텍처 및 운영 체제가 아닌 여러 플랫폼을 대상으로 빌드하려면, buildx를 사용하고 --platform 플래그를 설정하여 빌드 출력의 대상 플랫폼을 지정할 수 있습니다 (예: linux/amd64, linux/arm64, darwin/amd64).

docker buildx build --platform=linux/amd64 -t myems/myems-admin .
  • Docker 컨테이너 실행

호스트에서 공유 업로드 파일 폴더 생성:

mkdir /myems-upload

컨테이너를 생성하고, 공유 업로드 파일 폴더를 컨테이너에 바인드 마운트하며 nginx.conf도 바인드 마운트:

docker run -d -p 8001:8001 -v /myems-upload:/var/www/myems-admin/upload -v /myems-admin/nginx.conf:/etc/nginx/nginx.conf:ro --log-opt max-size=1m --log-opt max-file=2 --restart always --name myems-admin myems/myems-admin
  • -d: 컨테이너를 백그라운드에서 실행하고 컨테이너 ID를 출력합니다.

  • -p: 컨테이너의 포트를 호스트에 공개합니다. 8001:8001 (호스트:컨테이너)는 컨테이너의 8001 포트(오른쪽)를 호스트 머신의 TCP 8001 포트(왼쪽)에 바인드합니다.

  • -v: -v 또는 --volume을 사용하여 Docker 호스트에 아직 존재하지 않는 파일 또는 디렉토리를 바인드 마운트하면, -v가 해당 엔드포인트를 자동으로 생성합니다 (항상 디렉토리로 생성됩니다). ro 옵션이 있으면 바인드 마운트가 컨테이너에 읽기 전용으로 마운트됩니다. v4.7.0 이전 버전의 경우 /app/.env 대신 '/code/.env'를 사용하십시오.

  • --log-opt max-size=2m: 로그가 롤링되기 전의 최대 크기입니다. 양의 정수에 단위를 나타내는 수식어(k, m, g)를 붙입니다.

  • --log-opt max-file=2: 존재할 수 있는 최대 로그 파일 수입니다. 로그 롤링으로 인해 파일이 너무 많아지면 가장 오래된 파일이 삭제됩니다. 양의 정수 값을 사용합니다.

  • --restart: 컨테이너가 종료될 때 적용할 재시작 정책입니다.

  • --name: 컨테이너에 이름을 할당합니다.

이미지를 다른 컴퓨터로 이전하려면,

  • 이미지를 tar 파일로 내보내기
docker save --output myems-admin.tar myems/myems-admin
  • tar 파일을 다른 컴퓨터에 복사한 후 tar 파일에서 이미지 로드
docker load --input .\myems-admin.tar

4단계: myems-modbus-tcp

이 섹션에서는 Docker에 myems-modbus-tcp를 설치합니다.

  • 소스 코드를 루트 디렉토리에 복사
cp -r myems/myems-modbus-tcp /
cd /myems-modbus-tcp
  • example.env 파일을 기반으로 .env 파일 생성
주의

수동으로 127.0.0.1을 실제 호스트(HOST) IP 주소로 교체하십시오.

cp example.env .env
  • 소스 코드로부터 이미지 빌드
docker build -t myems/myems-modbus-tcp .

빌드를 실행하는 사용자의 아키텍처 및 운영 체제가 아닌 여러 플랫폼을 대상으로 빌드하려면, buildx를 사용하고 --platform 플래그를 설정하여 빌드 출력의 대상 플랫폼을 지정할 수 있습니다 (예: linux/amd64, linux/arm64, darwin/amd64).

docker buildx build --platform=linux/amd64 -t myems/myems-modbus-tcp .
  • Docker 컨테이너 실행 (슈퍼유저로 실행)
docker run -d -v /myems-modbus-tcp/.env:/app/.env:ro --log-opt max-size=1m --log-opt max-file=2 --restart always --name myems-modbus-tcp myems/myems-modbus-tcp
  • -d: 컨테이너를 백그라운드에서 실행하고 컨테이너 ID를 출력합니다.

  • -v: -v 또는 --volume을 사용하여 Docker 호스트에 아직 존재하지 않는 파일 또는 디렉토리를 바인드 마운트하면, -v가 해당 엔드포인트를 자동으로 생성합니다 (항상 디렉토리로 생성됩니다). ro 옵션이 있으면 바인드 마운트가 컨테이너에 읽기 전용으로 마운트됩니다. v4.7.0 이전 버전의 경우 /app/.env 대신 '/code/.env'를 사용하십시오.

  • --log-opt max-size=2m: 로그가 롤링되기 전의 최대 크기입니다. 양의 정수에 단위를 나타내는 수식어(k, m, g)를 붙입니다.

  • --log-opt max-file=2: 존재할 수 있는 최대 로그 파일 수입니다. 로그 롤링으로 인해 파일이 너무 많아지면 가장 오래된 파일이 삭제됩니다. 양의 정수 값을 사용합니다.

  • --restart: 컨테이너가 종료될 때 적용할 재시작 정책입니다.

  • --name: 컨테이너에 이름을 할당합니다.

콜론 앞의 절대 경로는 호스트의 경로이며 시스템에 따라 다를 수 있습니다. 콜론 뒤의 절대 경로는 컨테이너 내의 경로이며 변경할 수 없습니다. .env 파일을 바인드 마운트 파라미터로 전달하면 나중에 구성 값을 변경할 수 있습니다. .env 파일을 변경한 경우 변경 내용을 적용하려면 컨테이너를 재시작해야 합니다.

  • Docker 컨테이너 이전

컨테이너를 다른 컴퓨터로 이전하려면,

  • 이미지를 tar 파일로 내보내기
docker save --output myems-modbus-tcp.tar myems/myems-modbus-tcp
  • tar 파일을 다른 컴퓨터에 복사한 후 tar 파일에서 이미지 로드
docker load --input .\myems-modbus-tcp.tar

5단계: myems-cleaning

이 섹션에서는 Docker에 myems-cleaning을 설치합니다.

  • 소스 코드를 루트 디렉토리에 복사
cp -r myems/myems-cleaning /
cd /myems-cleaning
  • example.env 파일을 기반으로 .env 파일 생성
주의

수동으로 127.0.0.1을 실제 호스트(HOST) IP 주소로 교체하십시오.

cp example.env .env
  • 소스 코드로부터 이미지 빌드
docker build -t myems/myems-cleaning .

빌드를 실행하는 사용자의 아키텍처 및 운영 체제가 아닌 여러 플랫폼을 대상으로 빌드하려면, buildx를 사용하고 --platform 플래그를 설정하여 빌드 출력의 대상 플랫폼을 지정할 수 있습니다 (예: linux/amd64, linux/arm64, darwin/amd64).

docker buildx build --platform=linux/amd64 -t myems/myems-cleaning .
  • Docker 컨테이너 실행 (슈퍼유저로 실행)
docker run -d -v /myems-cleaning/.env:/app/.env:ro --log-opt max-size=1m --log-opt max-file=2 --restart always --name myems-cleaning myems/myems-cleaning
  • -d: 컨테이너를 백그라운드에서 실행하고 컨테이너 ID를 출력합니다.

  • -v: -v 또는 --volume을 사용하여 Docker 호스트에 아직 존재하지 않는 파일 또는 디렉토리를 바인드 마운트하면, -v가 해당 엔드포인트를 자동으로 생성합니다 (항상 디렉토리로 생성됩니다). ro 옵션이 있으면 바인드 마운트가 컨테이너에 읽기 전용으로 마운트됩니다. v4.7.0 이전 버전의 경우 /app/.env 대신 '/code/.env'를 사용하십시오.

  • --log-opt max-size=2m: 로그가 롤링되기 전의 최대 크기입니다. 양의 정수에 단위를 나타내는 수식어(k, m, g)를 붙입니다.

  • --log-opt max-file=2: 존재할 수 있는 최대 로그 파일 수입니다. 로그 롤링으로 인해 파일이 너무 많아지면 가장 오래된 파일이 삭제됩니다. 양의 정수 값을 사용합니다.

  • --restart: 컨테이너가 종료될 때 적용할 재시작 정책입니다.

  • --name: 컨테이너에 이름을 할당합니다.

콜론 앞의 절대 경로는 호스트의 경로이며 시스템에 따라 다를 수 있습니다. 콜론 뒤의 절대 경로는 컨테이너 내의 경로이며 변경할 수 없습니다. .env 파일을 바인드 마운트 파라미터로 전달하면 나중에 구성 값을 변경할 수 있습니다. .env 파일을 변경한 경우 변경 내용을 적용하려면 컨테이너를 재시작해야 합니다.

  • Docker 컨테이너 이전

컨테이너를 다른 컴퓨터로 이전하려면,

  • 이미지를 tar 파일로 내보내기
docker save --output myems-cleaning.tar myems/myems-cleaning
  • tar 파일을 다른 컴퓨터에 복사한 후 tar 파일에서 이미지 로드
docker load --input .\myems-cleaning.tar

6단계: myems-normalization

이 섹션에서는 Docker에 myems-normalization을 설치합니다.

  • 소스 코드를 루트 디렉토리에 복사
cp -r myems/myems-normalization /
cd /myems-normalization
  • example.env 파일을 기반으로 .env 파일 생성
주의

수동으로 127.0.0.1을 실제 호스트(HOST) IP 주소로 교체하십시오.

cp example.env .env
  • 소스 코드로부터 이미지 빌드
docker build -t myems/myems-normalization .

빌드를 실행하는 사용자의 아키텍처 및 운영 체제가 아닌 여러 플랫폼을 대상으로 빌드하려면, buildx를 사용하고 --platform 플래그를 설정하여 빌드 출력의 대상 플랫폼을 지정할 수 있습니다 (예: linux/amd64, linux/arm64, darwin/amd64).

docker buildx build --platform=linux/amd64 -t myems/myems-normalization .
  • Docker 컨테이너 실행 (슈퍼유저로 실행)
docker run -d -v /myems-normalization/.env:/app/.env:ro --log-opt max-size=1m --log-opt max-file=2 --restart always --name myems-normalization myems/myems-normalization
  • -d: 컨테이너를 백그라운드에서 실행하고 컨테이너 ID를 출력합니다.

  • -v: -v 또는 --volume을 사용하여 Docker 호스트에 아직 존재하지 않는 파일 또는 디렉토리를 바인드 마운트하면, -v가 해당 엔드포인트를 자동으로 생성합니다 (항상 디렉토리로 생성됩니다). ro 옵션이 있으면 바인드 마운트가 컨테이너에 읽기 전용으로 마운트됩니다. v4.7.0 이전 버전의 경우 /app/.env 대신 '/code/.env'를 사용하십시오.

  • --log-opt max-size=2m: 로그가 롤링되기 전의 최대 크기입니다. 양의 정수에 단위를 나타내는 수식어(k, m, g)를 붙입니다.

  • --log-opt max-file=2: 존재할 수 있는 최대 로그 파일 수입니다. 로그 롤링으로 인해 파일이 너무 많아지면 가장 오래된 파일이 삭제됩니다. 양의 정수 값을 사용합니다.

  • --restart: 컨테이너가 종료될 때 적용할 재시작 정책입니다.

  • --name: 컨테이너에 이름을 할당합니다.

콜론 앞의 절대 경로는 호스트의 경로이며 시스템에 따라 다를 수 있습니다. 콜론 뒤의 절대 경로는 컨테이너 내의 경로이며 변경할 수 없습니다. .env 파일을 바인드 마운트 파라미터로 전달하면 나중에 구성 값을 변경할 수 있습니다. .env 파일을 변경한 경우 변경 내용을 적용하려면 컨테이너를 재시작해야 합니다.

  • Docker 컨테이너 이전

컨테이너를 다른 컴퓨터로 이전하려면,

  • 이미지를 tar 파일로 내보내기
docker save --output myems-normalization.tar myems/myems-normalization
  • tar 파일을 다른 컴퓨터에 복사한 후 tar 파일에서 이미지 로드
docker load --input .\myems-normalization.tar

7단계: myems-aggregation

이 섹션에서는 Docker에 myems-aggregation을 설치합니다.

  • 소스 코드를 루트 디렉토리에 복사
cp -r myems/myems-aggregation /
cd /myems-aggregation
  • example.env 파일을 기반으로 .env 파일 생성
cp example.env .env
주의

수동으로 127.0.0.1을 실제 호스트(HOST) IP 주소로 교체하십시오.

  • 소스 코드로부터 이미지 빌드
docker build -t myems/myems-aggregation .

빌드를 실행하는 사용자의 아키텍처 및 운영 체제가 아닌 여러 플랫폼을 대상으로 빌드하려면, buildx를 사용하고 --platform 플래그를 설정하여 빌드 출력의 대상 플랫폼을 지정할 수 있습니다 (예: linux/amd64, linux/arm64, darwin/amd64).

docker buildx build --platform=linux/amd64 -t myems/myems-aggregation .
  • Docker 컨테이너 실행 (슈퍼유저로 실행)
docker run -d -v /myems-aggregation/.env:/app/.env:ro --log-opt max-size=1m --log-opt max-file=2 --restart always --name myems-aggregation myems/myems-aggregation
  • -d: 컨테이너를 백그라운드에서 실행하고 컨테이너 ID를 출력합니다.

  • -v: -v 또는 --volume을 사용하여 Docker 호스트에 아직 존재하지 않는 파일 또는 디렉토리를 바인드 마운트하면, -v가 해당 엔드포인트를 자동으로 생성합니다 (항상 디렉토리로 생성됩니다). ro 옵션이 있으면 바인드 마운트가 컨테이너에 읽기 전용으로 마운트됩니다. v4.7.0 이전 버전의 경우 /app/.env 대신 '/code/.env'를 사용하십시오.

  • --log-opt max-size=2m: 로그가 롤링되기 전의 최대 크기입니다. 양의 정수에 단위를 나타내는 수식어(k, m, g)를 붙입니다.

  • --log-opt max-file=2: 존재할 수 있는 최대 로그 파일 수입니다. 로그 롤링으로 인해 파일이 너무 많아지면 가장 오래된 파일이 삭제됩니다. 양의 정수 값을 사용합니다.

  • --restart: 컨테이너가 종료될 때 적용할 재시작 정책입니다.

  • --name: 컨테이너에 이름을 할당합니다.

콜론 앞의 절대 경로는 호스트의 경로이며 시스템에 따라 다를 수 있습니다. 콜론 뒤의 절대 경로는 컨테이너 내의 경로이며 변경할 수 없습니다. .env 파일을 바인드 마운트 파라미터로 전달하면 나중에 구성 값을 변경할 수 있습니다. .env 파일을 변경한 경우 변경 내용을 적용하려면 컨테이너를 재시작해야 합니다.

  • Docker 컨테이너 이전

  • 이미지를 tar 파일로 내보내기

docker save --output myems-aggregation.tar myems/myems-aggregation
  • tar 파일을 다른 컴퓨터에 복사한 후 tar 파일에서 이미지 로드
docker load --input .\myems-aggregation.tar

8단계: myems-web

이 섹션에서는 Docker에 myems-web을 설치합니다.

  • config.js 파일 수정:
참고

mapboxToken은 https://mapbox.com에서 획득한 후 showOnlineMap을 true로 설정하십시오. 온라인 맵 기능을 끄려면 showOnlineMap을 false로 설정하십시오.

cd myems/myems-web
nano src/config.js
  • nginx.conf 파일 수정:
주의

nginx.conf 파일 내의 127.0.0.1:8000을 myems-api의 실제 호스트(HOST) IP와 포트로 교체하십시오.

cd myems/myems-web
nano nginx.conf
  • 소스 코드를 루트 디렉토리에 복사
cp -r myems/myems-web /
cd /myems-web
정보

이 섹션에서 'npm run build' 명령은 안전하게 무시할 수 있습니다. 해당 명령은 Dockerfile에 내장되어 있기 때문입니다.

  • 소스 코드로부터 이미지 빌드
docker build -t myems/myems-web .
docker image prune -f

빌드를 실행하는 사용자의 아키텍처 및 운영 체제가 아닌 여러 플랫폼을 대상으로 빌드하려면, buildx를 사용하고 --platform 플래그를 설정하여 빌드 출력의 대상 플랫폼을 지정할 수 있습니다 (예: linux/amd64, linux/arm64, darwin/amd64).

docker buildx build --platform=linux/amd64 -t myems/myems-web .
docker image prune -f
  • Docker 컨테이너 실행

호스트에서 nginx.conf를 바인드 마운트:

docker run -d -p 80:80 -v /myems-web/nginx.conf:/etc/nginx/nginx.conf:ro --log-opt max-size=1m --log-opt max-file=2 --restart always --name myems-web myems/myems-web
  • -d: 컨테이너를 백그라운드에서 실행하고 컨테이너 ID를 출력합니다.

  • -p: 컨테이너의 포트를 호스트에 공개합니다. 80:80 (호스트:컨테이너)는 컨테이너의 80 포트(오른쪽)를 호스트 머신의 TCP 80 포트(왼쪽)에 바인드합니다.

  • -v: -v 또는 --volume을 사용하여 Docker 호스트에 아직 존재하지 않는 파일 또는 디렉토리를 바인드 마운트하면, -v가 해당 엔드포인트를 자동으로 생성합니다 (항상 디렉토리로 생성됩니다). ro 옵션이 있으면 바인드 마운트가 컨테이너에 읽기 전용으로 마운트됩니다. v4.7.0 이전 버전의 경우 /app/.env 대신 '/code/.env'를 사용하십시오.

  • --log-opt max-size=2m: 로그가 롤링되기 전의 최대 크기입니다. 양의 정수에 단위를 나타내는 수식어(k, m, g)를 붙입니다.

  • --log-opt max-file=2: 존재할 수 있는 최대 로그 파일 수입니다. 로그 롤링으로 인해 파일이 너무 많아지면 가장 오래된 파일이 삭제됩니다. 양의 정수 값을 사용합니다.

  • --restart: 컨테이너가 종료될 때 적용할 재시작 정책입니다.

  • --name: 컨테이너에 이름을 할당합니다.

이미지를 다른 컴퓨터로 이전하려면,

  • 이미지를 tar 파일로 내보내기
docker save --output myems-web.tar myems/myems-web
  • tar 파일을 다른 컴퓨터에 복사한 후 tar 파일에서 이미지 로드
docker load --input .\myems-web.tar

설치 후 작업

축하합니다! 이제 MyEMS Admin UI와 Web UI에 로그인할 수 있습니다.

기본 포트

MyEMS Web UI: 80

MyEMS API: 8000

MyEMS Admin UI: 8001

서버 주소가 192.168.1.8이라고 가정할 때 (실제 서버 주소로 교체) MyEMS Web UI 접속: http://192.168.1.8 (80은 생략 가능) MyEMS Admin UI 접속: http://192.168.1.8:8001

기본 비밀번호

MyEMS Admin UI

사용자 이름:

administrator

비밀번호:

!MyEMS1

MyEMS Web UI

사용자 이름:

administrator@myems.io

비밀번호:

!MyEMS1

문제 해결

이미지 풀 타임아웃 문제 해결 방법

ISP 네트워크 문제로 인해 이미지 풀링이 느릴 수 있습니다. 타사 가속 서비스를 사용할 수 있습니다.