총 6개의 포스트로 이루어지며 아래 글목록을 보시면 확인이 가능합니다.
개요
시스템 개요에서 설명한 다른 서비스도 Docker 컨테이너 형태로 운영 중인 상황이라
동일한 서버에 Docker 컨테이너에 배포하는 과정에 대해서 설명합니다.
.Net 으로 구현된 SmartThings App 을 Docker 이미지로 빌드해서 파일로 저장한 다음 원격 서버에 복사하고
Docker 이미지 파일에서 로드된 이미지를 Docker compose 로 실행하는 과정에 대한 스크립트 입니다.
굳이 Docker Hub 에 올리지 않고 동일 네트워크에서 운영 중인 개발 PC(Windows) 와 서버(LINUX)에서 모두 진행합니다.
컨테이너 폴더 생성
파워쉘을 실행해서 Api 프로젝트 폴더로 이동합니다.
# Powershell 실행 후 솔루션 폴더 이동
cd D:\Repo\_Github\SmartThings-InfluxDB-.Net\Api
다음 스크립트를 실행해서 서버에 SSH 로 접속합니다.
중괄호({{Options}}) 부분은 수정하셔야 합니다.
비밀번호 입력해서 접속합니다.
# 서버 접속
ssh -p {{포트번호}} {{사용자 계정}}@{{HOST}}
다음 스크립트를 실행해서 전체 폴더를 생성합니다.
중괄호({{Options}}) 부분은 수정하셔야 합니다.
컨테이너 폴더는 smartthingsinfluxdbnet 로 지정했고 하위에 api 프로젝트를 위한 폴더도 생성합니다.
Logs 폴더의 경우는 현재 프로젝트에서는 사용되지 않습니다.(원래는 이름 처럼 로그 기록용 폴더입니다.)
소스를 수정해서 하위 폴더가 필요한 경우 추가 폴더를 지정하고
-p 옵션을 추가해서 지정된 폴더 하위 모든 폴더를 생성해 줍니다.
# 폴더 생성 : 최초 1번만
mkdir -p /{{Docker 경로}}/smartthingsinfluxdbnet/api/Logs
exit 를 입력해서 로컬 터미널로 복귀합니다.
# 접속 종료
exit
Docker 이미지 빌드
Api 프로젝트 폴더로 이동합니다.
# Powershell 실행 후 솔루션 폴더 이동
cd D:\Repo\_Github\SmartThings-InfluxDB-.Net\Api
다음 스크립트를 실행해서 Docker 이미지를 빌드합니다.
Docker Desktop 이 실행되어 있어야 합니다.
docker build --force-rm=false --no-cache=false --rm=true -f Dockerfile -t smartthingsinfluxdbnet-api:9.0.0 ..
다음과 같이 빌드 과정을 확인할 수 있습니다.
PS D:\Repo\_Github\SmartThings-InfluxDB-.Net\Api> docker build --force-rm=false --no-cache=false --rm=true -f Dockerfile -t smartthingsinfluxdbnet-api:9.0.0 ..
[+] Building 19.2s (18/18) FINISHED docker:desktop-linux
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.40kB 0.0s
=> [internal] load metadata for mcr.microsoft.com/dotnet/aspnet:9.0 0.4s
=> [internal] load metadata for mcr.microsoft.com/dotnet/sdk:9.0 0.4s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 464B 0.0s
=> [build 1/7] FROM mcr.microsoft.com/dotnet/sdk:9.0@sha256:9b0a4330cb3dac23ebd6df76ab4211ec5903907ad2c1ccd 0.0s
=> [base 1/2] FROM mcr.microsoft.com/dotnet/aspnet:9.0@sha256:c3aee4ea4f51369d1f906b4dbd19b0f74fd34399e5ef5 0.0s
=> [internal] load build context 0.1s
=> => transferring context: 53.92kB 0.1s
=> CACHED [build 2/7] WORKDIR /src 0.0s
=> [build 3/7] COPY [Api/Api.csproj, Api/] 0.0s
=> [build 4/7] RUN dotnet restore "./Api/Api.csproj" 9.7s
=> [build 5/7] COPY . . 0.0s
=> [build 6/7] WORKDIR /src/Api 0.0s
=> [build 7/7] RUN dotnet build "./Api.csproj" -c Release -o /app/build 5.8s
=> [publish 1/1] RUN dotnet publish "./Api.csproj" -c Release -o /app/publish /p:UseAppHost=false 2.5s
=> CACHED [base 2/2] WORKDIR /app 0.0s
=> CACHED [final 1/2] WORKDIR /app 0.0s
=> [final 2/2] COPY --from=publish /app/publish . 0.1s
=> exporting to image 0.1s
=> => exporting layers 0.1s
=> => writing image sha256:7ccd0a55bd5e798578b32fd4e252ec69c26b1ac5397821390fded0534882a62a 0.0s
=> => naming to docker.io/library/smartthingsinfluxdbnet-api:9.0.0 0.0s
Docker 이미지 파일 저장
다음 스크립트를 실행해서 이미지 파일로 저장합니다.
# 생성된 이미지를 파일로 저장
docker save -o smartthingsinfluxdbnet-api.img smartthingsinfluxdbnet-api:9.0.0
이미지 파일이 생성된 것을 확인할 수 있습니다.
PS D:\Repo\_Github\SmartThings-InfluxDB-.Net\Api> dir
Directory: D:\Repo\_Github\SmartThings-InfluxDB-.Net\Api
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2025-04-28 오후 1:35 bin
d---- 2025-05-09 오후 4:37 Controllers
d---- 2025-05-06 오후 7:00 Database
d---- 2025-05-09 오후 4:37 Entities
d---- 2025-05-06 오후 7:04 Environments
d---- 2025-05-06 오후 7:01 Migrations
d---- 2025-05-17 오후 9:50 obj
d---- 2025-05-09 오후 5:33 Properties
d---- 2025-05-09 오후 4:37 Services
-a--- 2025-05-09 오후 4:39 1308 Api.csproj
-a--- 2025-04-28 오후 1:05 390 Api.csproj.user
-a--- 2025-04-28 오전 10:32 119 Api.http
-a--- 2025-05-09 오후 6:22 127 appsettings.Development.json
-a--- 2025-05-09 오후 4:44 1718 appsettings.json
-a--- 2025-04-28 오전 10:33 1363 Dockerfile
-a--- 2025-05-17 오후 10:15 1480 DockerFile.ps1
-a--- 2025-04-28 오후 12:38 647 Extensions.cs
-a--- 2025-05-09 오후 4:39 4335 Program.cs
-a--- 2025-05-09 오후 6:10 251445760 smartthingsinfluxdbnet-api.img
Docker 이미지 파일 복사
robocopy 명령어로 서버에 이미지 파일을 복사합니다.
중괄호({{Options}}) 부분은 수정하셔야 합니다.
# 서버에 이미지 파일 복사
robocopy ./ \\{{Docker 경로}}\smartthingsinfluxdbnet\api smartthingsinfluxdbnet-api.img
Docker 컨테이너 실행
서버 접속
다음 스크립트를 실행해서 서버에 SSH 로 다시 접속합니다.
중괄호({{Options}}) 부분은 수정하셔야 합니다.
비밀번호 입력해서 접속합니다.
# 서버 접속
ssh -p {{포트번호}} {{사용자 계정}}@{{HOST}}
폴더 이동 및 소유자 설정
해당 폴더로 이동합니다.
권한 설정의 경우 .Net 이미지 기본 id 및 그룹(1654:1654) 으로 소유자를 변경합니다.
하위 폴더가 없는 경우는 소유자 변경은 하지 않으셔도 됩니다.
중괄호({{Options}}) 부분은 수정하셔야 합니다.
# compose 폴더 접속
cd /{{Docker 경로}}/smartthingsinfluxdbnet
# 소유자 설정 : 최초 1번만
sudo chown -R 1654:1654 /{{Docker 경로}}/smartthingsinfluxdbnet/api
Docker 이미지 불러오기
다음 스크립트를 실행해서 Docker 이미지 파일에서 불러오는 명령어를 실행합니다.
# 이미지 파일에서 이미지 로드 - Api
docker load -i ./api/smartthingsinfluxdbnet-api.img
Docker compose 파일 작성
docker-compose.yaml 파일은 다음과 같이 작성합니다.
services:
smartthingsinfluxdbnet-api:
image: smartthingsinfluxdbnet-api:9.0.0
container_name: smartthingsinfluxdbnet.api
restart: always
ports:
- 5126:5126
environment:
- DOTNET_RUNNING_IN_CONTAINER=true
- Logging__Console__FormatterName=Json
- ASPNETCORE_HTTP_PORTS=5126
volumes:
- ./api/Logs:/app/Logs
컨테이너 폴더에 저장합니다.

컨테이너 실행
다음과 같이 컨테이너를 실행합니다.
# 실행
docker-compose up -d
데이터 확인
InfluxDB UI 에서 저장된 데이터를 확인해 봅니다.
Data Explorer 페이지에서 지정된 Bucket 를 선택해서 조회해 보면 다음과 같이 저장된 데이터를 확인할 수 있다.

0 Comments