전체 글 92

Dockerfile 문법: 재현 가능한 이미지 만들기

실행 중인 컨테이너에 접속해 패키지를 설치하고 설정을 바꾼 뒤 docker commit으로 이미지를 만들 수는 있다. 그러나 어떤 명령을 어떤 순서로 실행했는지 기록되지 않아 같은 결과를 재현하기 어렵다. Dockerfile은 이미지를 만드는 과정을 텍스트로 선언한다. 소스 코드처럼 버전 관리하고 검토할 수 있으며, 같은 파일로 개발·CI·운영 환경의 이미지를 반복해서 빌드할 수 있다. 컨테이너 환경을 코드로 관리한다는 점에서 Infrastructure as Code의 한 형태로 볼 수 있다.Dockerfile에서 이미지까지Dockerfile의 각 명령은 베이스 이미지 위에 파일과 메타데이터를 추가한다. 빌드 결과는 불변 이미지이며, 변경하려면 Dockerfile을 수정하고 새 이미지를 빌드한다. 가장 ..

클라우드/Docker 2026.09.09

Docker로 Redmine과 MySQL 연결하기

Redmine은 프로젝트, 이슈, 일정과 작업 시간을 관리하는 웹 애플리케이션이다. 간단한 테스트는 SQLite로 실행할 수 있지만 여러 사용자가 이용하는 환경에서는 별도의 데이터베이스 서버를 연결하는 구성이 적합하다. 이 실습에서는 Redmine과 MySQL을 각각 컨테이너로 실행한다. 두 컨테이너는 사용자 정의 Bridge Network에서 이름으로 통신하고, 데이터베이스와 첨부 파일은 Named Volume에 보존한다.구성MySQL의 3306번 포트는 호스트에 게시하지 않는다. Redmine만 redmine-net을 통해 MySQL에 접근한다.예제는 Bash의 줄 연속 문자인 \를 사용한다. PowerShell에서는 명령을 한 줄로 입력하거나 \ 대신 백틱을 사용한다.환경 변수 파일 준비mysql...

클라우드/Docker 2026.09.08

Docker로 WordPress와 MariaDB 연결하기

WordPress는 PHP로 실행되는 웹 애플리케이션이며 게시글, 사용자와 설정을 관계형 데이터베이스에 저장한다. 하나의 컨테이너에 WordPress와 데이터베이스를 모두 넣을 수도 있지만 역할을 분리하면 각 서비스를 독립적으로 교체하고 데이터를 별도로 보존하기 쉽다. 이 실습에서는 WordPress와 MariaDB를 사용자 정의 Bridge Network로 연결한다. MariaDB의 3306번 포트는 호스트에 공개하지 않고 WordPress만 컨테이너 이름으로 데이터베이스에 접근하게 한다.구성두 컨테이너는 wordpress-net에 연결한다. Docker DNS가 wordpress-db라는 이름을 MariaDB 컨테이너의 현재 IP로 변환한다. 데이터베이스와 WordPress 파일은 각각 Named V..

클라우드/Docker 2026.09.08

Docker 네트워크와 다중 컨테이너 연결

컨테이너는 기본적으로 격리된 네트워크 환경을 가진다. 외부 사용자가 웹 컨테이너에 접근하려면 포트를 게시해야 하고, 애플리케이션 컨테이너끼리 통신하려면 같은 Docker Network에 연결해야 한다.이 글에서는 Bridge Network의 동작을 이해하고 WordPress와 MySQL을 안전한 연결 구조로 실행한다.Docker Network의 역할Docker의 Network Driver는 컨테이너 연결 방식을 구현한다. 단일 Docker 호스트에서 가장 많이 쓰는 방식은 Bridge다.docker network ls 일반적으로 다음 기본 Network가 보인다.bridge: 기본 Bridge Networkhost: 컨테이너가 호스트의 Network Namespace를 공유none: 컨테이너 Networ..

클라우드/Docker 2026.09.08

Ubuntu VM에 Kafka 설치하기: KRaft와 systemd 구성

Docker가 아닌 서버에 Kafka를 직접 설치하면 Java 프로세스, 데이터 디렉터리, 리스너와 서비스 시작 방식을 직접 관리해야 한다. 이 글에서는 Ubuntu VM 한 대에 Kafka 4.3.1을 설치하고 systemd 서비스로 실행한 뒤 원격 클라이언트 연결까지 확인한다. 단일 브로커와 PLAINTEXT를 사용하는 학습용 구성이다. 운영 환경은 최소 3개의 브로커·컨트롤러, TLS·SASL, 모니터링, 백업과 장애 도메인 분산을 별도로 설계해야 한다.네트워크부터 제한한다클라우드 VM을 만든다면 security group 또는 방화벽 규칙을 먼저 정한다.포트용도허용 범위22SSH관리자 IP 또는 bastion만 허용9092Kafka 클라이언트애플리케이션의 private subnet·security..

