정보의 보물창고

폐쇠망에서 Docker 사용하기 본문

카테고리 없음

폐쇠망에서 Docker 사용하기

☆★※☆★※ 2025. 2. 19. 17:51
반응형

최근 폐쇄망 환경에서 Docker와 Docker Compose를 활용하여 Spring Boot, React, Nginx, Oracle을 배포하는 작업을 진행했다. 원래는 인터넷이 연결된 환경이라면 간단하게 Docker Hub에서 이미지를 내려받아 사용하면 되지만, 폐쇄망에서는 이 과정이 불가능하기 때문에 몇 가지 추가적인 작업이 필요했다. 이번 포스팅에서는 해당 문제를 해결하기 위한 과정과 적용했던 방법을 정리해본다.

1. Docker와 Docker Compose란?

Docker

Docker는 컨테이너 기반의 가상화 기술을 제공하는 오픈소스 플랫폼이다. 애플리케이션을 컨테이너로 패키징하여 어디서든 동일한 환경에서 실행할 수 있도록 해준다. 쉽게 말해, "한 번 빌드하면 어디서든 실행 가능"한 환경을 만든다고 생각하면 된다.

Docker Compose

Docker Compose는 여러 개의 컨테이너를 한 번에 관리할 수 있도록 하는 도구이다. docker-compose.yml 파일을 통해 여러 개의 서비스(Spring Boot, React, Nginx, Oracle 등)를 정의하고, 명령어 하나로 컨테이너를 실행할 수 있다.

2. 폐쇄망 환경에서의 문제점

일반적으로 Docker 이미지는 인터넷을 통해 Docker Hub에서 내려받아 실행한다. 하지만 폐쇄망 환경에서는 외부 네트워크 접근이 제한되기 때문에 직접 이미지를 다운로드할 수 없다. 따라서 인터넷이 연결된 환경에서 필요한 Docker 이미지를 미리 다운로드하고, 폐쇄망 환경으로 옮겨야 한다.

3. 해결 방법

1) 인터넷 연결된 환경에서 Docker 이미지 다운로드

우선 인터넷이 연결된 환경에서 Docker Hub에서 필요한 이미지를 다운로드해야 한다. 필요한 이미지는 다음과 같다.

docker pull openjdk:17-jdk-slim
docker pull node:18-alpine
docker pull nginx:latest
docker pull container-registry.oracle.com/database/enterprise:21.3.0

2) 다운로드한 이미지를 파일로 저장

docker save 명령어를 사용하면 Docker 이미지를 .tar 파일로 저장할 수 있다. 이를 이용해 폐쇄망 환경으로 옮길 수 있다.

docker save -o oracle.tar container-registry.oracle.com/database/enterprise:21.3.0
docker save -o backend.tar openjdk:17-jdk-slim
docker save -o frontend.tar node:18-alpine
docker save -o nginx.tar nginx:latest

3) 폐쇄망 환경으로 이미지 이동 후 로드

이제 .tar 파일을 USB 등으로 이동시킨 후, 폐쇄망 환경에서 docker load를 이용하여 로드한다.

docker load -i oracle.tar
docker load -i backend.tar
docker load -i frontend.tar
docker load -i nginx.tar

4. Docker Compose를 활용한 배포 구성

1) Spring Boot Dockerfile

FROM openjdk:17-jdk-slim
WORKDIR /app
COPY target/backend.jar backend.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "backend.jar"]

2) React Dockerfile

FROM node:18-alpine AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build

FROM nginx:alpine
WORKDIR /usr/share/nginx/html
COPY --from=build /app/build .
COPY default.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

3) Nginx 설정 파일 (default.conf)

server {
    listen 80;
    location / {
        root /usr/share/nginx/html;
        index index.html;
        try_files $uri /index.html;
    }
    location /api/ {
        proxy_pass http://backend:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

4) Docker Compose 설정 (docker-compose.yml)

version: '3.8'
services:
  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    container_name: backend
    ports:
      - "8080:8080"
    depends_on:
      - oracle
    environment:
      - SPRING_DATASOURCE_URL=jdbc:oracle:thin:@oracle-db:1521/ORCLPDB1
      - SPRING_DATASOURCE_USERNAME=system
      - SPRING_DATASOURCE_PASSWORD=oracle
    networks:
      - app-network

  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile
    container_name: frontend
    depends_on:
      - backend
    ports:
      - "3000:80"
    networks:
      - app-network

  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - frontend
    networks:
      - app-network

  oracle:
    image: container-registry.oracle.com/database/enterprise:21.3.0
    container_name: oracle-db
    environment:
      - ORACLE_SID=ORCLCDB
      - ORACLE_PDB=ORCLPDB1
      - ORACLE_PWD=oracle
      - ORACLE_CHARACTERSET=AL32UTF8
    ports:
      - "1521:1521"
    volumes:
      - oracle-data:/opt/oracle/oradata
    networks:
      - app-network
    restart: always

volumes:
  oracle-data:

networks:
  app-network:
    driver: bridge

5. 실행 및 확인

Docker Compose를 실행하여 모든 서비스를 띄운다.

docker-compose up -d --build

실행이 정상적으로 완료되었는지 docker ps 명령어를 통해 확인할 수 있다.

결론

폐쇄망 환경에서 Docker와 Docker Compose를 활용하여 Spring Boot, React, Nginx, Oracle을 배포하는 방법을 정리했다. 인터넷이 차단된 환경에서는 미리 이미지를 다운로드한 후 이동시키는 방식으로 해결할 수 있다. Docker Compose를 이용하면 여러 개의 서비스를 효율적으로 관리할 수 있어 매우 편리했다.

이번 과정에서 가장 중요했던 점은 이미지 파일을 미리 준비하는 것컨테이너 간의 네트워크를 올바르게 설정하는 것이었다. 다음 프로젝트에서도 폐쇄망 환경에서 Docker를 활용할 일이 있다면, 이 경험이 큰 도움이 될 것 같다.

반응형