본문 바로가기
DevOps/리눅스

ubuntu 24.04 도커 Nginx, Https, Samba 설치

by 광고(주) 2025. 3. 10.
반응형

필수패키지 설치

sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

Docker 공식 GPG 키 추가

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo tee /etc/apt/keyrings/docker.asc > /dev/null
sudo chmod a+r /etc/apt/keyrings/docker.asc

Docker 저장소 추가

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

패키지 목록 업데이트 및 Docker 설치

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Docker 서비스 활성화 및 실행 확인

sudo systemctl enable --now docker
sudo systemctl status docker

현재 사용자를 Docker 그룹에 추가 (재부팅 필요)

sudo usermod -aG docker $USER
newgrp docker
sudo reboot

Docker 설치 확인

docker --version
docker run hello-world

도커 컴포즈 설치

sudo curl -L "https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

도커 컴포즈 권한 부여

sudo chmod +x /usr/local/bin/docker-compose

심볼릭 링크 연결

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

버전 확인

docker-compose --version

Dockerfile 생성

FROM nginx:latest

# 필요한 패키지 설치
RUN apt-get update && apt-get install -y \
    smbclient \
    cifs-utils \
    && rm -rf /var/lib/apt/lists/*

# 스크립트 복사
COPY ./scripts/smb-mount.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/smb-mount.sh

# Nginx 설정 파일 복사
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf

마운트 스크립트 생성
smb-mount.sh

#!/bin/bash

# SMB 마운트 디렉토리 생성
mkdir -p /mnt/smb

# SMB 서버 마운트
mount -t cifs //${SMB_SERVER}/${SMB_SHARE} /mnt/smb \
    -o username=${SMB_USER},password=${SMB_PASSWORD}

# Nginx 시작
nginx -g 'daemon off;'

Nginx 컨테이너 실행

docker run -d --name nginx -p 18080:80 nginx
docker ps
docker ps -a
docker stop 컨테이너ID
docker rm 컨테이너ID
docker images
docker rmi 이미지ID

도커 컨테이너 접속하기

docker exec -it <컨테이너ID or 컨테이너명> /bin/bash  
cat nginx.conf

SSL 인증서 생성 (Let's Encrypt 사용)

# Certbot 설치
sudo apt install -y certbot
# 도메인에 대한 SSL 인증서 발급
sudo certbot certonly --standalone -d your-domain.com

Nginx 컨테이너에 HTTPS 설정 (Let's Encrypt + Certbot)

docker-compose.yml 파일

version: '3'
services:
  nginx:
    image: nginx:latest
    container_name: nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "18080:80"
      - "18443:443"
    environment:
      - SMB_SERVER=your-smb-server
      - SMB_SHARE=your-share
      - SMB_USER=your-username
      - SMB_PASSWORD=your-password
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - /etc/letsencrypt:/etc/letsencrypt
      - ./nginx/html:/usr/share/nginx/html

Nginx 설정 파일

./nginx/conf.d/default.conf 파일 생

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}

Let's Encrypt SSL 인증서 발급

docker-compose run --rm certbot certbot certonly --webroot -w /var/www/certbot --email your-email@example.com -d example.com -d www.example.com --agree-tos --no-eff-email

Nginx 재시작
실행 및 테스트

docker-compose up -d
# 로그 확인
docker-compose logs -f

# 컨테이너 내부 접속
docker exec -it nginx-smb bash

# SMB 연결 테스트
smbclient -L //${SMB_SERVER} -U ${SMB_USER}

자동 갱신 설정

# crontab 편집
sudo crontab -e
# 아래 내용 추가
0 0 1 * * certbot renew --quiet && docker restart nginx

SMB 명령어 사용 예시
컨테이너 내부에서:

# SMB 서버 리스트 확인
smbclient -L //서버주소 -U 사용자명

# SMB 공유 접속
smbclient //서버주소/공유명 -U 사용자명

# 파일 다운로드
smbclient //서버주소/공유명 -U 사용자명 -c "get 파일명"

# 파일 업로드
smbclient //서버주소/공유명 -U 사용자명 -c "put 로컬파일명"

자동화 스크립트 예시
smb-sync.sh

#!/bin/bash

# SMB 서버에서 파일 동기화
sync_smb() {
    smbclient //${SMB_SERVER}/${SMB_SHARE} -U ${SMB_USER}%${SMB_PASSWORD} -c "
        cd remote_dir
        lcd /local_dir
        mget *
    "
}

# 주기적으로 실행
while true; do
    sync_smb
    sleep 300  # 5분마다 실행
done
반응형

댓글