Journey to Security 132

[Docker] Volume을 활용한 정적 웹사이트 배포와 컨테이너 간 데이터 공유

웹 서비스를 개발하고 배포할 때 가장 기본이 되는 것은 정적 파일(HTML, CSS, JS)을 웹 서버에 띄우는 것이다.Docker를 사용하면 Nginx와 같은 웹 서버를 순식간에 실행할 수 있다.하지만 보다 확장성 있는 아키텍처를 위해서는 단순히 컨테이너를 띄우는 것에서 나아가, 호스트의 파일을 컨테이너와 연결하고(Bind Mount), 여러 컨테이너가 동일한 데이터를 바라보게 설정(--volumes-from)할 수 있어야 한다. 간단한 포트폴리오 웹사이트 예제를 통해 Docker Volume의 활용법을 알아보자. 1. 실습 환경 준비: 정적 파일 준비먼저 웹 서버에 띄울 소스 코드가 필요하다.구글에 "free bootstrap template"을 검색해서 Bootstrap 기반의 간단한 포트폴리오 템..

[Docker] 바인드 마운트(Bind Mount)를 활용한 데이터 동기화 (3)

이번에는 워드프레스와 MySQL을 링크하여 컨테이너가 삭제되어도 호스트 경로에 데이터가 보존되는 바인드 마운트를 구현해본다. WordPress와 MySQL 링크(--link)에 대한 내용은 아래 포스팅에 자세히 정리되어 있다. https://nanujahope.tistory.com/1011. MySQL 컨테이너 실행 (Host Volume 마운트)가장 먼저 데이터베이스 컨테이너를 생성한다.핵심은 컨테이너 내부의 데이터가 저장되는 경로를 내 로컬 호스트의 경로와 연결하는 것이다.docker run -d --name wp_db \-e MYSQL_ROOT_PASSWORD=rootoor \-e MYSQL_DATABASE=wordpress \-v /home/wp_mysql:/var/lib/mysql \mysql:..

[Docker] 바인드 마운트(Bind Mount)를 활용한 데이터 동기화 (2)

지난 포스팅에 이어 계속해서 바인드 마운트 방식을 이용한 도커 볼륨 관리 방법에 대해 알아보자. 1. 작업 디렉토리 준비 및 컨테이너 실행호스트의 현재 경로($(pwd))에 있는 index.html 파일을 Nginx가 웹 서비스를 제공하는 경로(/usr/share/nginx/html)에 마운트한다.# 1. 작업 디렉토리 이동 및 확인cd Desktop/webs/pwd/home/ubuntu/Desktop/webslsindex.html# 2. Bind Mount를 적용하여 새 컨테이너 생성하고 실행docker run --name web_four -v $(pwd):/usr/share/nginx/html:rw -p 2003:80 -d nginx 2. 컨테이너 상태 확인docker psCONTAINER ID ..

[k8s] 스프링부트(Spring boot) 서버를 파드(Pod)로 띄우기

쿠버네티스에서 스프링부트 서버를 파드로 띄우는 과정을 알아보자.1. IDE에 스프링 프로젝트 열기먼저 스프링 이니셜라이저(Spring Initializr)에서 스프링부트(Spring Boot) 프로젝트 demo 파일(zip)을 다운받아서 원하는 경로에 압축을 풀어놓는다. 이전 포스팅 참고 : https://nanujahope.tistory.com/105 그 다음, IDE에(ex. IntelliJ) 스프링 프로젝트(ex. demo)를 오픈한다.2. 테스트용 코드 작성src/main/java/com.example.demo/ 디렉토리에 AppController라는 자바 클래스를 새로 만든다. 파드가 실행되는 것만 확인하는 용도이므로 다음과 같이 간단한 예시 코드를 복붙해서 정상적으로 실행(run)되는지 확인한..

[Docker] 바인드 마운트(Bind Mount)를 활용한 데이터 동기화

컨테이너는 기본적으로 데이터를 저장하지 않는 휘발성(Stateless) 프로세스다.도커는 데이터를 영구적으로 보존하거나 호스트와 공유하기 위해 '볼륨(Volume)'과 '바인드 마운트(Bind Mount)' 기능을 제공한다.우선 이번 포스팅에서는 바인드 마운트 방식에 대해 알아보자. 바인드 마운트는 호스트의 특정 파일 경로를 컨테이너 내부에 직접 연결하므로, 호스트에서 소스 코드를 수정하면 컨테이너에 즉시 반영된다. 개발 환경에서는 소스 코드를 수정할 때마다 이미지를 다시 빌드하는 것이 비효율적이므로, 바인드 마운트 기능을 활용한다. 예시: 호스트에 웹 페이지 소스 디렉터리를 생성하고, 호스트의 디렉터리를 Nginx 컨테이너의 웹 루트 디렉터리에 마운트 하여 호스트에서 파일을 수정하면 웹 페이지가 변경..

[Docker] 컨테이너의 네트워크 구조: docker0과 veth