String의 불변성과 문자열 비교 이해하기

String은 문자열을 표현하는 참조형이자 한 번 생성되면 내용이 바뀌지 않는 불변 객체다. 문자열을 올바르게 사용하려면 문자열 리터럴이 공유되는 방식과 ==, equals()의 차이를 알아야 한다. 이 글에서는 String의 핵심 동작 원리를 살펴본다.String은 문자열을 표현하는 클래스다Java에서 문자열은 큰따옴표로 표현한다.String language = "Java";String empty = ""; int, char, boolean과 달리 String은 기본형이 아니다. java.lang 패키지에 포함된 클래스이며, String 변수에는 문자열 객체를 가리키는 참조가 저장된다.String text = "Java"; text 변수에 문자 배열 자체가 들어 있다고 보기보다 "Java"라는 문자열 ..

BufferedReader, StringTokenizer, StringBuilder 활용법

코딩테스트에서는 많은 입력을 빠르게 읽고 공백 단위로 나눈 뒤 결과를 한 번에 출력하는 패턴이 자주 사용된다. BufferedReader는 줄 단위 입력, StringTokenizer는 토큰 분리, StringBuilder는 출력 누적을 담당한다.세 도구의 역할System.in ↓ 바이트를 문자로 변환InputStreamReader ↓ 입력을 버퍼링하고 한 줄씩 읽기BufferedReader ↓ 한 줄을 공백 등의 구분자로 나누기StringTokenizer ↓ 결과 문자열 누적StringBuilder ↓System.out.print()도구역할BufferedReader입력을 버퍼에 모아 줄 단위 문자열로 읽음StringTokenizer문자열을 구분자 기준의 토큰으로 나눔StringBuil..

Java 콘솔 입출력 이해하기: System.out, Scanner, BufferedReader

콘솔 입출력은 터미널에 값을 표시하고 사용자가 입력한 값을 프로그램으로 가져오는 과정이다. Java에서는 System.out으로 출력하고, System.in을 Scanner나 BufferedReader와 연결해 입력을 처리할 수 있다. 이 글에서는 각 도구의 역할과 입력 단위의 차이, 형 변환, 줄바꿈 처리에서 자주 발생하는 문제를 알아본다.입출력이란 무엇인가프로그램의 관점에서 입력(input)은 외부에서 데이터를 받아들이는 것이고, 출력(output)은 처리 결과를 외부로 보내는 것이다.간단한 콘솔 프로그램은 다음 순서로 동작한다.키보드로 이름과 나이를 입력받는다.입력값을 변수에 저장한다.저장한 값을 이용해 문장을 만든다.결과를 터미널에 출력한다.import java.util.Scanner;public..

Java 변수와 기본형 이해하기

변수는 값을 저장하고 다시 사용하기 위한 이름 있는 저장 공간이다. Java에서는 변수의 타입이 컴파일 시점에 정해지며, 기본형 변수는 객체의 주소가 아니라 실제 값을 직접 담는다. 이 글에서는 변수의 선언과 초기화부터 8가지 기본형, 리터럴, 형 변환과 연산 시 주의점까지 살펴본다.변수는 무엇인가프로그램은 계산에 필요한 값을 저장하고 다시 사용해야 한다. 다음 코드에서 age는 정수 20을 저장하는 변수다.int age = 20; 이 문장은 세 부분으로 나눌 수 있다.int age = 20;타입 이름 값int: 변수에 저장할 수 있는 값의 종류age: 코드에서 변수를 식별하는 이름20: 변수에 저장하는 값Java는 모든 변수와 표현식의 타입을 컴파일 시점에 확인하는 정적 타입 언어다. 한 번 i..

Spring Boot로 Kafka 프로듀서와 컨슈머 구현하기

Kafka의 토픽과 파티션을 이해했다면 작은 애플리케이션으로 이벤트 발행과 소비 흐름을 확인해 볼 수 있다. 이 글에서는 로컬 Kafka를 실행하고 Spring Boot에서 JSON 이벤트를 보내고 받는다.1. 로컬 Kafka와 토픽 준비Docker Compose 실습의 docker-compose.yml이 있는 디렉터리에서 Kafka를 실행한다.docker compose up -ddocker compose ps order-events 토픽을 생성한다.docker compose exec broker /opt/kafka/bin/kafka-topics.sh --bootstrap-server broker:19092 --create --if-not-exists --topic order-events --partit..