Docker를 처음 공부할 때 가장 먼저 볼 것은 명령어가 아님.
가장 먼저 볼 것은 Docker가 왜 필요한 도구인지에 대한 전체 그림임.
이 도구는 단순히 프로그램을 실행하는 명령어 모음이 아니라,
애플리케이션이 실행되는 환경을 일정하게 맞추기 위한 기술임.
내 컴퓨터에서는 되는데 다른 컴퓨터에서는 안 되는 문제
개발을 하다 보면 자주 만나는 상황이 있음.
내 컴퓨터에서는 프로그램이 정상 실행됨.
그런데 친구 컴퓨터, 학교 실습실 컴퓨터, 회사 서버, AWS EC2 서버에서는 갑자기 실행 실패.
코드는 똑같은데 실행 결과가 달라지는 상황임.
이 문제는 대부분 코드 자체보다 실행 환경 차이에서 발생하는 문제임.
예를 들어 Spring Boot 프로젝트를 실행한다고 가정.
내 컴퓨터에는 Java 17이 설치된 상태임.
프로젝트도 Java 17 기준으로 만들어진 상태임.
그래서 내 컴퓨터에서는 정상 실행 가능.
그런데 서버에는 Java 11만 설치된 상태라면 문제가 생길 수 있음.
코드는 같지만 Java 버전이 다르기 때문임.
Node.js 프로젝트도 같은 상황임.
내 컴퓨터에서는 Node 20으로 개발했지만 서버에는 Node 16만 설치되어 있을 수 있음.
이 경우 특정 문법이나 패키지가 제대로 동작하지 않을 수 있음.
데이터베이스도 마찬가지임.
내 컴퓨터에서는 PostgreSQL이 5432번 포트로 실행 중인 상태임.
하지만 서버에는 PostgreSQL이 설치되어 있지 않을 수 있음.
설치되어 있어도 포트, 계정, 비밀번호, 데이터베이스 이름이 다를 수 있음.
그러면 애플리케이션은 데이터베이스에 연결하지 못하는 상황이 됨.
결국 핵심은 하나임.
코드는 같아도 실행 환경이 다르면 프로그램은 다르게 동작할 수 있다는 점임.
프로그램은 코드만으로 실행되지 않음
처음 개발을 배울 때는 코드만 있으면 프로그램이 실행된다고 생각하기 쉬움.
하지만 실제 프로그램은 코드만으로 동작하지 않음.
항상 주변 실행 환경에 의존하는 구조임.
백엔드 서버를 예로 들면 여러 준비물이 필요함.
Java 버전 필요.
Gradle 또는 Maven 환경 필요.
필요한 라이브러리 필요.
데이터베이스 실행 상태 필요.
데이터베이스 주소와 포트 정보 필요.
환경변수 설정 필요.
서버에서 사용하는 포트 개방 필요.
이런 준비물을 통틀어 실행 환경이라고 볼 수 있음.
쉽게 말하면 프로그램이 돌아가기 위한 주변 조건임.
문제는 이 조건이 컴퓨터마다 다를 수 있다는 점임.
내 컴퓨터에는 모든 준비가 되어 있을 수 있음.
하지만 다른 컴퓨터에는 일부가 없을 수 있음.
또는 버전이 다를 수 있음.
또는 설정이 다를 수 있음.
그래서 개발 과정에서 "내 컴퓨터에서는 되는데요"라는 말이 자주 나오는 것임.
Docker는 바로 이 문제를 줄이기 위해 사용하는 도구임.
Docker가 해결하려는 핵심 문제
Docker가 해결하려는 핵심 문제는 실행 환경 차이임.
애플리케이션 실행에 필요한 환경을 이미지라는 형태로 묶고, 그 이미지를 바탕으로 컨테이너를 실행하는 방식임.
내 컴퓨터에서 사용한 실행 환경을 서버에서도 비슷하게 재현할 수 있도록 만드는 구조임.
기존 방식은 서버에 직접 필요한 프로그램을 설치하는 방식에 가까움.
서버에 Java 설치.
서버에 Node.js 설치.
서버에 Nginx 설치.
서버에 MySQL 또는 PostgreSQL 설치.
서버에 환경변수 설정.
서버에 필요한 파일 복사.
이 방식은 처음에는 단순해 보일 수 있음.
하지만 서버가 늘어나거나 팀원이 늘어나면 관리가 어려워지는 구조임.
서버마다 설치된 버전이 달라질 수 있음.
누가 어떤 설정을 바꿨는지 추적하기 어려울 수 있음.
새 서버를 만들 때마다 같은 작업을 반복해야 하는 불편함도 있음.
Docker를 사용하면 생각이 달라짐.
서버에 모든 프로그램을 직접 설치하는 대신, 애플리케이션 실행에 필요한 환경을 이미지로 준비하는 방식임.
그리고 서버에서는 그 이미지를 컨테이너로 실행하는 방식임.
핵심 목적은 프로그램을 그냥 실행하는 것이 아님.
프로그램이 실행될 환경을 포장해서 어디서든 비슷하게 실행되도록 만드는 것임.
Docker를 쓰면 좋은 점
첫 번째 장점은 실행 환경 통일임.
내 컴퓨터, 팀원 컴퓨터, 테스트 서버, 운영 서버에서 같은 이미지를 사용하면 환경 차이로 인한 문제를 줄일 수 있음.
두 번째 장점은 설치 과정 단순화임.
예를 들어 Nginx를 직접 설치하려면 운영체제에 맞는 설치 명령어를 알아야 함.
설치 후 설정 파일 위치도 알아야 함.
서비스 실행 방법도 알아야 함.
하지만 Docker를 사용하면 Nginx 이미지를 받아 컨테이너로 실행 가능.
운영체제에 직접 설치하는 부담이 줄어드는 구조임.
세 번째 장점은 삭제와 재생성의 용이함임.
컨테이너는 필요하면 만들고, 필요 없으면 중지하고, 다시 만들 수 있음.
서버에 직접 설치한 프로그램을 지우는 것보다 훨씬 깔끔한 관리 가능.
네 번째 장점은 배포 흐름과의 연결임.
로컬에서 만든 Docker 이미지를 서버에서 실행할 수 있음.
AWS EC2 같은 원격 서버에 Docker를 설치하고 같은 이미지를 실행하면, 로컬과 서버의 차이를 줄일 수 있음.
그래서 이 기술은 개발 환경뿐만 아니라 배포 환경에서도 중요한 도구임.
Docker가 모든 문제를 자동으로 해결하는 것은 아님
Docker를 사용한다고 해서 모든 문제가 사라지는 것은 아님.
환경변수 설정을 잘못하면 여전히 에러 발생.
포트 매핑을 잘못하면 브라우저 접속 실패.
데이터베이스 주소를 잘못 적으면 DB 연결 실패.
서버 방화벽이나 보안 그룹에서 포트를 막고 있으면 외부 접속 실패.
Docker는 실행 환경을 정리하고 통일해주는 도구임.
하지만 네트워크, 포트, 데이터 저장, 서버 보안 설정까지 자동으로 완벽하게 처리해주는 마법 도구는 아님.
그래서 공부할 때 단순히 명령어만 외우는 방식은 부족함.
이 명령어가 어떤 실행 환경을 만들고 있는지에 대한 이해 필요.
컨테이너가 어디에서 실행되는지, 포트가 어떻게 연결되는지, 데이터가 어디에 저장되는지까지 함께 확인 필요.
인프라 관점에서 Docker가 중요한 이유
인프라 관점에서 Docker는 매우 중요한 도구임.
실제 서비스는 코드를 작성하는 것에서 끝나지 않음.
작성한 코드를 서버에서 안정적으로 실행해야 함.
서버가 바뀌어도 실행되어야 함.
새 버전을 배포할 때 기존 환경을 망가뜨리지 않아야 함.
문제가 생기면 로그를 보고 원인을 추적해야 함.
Docker를 사용하면 애플리케이션 실행 단위를 컨테이너로 관리할 수 있음.
컨테이너 단위 실행 가능.
컨테이너 단위 중지 가능.
컨테이너 단위 삭제 가능.
컨테이너 단위 로그 확인 가능.
나중에는 Docker Compose를 사용해서
Spring Boot, MySQL, Redis 같은 여러 컨테이너를 한 번에 실행할 수 있음.
이 단계로 넘어가면 애플리케이션 하나만 보는 것이 아니라, 서비스 전체 실행 구조를 관리하는 관점으로 확장됨.
Docker는 개발자에게도 중요하지만 인프라와 배포를 공부하는 사람에게 특히 중요한 도구임.
서비스가 어떤 환경에서 실행되는지 직접 다룰 수 있기 때문임.
Docker를 공부할 때의 핵심 관점
Docker를 공부할 때는 명령어 암기보다 흐름 이해가 중요함.
전체 흐름은 다음과 같음.
먼저 이미지가 있음.
이미지는 프로그램 실행에 필요한 환경을 담은 틀임.
그 이미지를 실행하면 컨테이너가 만들어짐.
컨테이너 안에서 프로그램 실행.
필요하면 포트를 연결해서 외부 접근 가능.
필요하면 Volume을 연결해서 데이터를 컨테이너 밖에 저장.
내가 만든 프로젝트는 Dockerfile로 이미지화 가능.
여러 컨테이너는 Docker Compose로 함께 관리 가능.
마지막으로 EC2 같은 서버에서 컨테이너를 실행하면 배포로 연결되는 구조임.
결국 이 기술은 프로그램을 실행하기 위한 환경을 이미지로 만들고, 그 이미지를 컨테이너로 실행하는 도구임.
'개인공부 > Dokcer' 카테고리의 다른 글
| Docker의 전체 그림 (0) | 2026.07.06 |
|---|