오라클 클라우드에 간단한 Docker 구축 후 App 여러개 올려서 사용할 목적으로 구축
그로인해 추후에 내가 보기 위해 진행 과정 작성
오라클 스펙
| 이미지 | Ubuntu 24.04 Minimal aarch64 |
| OCPU / RAM | 2 OCPU / 12GB |
| Boot volume | 100GB |
SSH 접속 후 설정
1. 서버 업데이트
sudo apt update
sudo apt full-upgrade -y
sudo apt autoremove -y
커널이나 중요 패키지가 업데이트 됐다면 재부팅합니다.
sudo reboot
2. 기본 패키지 설치
| 패키지 | 설명 | 용도 |
| curl | URL을 통해 서버와 데이터를 주고받는 명령줄 도구 | API 테스트, 웹 요청 |
| wget | 웹 서버에서 파일과 콘텐츠를 다운로드하는 도구 | 파일 다운로드 |
| git | 분산 버전 관리 시스템 | 소스 코드 다운로드 및 관리 |
| unzip | ZIP 압축 해제 도구 | 압축 파일 해제 |
| vim | 터미널 텍스트 에디터 | 설정 파일 수정 |
| htop | 시스템 리소스 모니터링 도구 | CPU, 메모리, 프로세스 확인 |
| jq | JSON 파싱 및 가공 도구 | JSON 데이터 처리 |
| ca-certificates | SSL/TLS 인증서 모음 | HTTPS 연결 |
| gnupg | 공개키 암호화 프로그램 | 외부 저장소 인증 키 등록 |
| lsb-release | 배포판 버전 정보 확인 도구 | OS 버전 조회 |
| fail2ban | 로그 기반 IP 차단 도구 | SSH 무차별 대입 방어 |
| iptables-persistent | iptables 규칙 저장 도구 | 방화벽 규칙 영구 저장 |
| netfilter-persistent | Netfilter 규칙 로드 서비스 | 재부팅 시 방화벽 규칙 자동 로드 |
sudo apt install -y curl wget git unzip vim htop jq ca-certificates gnupg lsb-release fail2ban iptables-persistent netfilter-persistent
설치 중에 iptables 저장 여부를 물으면:
IPv4 rules 저장: Yes
IPv6 rules 저장: Yes
3. 현재 iptables 백업
중요합니다. Oracle 기본 규칙을 날리지 않기 위한 백업입니다.
sudo iptables-save | sudo tee /home/ubuntu/iptables-before-web.rules > /dev/null
현재 규칙 확인
sudo iptables -nL INPUT --line-numbers
보통 Oracle Ubuntu에서는 마지막 쪽에 이런 규칙이 있습니다.
ACCEPT tcp ... dpt:22
REJECT all ...
80/443은 반드시 REJECT보다 위에 들어가야 합니다.
4. HTTP/HTTPS 포트 열기
가장 단순하고 안전하게 맨 위에 추가합니다.
sudo iptables -I INPUT 1 -p tcp -m state --state NEW --dport 80 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp -m state --state NEW --dport 443 -j ACCEPT
Oracle 기본 iptables 규칙에는 InstanceServices 체인이 포함될 수 있습니다. 이 체인은 Oracle 내부 서비스 접근과 관련되어 있으므로 삭제하지 않습니다. iptables -F, iptables -X 같은 전체 초기화 명령은 사용하지 않습니다.
확인:
sudo iptables -nL INPUT --line-numbers
위쪽에 아래가 보이면 됩니다.
ACCEPT tcp ... dpt:443
ACCEPT tcp ... dpt:80
5. 재부팅 후에도 유지되게 저장
sudo netfilter-persistent save
sudo netfilter-persistent reload
저장 확인:
sudo ls -l /etc/iptables/
아래 파일이 있으면 정상입니다.
rules.v4
rules.v6
오라클 클라우드 VCN 보안규칙에도 추가해야합니다.
HTTP
Source CIDR: 0.0.0.0/0
Protocol: TCP
Destination Port: 80
HTTPS
Source CIDR: 0.0.0.0/0
Protocol: TCP
Destination Port: 443
6. 시간대 설정
한국 시간으로 맞춥니다.
sudo timedatectl set-timezone Asia/Seoul
timedatectl
7. Swap 추가
RAM 12GB면 필수는 아니지만, Docker 빌드나 업데이트 중 여유를 위해 4GB 정도 추천합니다.
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
재부팅 후에도 유지되게 등록합니다.
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -h
8. SSH 기본 보안 확인
비밀번호 SSH 로그인을 막는 설정을 확인합니다.
sudo grep -E "PasswordAuthentication|PermitRootLogin|PubkeyAuthentication" /etc/ssh/sshd_config
권장값은 이렇습니다.
PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes
수정이 필요하면:
sudo vim /etc/ssh/sshd_config
sudo systemctl reload ssh
9. Docker 설치
sudo apt install -y docker.io docker-compose-v2
sudo systemctl enable --now docker
sudo usermod -aG docker ubuntu
그다음 SSH를 한 번 끊고 다시 접속하세요. 재접속 후 확인합니다.
docker --version
docker compose version
docker run --rm hello-world
Docker 설치 후 iptables에 DOCKER, DOCKER-USER, DOCKER-FORWARD 같은 체인이 생길 수 있으며 정상입니다.
10. 앱 디렉터리 준비
서비스 파일을 한 곳에 모아두는 식으로 진행합니다.
sudo mkdir -p /opt/apps
sudo chown -R ubuntu:ubuntu /opt/apps
mkdir -p /opt/apps/appName
나중에 App들은 /opt/apps/appName/docker-compose.yml 형태로 두면 됩니다.
11. 리버스 프록시 선택
둘 중 하나를 고르면 됩니다.
간단하게 자동 HTTPS까지 원한다면 Caddy 추천:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install -y caddy
대규모 트래픽으로 운영한다면 Nginx + Certbot:
sudo apt install -y nginx certbot python3-certbot-nginx
sudo systemctl enable --now nginx
처음이면 Caddy가 압도적으로 편합니다, 도메인만 연결되어있다면 HTTPS 인증서를 자동으로 발급/갱신합니다.
저는 Caddy로 진행합니다.
각 App의 Docker 포트는 가능하면 127.0.0.1에만 바인딩하고, 외부 공개는 Caddy/Nginx의 80/443을 통해서만 진행합니다.
예시:
ports: - "127.0.0.1:3000:3000"
12. 상태 점검
여기까지 끝나면 아래가 정상이어야 합니다.
hostnamectl
free -h
df -h
sudo iptables -nL --line-numbers
sudo systemctl status netfilter-persistent
systemctl status docker
systemctl status caddy
# 또는
systemctl status nginx
브라우저에서 서버 IP 또는 도메인으로 접속했을 때 Caddy/Nginx 응답이 보이면 네트워크와 방화벽은 대체로 정상입니다.
아직 사이트 설정을 하지 않았다면 404, 기본 페이지 또는 연결 실패가 나올 수 있습니다.