도커(Docker)를 사용할 때 단순히 컨테이너를 띄우는 것을 넘어, 실제 서비스 운영을 위해서는 네트워크(Network)가 어떻게 연결되는지, 그리고 컨테이너 내부의 데이터를 어떻게 관리할 것인지에 대해 이해해야 한다. Nginx와 Ubuntu 두 개의 컨테이너를 이용해 도커의 네트워크 인터페이스 구조(veth, bridge)를 직접 확인해보자.1. 컨테이너 포트 포워딩과 네트워크 격리 확인먼저 Nginx 웹 서버와 우분투 컨테이너를 각각 실행하여 외부에서 접근이 가능한지 확인해 본다.이때 -p 옵션을 사용하여 호스트의 포트와 컨테이너의 포트를 연결한다.# Nginx 컨테이너 실행 (호스트 8000 -> 컨테이너 80)docker run --name myweb -p 8000:80 -d nginx:lat..

[Linux] /etc/hosts 파일 이해하기

리눅스 시스템이 도메인 이름(Hostname)을 IP 주소로 변환할 때 가장 먼저 참고하는 파일이 있다. 바로 /etc/hosts 파일이다. /etc/hosts는 리눅스 시스템이 외부 DNS 서버를 찾기 전에 먼저 펼쳐보는 로컬 네임 서버(Local Name Server) 역할을 한다.서버 관리나 도커 컨테이너 간의 통신 구조를 이해하기 위해 반드시 알아야 할 기본 파일이다.1. DNS보다 높은 우선순위리눅스 커널은 네트워크 통신 시 숫자로 된 IP 주소(예: 123.456.0.1)를 사용한다.하지만 사용자는 기억하기 쉬운 도메인 이름(예: google.com)을 사용한다.보통은 DNS(Domain Name System) 서버에 쿼리를 날려 도메인에 매핑된 IP 주소를 받아온다.하지만 리눅스는 DNS 서..

[Docker] 컨테이너 통신: 링크(--link) 옵션을 활용해서 WordPress와 DB 연동하기

도커를 활용해 가장 기본적인 2-Tier 아키텍처인 웹 서버와 데이터베이스를 구축하고 연동하는 과정을 알아보자.프론트엔드 역할을 할 WordPress 컨테이너와 백엔드 데이터베이스 역할을 할 MySQL 컨테이너를 생성하고, 이 둘을 연결(Link)하여 블로그 서비스를 띄워본다.1. 아키텍처 및 개념우리가 구축할 구조는 클라이언트(브라우저)가 워드프레스 웹 서버에 접속하고, 워드프레스는 내부적으로 MySQL 데이터베이스에 접속하여 데이터를 저장하거나 불러오는 구조다.컨테이너 환경에서 이 구조를 만들 때 가장 중요한 고려 사항은 상태(State)와 설정(Configuration)의 분리다.이미지와 데이터: 도커 이미지는 불변(Immutable)이다. 이미지 자체에 비밀번호나 설정값을 하드코딩하면 보안상 위험..

[k8s] Nginx 파드(Pod) 생성하고 포트 포워딩(port forwarding)하기

쿠버네티스에서 가장 기본이 되는 배포 단위인 파드(Pod)를 직접 생성하고, 내부 접속 및 외부 노출을 테스트하는 과정을 실습해본다.대표적 웹 서버인 Nginx 컨테이너를 띄우고, 로컬 환경에서 접속이 가능한지 확인해보는 과정이다.1. 선언적 정의: YAML 파일 작성쿠버네티스는 선언적(Declarative) 시스템이다.즉, 내가 "무엇을 하고 싶다"라고 명령어로 하나하나 지시하기보다는, "어떤 상태가 되기를 원한다"라고 명세서(Manifest)를 작성해서 제출하는 방식이 권장된다.먼저 인텔리제이(IntelliJ)를 이용해 다음과 같이 nginx-pod.yaml 파일을 작성했다. apiVersion: 오브젝트를 생성하기 위한 API 버전 (Pod는 v1).kind: 생성할 리소스의 종류 (여기서는 Pod..

[Docker] 포트 포워딩(port forwarding) (feat. Nginx)

경량 웹 서버인 Nginx를 컨테이너로 구동하고, 외부(Host)에서 접근할 수 있도록 네트워크 포트를 매핑해보자.1. 포트 매핑 (Port Mapping)컨테이너는 격리된 네트워크 환경을 가지므로, 외부에서 접속하려면 호스트의 포트와 컨테이너의 포트를 연결해야 한다.Command: -p [Host_Port]:[Container_Port]설명: 호스트의 8000번 포트로 들어오는 트래픽을 컨테이너의 80번 포트(Nginx 기본 포트)로 전달한다.docker run -p 8000:80 -d nginx:latest이 때 docker ps를 실행해서 보이는 0.0.0.0:8000->80/tcp는 IPv4의 모든 인터페이스에서의 접근을 허용함을 의미한다. 포트 포워딩 트래픽 흐름 Docker 컨테이너는 기본적..