Zeno ZENO

Part 1. Docker란 무엇인가

Docker는 애플리케이션 실행 환경을 컨테이너로 관리하는 도구다. 이 글에서는 Docker의 기본 개념부터 Linux, Kernel, Container, Image, Dockerfile, Docker Compose, Port, Environment Variable, Volume, Database, Migration까지 Docker를 이해하기 위해 필요한 핵심 개념을 초보자 기준으로 설명한다. 또한 Docker가 왜 필요한지, 가상머신과 어떤 차이가 있는지, 실제 프로젝트에서 Docker가 어떤 문제를 해결하는지 함께 정리한다.

Part 1. Docker란 무엇인가

1. Docker의 정의

Docker는 애플리케이션을 실행하는 데 필요한 환경을 하나로 묶어서 실행할 수 있게 해주는 도구다.

여기서 애플리케이션은 웹사이트, API 서버, 관리자 페이지, 백엔드 서버 같은 프로그램을 말한다.

애플리케이션은 코드만 있다고 실행되지 않는다.

실행하려면 여러 가지가 필요하다.

예를 들면 다음과 같다.

애플리케이션 실행에 필요한 것

- 코드
- 실행 언어
- 패키지
- 라이브러리
- 환경변수
- 실행 명령어
- 포트 설정
- 데이터베이스 연결 정보

Docker는 이런 실행 환경을 하나의 단위로 묶어서 관리한다.

그래서 Docker를 사용하면 로컬 컴퓨터, 다른 개발자의 컴퓨터, 서버에서 최대한 비슷한 환경으로 애플리케이션을 실행할 수 있다.


2. Docker는 리눅스인가

Docker는 리눅스 자체가 아니다.

Docker는 컨테이너를 만들고 실행하는 도구다.

다만 Docker는 리눅스의 기능을 많이 사용한다.

그래서 Docker를 공부하면 리눅스, 커널, 프로세스, 파일 시스템, 네트워크 같은 단어가 자주 나온다.

정리하면 다음과 같다.

Docker = 컨테이너를 실행하는 도구
Linux = Docker 컨테이너가 주로 실행되는 기반 환경

Windows에서 Docker를 사용할 때는 보통 Docker Desktop과 WSL 2를 사용한다.

구조는 다음과 같다.

Windows
→ Docker Desktop
→ WSL 2
→ Linux 환경
→ Docker 컨테이너 실행

즉 Windows 컴퓨터에서도 Docker를 사용할 수 있지만, 내부적으로는 리눅스 환경을 이용해서 컨테이너를 실행하는 경우가 많다.


3. 리눅스란 무엇인가

리눅스는 운영체제의 한 종류다.

운영체제는 컴퓨터의 하드웨어와 프로그램 사이에서 중간 역할을 하는 기본 시스템이다.

대표적인 운영체제는 다음과 같다.

Windows
macOS
Linux

웹 서버나 배포 서버에서는 리눅스가 많이 사용된다.

그 이유는 다음과 같다.

- 서버 환경에서 안정적이다.
- 무료로 사용할 수 있다.
- 서버용 도구가 많다.
- Docker와 잘 맞는다.

Docker를 사용할 때 리눅스를 어느 정도 알면 좋지만, 처음부터 리눅스를 깊게 공부할 필요는 없다.

초반에는 Docker 명령어와 기본 구조를 먼저 이해하면 된다.


4. 커널이란 무엇인가

Docker 설명에서 “호스트의 커널을 공유한다”는 말이 자주 나온다.

여기서 커널은 운영체제의 핵심 부분이다.

컴퓨터에는 CPU, 메모리, 디스크, 네트워크 같은 하드웨어가 있다.

프로그램은 이 하드웨어를 직접 마음대로 사용할 수 없다.

중간에서 운영체제가 관리한다.

그 운영체제의 가장 핵심 부분이 커널이다.

쉽게 말하면 다음과 같다.

커널 = 컴퓨터 자원을 관리하는 운영체제의 핵심 관리자

커널이 관리하는 것은 다음과 같다.

- CPU 사용
- 메모리 사용
- 파일 읽기/쓰기
- 네트워크 통신
- 프로세스 실행

Docker 컨테이너는 완전히 새로운 운영체제를 실행하는 방식이 아니다.

호스트 컴퓨터의 커널을 함께 사용하면서, 애플리케이션 실행 공간만 분리해서 사용한다.

여기서 호스트는 Docker를 실행하고 있는 실제 컴퓨터를 말한다.

호스트 = Docker가 설치된 실제 컴퓨터
컨테이너 = Docker가 만든 격리된 실행 공간

그래서 Docker는 일반 가상머신보다 가볍다.


5. 가상머신과 Docker의 차이

Docker는 가상머신과 자주 비교된다.

가상머신은 컴퓨터 안에 또 다른 컴퓨터를 만드는 방식에 가깝다.

예를 들어 Windows 컴퓨터 안에 Ubuntu 리눅스를 통째로 설치해서 실행하는 식이다.

가상머신은 운영체제 전체를 포함하기 때문에 무겁다.

Docker는 운영체제 전체를 새로 실행하지 않는다.

호스트의 커널을 공유하고, 애플리케이션 실행에 필요한 공간만 격리해서 실행한다.

차이는 다음과 같다.

가상머신

- 운영체제 전체를 포함한다.
- 무겁다.
- 실행이 비교적 느리다.
- 독립성이 강하다.

Docker 컨테이너

- 호스트 커널을 공유한다.
- 가볍다.
- 실행이 빠르다.
- 애플리케이션 실행 환경을 분리하는 데 적합하다.

간단히 정리하면 다음과 같다.

가상머신 = 컴퓨터 안에 또 다른 컴퓨터를 실행
Docker = 같은 컴퓨터 안에서 실행 공간만 분리

6. Docker가 필요한 이유

개발할 때 자주 생기는 문제가 있다.

로컬 컴퓨터에서는 정상 실행된다.

그런데 서버에서는 오류가 발생한다.

이유는 실행 환경이 다르기 때문이다.

예를 들어 다음과 같은 차이가 있을 수 있다.

- Node.js 버전이 다름
- PHP 버전이 다름
- Python 버전이 다름
- 설치된 패키지가 다름
- 운영체제가 다름
- 환경변수가 없음
- 포트 설정이 다름
- 데이터베이스 연결 정보가 다름

Docker는 이런 차이를 줄이기 위해 사용한다.

Dockerfile에 실행 환경을 적어두고, 그 설정대로 이미지를 만든다.

그리고 이미지를 컨테이너로 실행한다.

이렇게 하면 실행 환경을 코드처럼 관리할 수 있다.


7. Node.js란 무엇인가

Node.js는 JavaScript를 브라우저 밖에서도 실행할 수 있게 해주는 런타임이다.

원래 JavaScript는 브라우저에서 동작하는 언어였다.

예를 들어 버튼 클릭, 화면 변경, 팝업 표시 같은 기능에 사용됐다.

그런데 Node.js를 사용하면 JavaScript로 서버도 만들 수 있다.

예를 들어 다음과 같은 작업이 가능하다.

- 웹 서버 만들기
- API 서버 만들기
- 파일 처리하기
- 데이터베이스 연결하기
- 프론트엔드 프로젝트 빌드하기

React, Next.js, Vue, Vite 같은 프론트엔드 프로젝트도 보통 Node.js 환경에서 실행되거나 빌드된다.

그래서 Dockerfile에서 이런 코드가 자주 나온다.

FROM node:20

이 뜻은 다음과 같다.

Node.js 20 버전이 설치된 환경을 기반으로 Docker 이미지를 만들겠다.

8. npm이란 무엇인가

npm은 Node.js에서 사용하는 패키지 관리자다.

패키지 관리자는 필요한 라이브러리를 설치하고 관리하는 도구다.

프론트엔드 프로젝트에서 자주 보는 명령어가 있다.

npm install

이 명령어는 package.json에 적힌 패키지들을 설치한다.

예를 들어 프로젝트에서 React를 사용한다면 React 패키지가 필요하다.

Axios를 사용한다면 Axios 패키지가 필요하다.

이런 패키지 목록은 보통 package.json에 적혀 있다.

{
  "dependencies": {
    "react": "^19.0.0",
    "axios": "^1.0.0"
  }
}

정리하면 다음과 같다.

Node.js = JavaScript 실행 환경
npm = Node.js 패키지를 설치하고 관리하는 도구
package.json = 프로젝트에 필요한 패키지와 명령어를 적어두는 파일
node_modules = npm install로 설치된 패키지들이 들어가는 폴더

Dockerfile에서 다음 코드가 자주 나오는 이유도 이것이다.

COPY package.json ./
RUN npm install

의미는 다음과 같다.

package.json을 컨테이너 안으로 복사하고,
그 안에 적힌 패키지들을 설치한다.

9. 패키지와 라이브러리란 무엇인가

패키지와 라이브러리는 개발할 때 가져다 쓰는 기능 묶음이다.

예를 들어 날짜 계산 기능을 직접 만들 수도 있지만, 이미 만들어진 날짜 라이브러리를 사용할 수도 있다.

HTTP 요청 기능도 직접 만들 수 있지만, Axios 같은 라이브러리를 사용할 수 있다.

쉽게 말하면 다음과 같다.

라이브러리 = 가져다 쓰는 기능 묶음
패키지 = 배포 가능한 형태로 묶인 코드

Node.js에서는 npm으로 패키지를 설치한다.

PHP에서는 Composer를 사용한다.

Python에서는 pip을 사용한다.

언어마다 패키지 관리 도구가 다르다.

JavaScript / Node.js → npm
PHP → Composer
Python → pip

Docker는 이런 패키지 설치 과정도 이미지 안에 포함시킬 수 있다.


10. 포트란 무엇인가

포트는 컴퓨터 안에서 어떤 프로그램으로 연결할지 구분하는 번호다.

컴퓨터 하나에서는 여러 프로그램이 동시에 실행될 수 있다.

예를 들어 다음과 같이 실행될 수 있다.

프론트엔드 개발 서버 → 3000번 포트
백엔드 API 서버 → 8080번 포트
데이터베이스 → 5432번 포트

브라우저에서 다음 주소로 접속한다고 해보자.

http://localhost:3000

여기서 localhost는 내 컴퓨터를 의미한다.

3000은 포트 번호다.

즉 이 주소는 다음 의미다.

내 컴퓨터의 3000번 포트에서 실행 중인 프로그램에 접속한다.

Docker에서는 포트 연결이 중요하다.

컨테이너 안에서 프로그램이 3000번 포트로 실행되고 있어도, 내 컴퓨터의 3000번 포트와 연결하지 않으면 브라우저에서 접근할 수 없다.

그래서 다음과 같이 실행한다.

docker run -p 3000:3000 my-app

의미는 다음과 같다.

내 컴퓨터 3000번 포트 → 컨테이너 내부 3000번 포트

앞의 3000은 호스트 포트다.

뒤의 3000은 컨테이너 포트다.

-p 호스트포트:컨테이너포트

예를 들어 이렇게도 가능하다.

docker run -p 8080:3000 my-app

의미는 다음과 같다.

내 컴퓨터 8080번 포트 → 컨테이너 내부 3000번 포트

이 경우 브라우저에서는 localhost:8080으로 접속한다.


11. 환경변수란 무엇인가

환경변수는 실행 환경에 따라 달라지는 값을 저장하는 변수다.

예를 들어 같은 코드라도 개발 환경과 운영 환경에서 다른 값을 써야 할 수 있다.

대표적인 값은 다음과 같다.

- 데이터베이스 주소
- API 키
- 비밀키
- 실행 모드
- 외부 서비스 접속 정보

예시는 다음과 같다.

APP_ENV=local
DATABASE_URL=postgresql://user:password@host:5432/dbname
API_KEY=example-key

코드 안에 이런 값을 직접 적으면 위험하다.

특히 API 키, 비밀번호, DB 주소 같은 값은 GitHub에 올라가면 안 된다.

그래서 보통 .env 파일에 따로 저장한다.

Docker 컨테이너를 실행할 때는 이 환경변수를 컨테이너 안으로 전달해야 한다.

예시는 다음과 같다.

docker run --env-file .env -p 3000:3000 my-app

Docker Compose에서는 다음처럼 작성한다.

services:
  app:
    build: .
    env_file:
      - .env

정리하면 다음과 같다.

환경변수 = 실행 환경마다 달라지는 설정값
.env = 환경변수를 적어두는 파일
--env-file = Docker 컨테이너에 환경변수 파일을 전달하는 옵션

12. localhost란 무엇인가

localhost는 내 컴퓨터 자신을 의미한다.

브라우저에서 다음 주소를 입력하면

http://localhost:3000

의미는 다음과 같다.

내 컴퓨터의 3000번 포트로 접속한다.

Docker를 사용할 때 localhost는 조금 헷갈릴 수 있다.

내 컴퓨터에서 보는 localhost와 컨테이너 안에서 보는 localhost가 다를 수 있기 때문이다.

컨테이너 안에서 localhost는 컨테이너 자기 자신을 의미한다.

즉 컨테이너 안에서 실행 중인 앱이 데이터베이스에 접속할 때 localhost를 사용하면, 내 컴퓨터의 DB가 아니라 컨테이너 자기 자신 안에서 DB를 찾을 수 있다.

Docker Compose에서는 보통 서비스 이름으로 컨테이너끼리 연결한다.

예시는 다음과 같다.

services:
  app:
    build: .

  db:
    image: postgres:16

이 경우 app 컨테이너에서 DB에 접속할 때 주소를 localhost가 아니라 db로 사용할 수 있다.

DATABASE_URL=postgresql://user:password@db:5432/app_db

여기서 db는 Docker Compose에 정의한 서비스 이름이다.


13. Docker의 핵심 구조

Docker는 다음 흐름으로 동작한다.

Dockerfile 작성
→ Docker 이미지 생성
→ Docker 컨테이너 실행
→ 애플리케이션 실행

각 개념은 다음과 같다.

Dockerfile = 이미지를 만들기 위한 설명서
Image = 실행 환경이 포장된 결과물
Container = 이미지를 실행한 실제 실행 공간

14. Dockerfile이란 무엇인가

Dockerfile은 Docker 이미지를 만들기 위한 설정 파일이다.

프로젝트를 어떤 환경에서 실행할지 Dockerfile에 작성한다.

예시는 다음과 같다.

FROM node:20

WORKDIR /app

COPY package.json ./

RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "run", "dev"]

각 줄의 의미는 다음과 같다.

FROM node:20

Node.js 20이 설치된 이미지를 기반으로 시작한다.

WORKDIR /app

컨테이너 내부에서 작업할 폴더를 /app으로 설정한다.

COPY package.json ./

내 컴퓨터의 package.json 파일을 컨테이너 안으로 복사한다.

RUN npm install

이미지를 만들 때 npm 패키지를 설치한다.

COPY . .

현재 프로젝트 파일 전체를 컨테이너 안으로 복사한다.

EXPOSE 3000

이 컨테이너가 3000번 포트를 사용할 예정이라고 표시한다.

CMD ["npm", "run", "dev"]

컨테이너가 실행될 때 npm run dev 명령어를 실행한다.

정리하면 Dockerfile은 다음 역할을 한다.

이 프로젝트를 실행하려면
어떤 환경이 필요하고,
무엇을 설치해야 하고,
어떤 명령어로 실행해야 하는지
Docker에게 알려주는 파일

15. 이미지란 무엇인가

이미지는 컨테이너를 만들기 위한 실행 환경 패키지다.

Dockerfile을 기준으로 이미지를 만든다.

예를 들어 Node.js 프로젝트 이미지는 다음 정보를 포함할 수 있다.

- Node.js 20
- 작업 폴더
- package.json
- 설치된 npm 패키지
- 프로젝트 코드
- 실행 명령어
- 포트 정보

이미지는 실행 중인 프로그램이 아니다.

컨테이너를 만들기 위한 준비물이다.

정리하면 다음과 같다.

Dockerfile = 이미지 제작 설명서
Image = 설명서대로 만들어진 실행 환경 패키지
Container = 이미지를 실행한 실제 공간

이미지는 보통 다음 명령어로 만든다.

docker build -t my-app .

의미는 다음과 같다.

현재 폴더의 Dockerfile을 사용해서 my-app이라는 이미지를 만든다.

16. 컨테이너란 무엇인가

AD

제휴 광고 · 일부 링크는 수수료를 받을 수 있습니다

옆커폰

컨테이너는 이미지를 실행한 독립된 실행 공간이다.

이미지만 만들어서는 애플리케이션이 실행되지 않는다.

이미지를 실행해야 컨테이너가 만들어지고, 그 안에서 애플리케이션이 실행된다.

예시는 다음과 같다.

docker run -p 3000:3000 my-app

의미는 다음과 같다.

my-app 이미지를 컨테이너로 실행하고,
내 컴퓨터 3000번 포트를 컨테이너 3000번 포트와 연결한다.

컨테이너는 삭제할 수 있다.

컨테이너를 삭제해도 이미지는 남아 있을 수 있다.

이미지가 남아 있으면 같은 이미지로 컨테이너를 다시 만들 수 있다.

Image = 틀
Container = 그 틀로 실행한 실제 결과

17. Docker Hub란 무엇인가

Docker Hub는 Docker 이미지를 저장하고 내려받을 수 있는 저장소다.

GitHub가 코드를 저장하는 곳이라면, Docker Hub는 이미지를 저장하는 곳이다.

Dockerfile에서 다음 코드를 사용한다고 해보자.

FROM node:20

이때 Docker는 Node.js 20 이미지를 Docker Hub에서 내려받아 사용할 수 있다.

Docker Hub에는 다양한 공식 이미지가 있다.

node
php
python
mysql
postgres
redis
nginx
ubuntu

직접 운영체제부터 설정할 필요 없이, 이미 만들어진 공식 이미지를 기반으로 프로젝트 환경을 만들 수 있다.


18. Docker Desktop이란 무엇인가

Docker Desktop은 Windows와 Mac에서 Docker를 쉽게 사용할 수 있게 해주는 프로그램이다.

Docker를 사용하려면 Docker 엔진이 필요하다.

Docker 엔진은 이미지를 만들고 컨테이너를 실행하는 핵심 기능이다.

Windows나 Mac에서는 Docker Desktop을 설치하면 Docker 엔진, 설정 화면, 컨테이너 관리 기능을 함께 사용할 수 있다.

Windows에서는 보통 WSL 2와 함께 사용한다.

정리하면 다음과 같다.

Docker Engine = Docker의 핵심 실행 기능
Docker Desktop = Windows/Mac에서 Docker를 쉽게 쓰게 해주는 프로그램
WSL 2 = Windows 안에서 리눅스 환경을 사용할 수 있게 해주는 기능

설치가 끝나면 터미널에서 다음 명령어를 사용할 수 있다.

docker --version
docker run hello-world
docker ps
docker images

19. Docker Compose란 무엇인가

Docker Compose는 여러 컨테이너를 하나의 설정 파일로 관리하는 도구다.

실제 프로젝트는 앱 하나만 실행하지 않는 경우가 많다.

보통 다음과 같은 구성요소가 함께 필요하다.

- 웹 애플리케이션
- 데이터베이스
- Redis
- Nginx

이런 것들을 각각 명령어로 실행하면 관리가 복잡해진다.

Docker Compose는 compose.yml 또는 docker-compose.yml 파일에 여러 서비스를 정의하고 한 번에 실행한다.

예시는 다음과 같다.

services:
  app:
    build: .
    ports:
      - "3000:3000"

  db:
    image: postgres:16
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: app_db

실행 명령어는 다음과 같다.

docker compose up

종료 명령어는 다음과 같다.

docker compose down

정리하면 다음과 같다.

Docker = 컨테이너를 실행하는 도구
Docker Compose = 여러 컨테이너를 한 번에 관리하는 도구

20. 볼륨이란 무엇인가

컨테이너는 삭제될 수 있는 실행 공간이다.

컨테이너 안에만 데이터를 저장하면 컨테이너를 삭제했을 때 데이터도 함께 사라질 수 있다.

데이터베이스처럼 데이터가 계속 유지되어야 하는 경우에는 볼륨을 사용한다.

볼륨은 컨테이너 밖에 데이터를 저장하는 공간이다.

예시는 다음과 같다.

services:
  db:
    image: postgres:16
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

의미는 다음과 같다.

DB 데이터는 컨테이너 안에만 저장하지 않고,
db_data라는 볼륨에 저장한다.

그러면 DB 컨테이너를 삭제하고 다시 만들어도 데이터가 유지될 수 있다.

정리하면 다음과 같다.

컨테이너 = 삭제될 수 있음
볼륨 = 유지해야 하는 데이터를 저장하는 공간

21. Docker와 데이터베이스

Docker로 앱을 실행한다고 해서 데이터베이스가 자동으로 연결되는 것은 아니다.

앱이 데이터베이스에 연결하려면 데이터베이스 주소를 알아야 한다.

보통 환경변수로 관리한다.

예시는 다음과 같다.

DATABASE_URL=postgresql://user:password@host:5432/dbname

각 부분의 의미는 다음과 같다.

postgresql = 데이터베이스 종류
user = DB 사용자 이름
password = DB 비밀번호
host = DB 서버 주소
5432 = DB 포트
dbname = DB 이름

Docker에서 데이터베이스를 사용하는 방식은 크게 두 가지다.

1. 앱은 Docker로 실행하고, DB는 외부 DB 사용
2. 앱과 DB를 모두 Docker Compose로 실행

외부 DB는 Railway, Supabase, AWS RDS 같은 서비스를 사용할 수 있다.

로컬 개발에서는 Docker Compose로 DB 컨테이너를 같이 띄울 수도 있다.


22. 개발 DB와 운영 DB

실제 개발에서는 개발 DB와 운영 DB를 분리한다.

개발 DB = 테스트용 데이터베이스
운영 DB = 실제 서비스 데이터가 들어있는 데이터베이스

두 DB는 데이터가 같을 필요가 없다.

오히려 운영 데이터를 개발 환경에서 그대로 사용하는 것은 위험할 수 있다.

하지만 DB 구조는 같아야 한다.

여기서 구조는 다음을 의미한다.

- 테이블
- 컬럼
- 컬럼 타입
- 관계
- 인덱스
- 제약조건

예를 들어 운영 DB의 users 테이블에 email 컬럼이 있는데, 개발 DB에는 없다면 같은 코드가 정상적으로 동작하기 어렵다.

정리하면 다음과 같다.

개발 DB와 운영 DB의 데이터 = 달라도 됨
개발 DB와 운영 DB의 구조 = 같아야 함

23. 마이그레이션이란 무엇인가

마이그레이션은 데이터베이스 구조 변경 기록이다.

예를 들어 users 테이블에 nickname 컬럼을 추가한다고 가정한다.

이 변경을 개발 DB에만 적용하면 운영 DB에는 nickname 컬럼이 없다.

그러면 운영 환경에서 오류가 발생할 수 있다.

그래서 구조 변경을 마이그레이션 파일로 기록한다.

흐름은 다음과 같다.

개발 DB에서 구조 변경
→ 마이그레이션 파일 생성
→ 코드와 함께 저장소에 반영
→ 배포 시 운영 DB에 마이그레이션 적용

즉 마이그레이션은 개발 DB와 운영 DB의 구조를 맞추기 위한 변경 기록이다.

데이터를 똑같이 맞추는 것이 아니라, 구조를 맞추는 것이다.


24. Docker가 해결하는 것

Docker가 해결하는 핵심 문제는 실행 환경 차이다.

Docker가 도와주는 것은 다음과 같다.

- 언어 버전 통일
- 패키지 설치 방식 통일
- 실행 명령어 통일
- 포트 설정 명확화
- 로컬과 서버의 환경 차이 감소
- 컨테이너 단위 실행 관리

예를 들어 프로젝트마다 Node.js 버전이 다를 수 있다.

A 프로젝트는 Node.js 18을 사용하고, B 프로젝트는 Node.js 20을 사용할 수 있다.

이때 로컬 컴퓨터에 모든 버전을 직접 맞춰 설치하면 관리가 복잡하다.

Docker를 사용하면 프로젝트마다 필요한 실행 환경을 따로 정의할 수 있다.


25. Docker가 자동으로 해결하지 않는 것

Docker가 모든 문제를 해결하는 것은 아니다.

Docker가 자동으로 해결하지 않는 것은 다음과 같다.

- 데이터베이스 설계
- 운영 DB 보안
- 도메인 연결
- HTTPS 설정
- 서버 비용
- 배포 플랫폼 설정
- 로그 관리
- 백업 정책
- 장애 대응

Docker는 애플리케이션 실행 환경을 관리하는 도구다.

배포 전체를 대신해주는 도구는 아니다.

다만 배포 환경을 더 일정하게 만들 수 있게 도와준다.


26. Docker 기본 명령어

자주 사용하는 기본 명령어는 다음과 같다.

Docker 버전 확인

docker --version

Docker 설치 확인용 컨테이너 실행

docker run hello-world

실행 중인 컨테이너 확인

docker ps

전체 컨테이너 확인

docker ps -a

로컬 이미지 목록 확인

docker images

이미지 만들기

docker build -t my-app .

컨테이너 실행

docker run -p 3000:3000 my-app

컨테이너 로그 확인

docker logs 컨테이너명

컨테이너 내부 접속

docker exec -it 컨테이너명 sh

컨테이너 중지

docker stop 컨테이너명

컨테이너 삭제

docker rm 컨테이너명

이미지 삭제

docker rmi 이미지명

Docker Compose 실행

docker compose up

Docker Compose 종료

docker compose down

27. 전체 흐름 정리

Docker의 전체 흐름은 다음과 같다.

1. 프로젝트에 Dockerfile을 작성한다.
2. Dockerfile을 기준으로 이미지를 만든다.
3. 이미지를 실행해서 컨테이너를 만든다.
4. 컨테이너 안에서 애플리케이션이 실행된다.
5. 필요한 경우 포트를 연결한다.
6. 필요한 경우 환경변수를 전달한다.
7. 필요한 경우 DB 컨테이너나 외부 DB와 연결한다.

한 줄로 정리하면 다음과 같다.

Docker는 애플리케이션 실행 환경을 이미지로 만들고, 컨테이너로 실행하는 도구다.

28. Part 1 정리

Docker를 이해하기 위해 필요한 핵심 개념은 다음과 같다.

Docker
Linux
Kernel
Host
Container
Image
Dockerfile
Docker Desktop
WSL 2
Docker Hub
Docker Compose
Node.js
npm
Package
Port
Environment Variable
Volume
Database
Migration

각 개념을 짧게 정리하면 다음과 같다.

Docker = 실행 환경을 컨테이너로 관리하는 도구

Linux = 서버에서 많이 사용하는 운영체제

Kernel = 운영체제의 핵심 관리자

Host = Docker가 설치된 실제 컴퓨터

Container = 격리된 실행 공간

Image = 컨테이너를 만들기 위한 실행 환경 패키지

Dockerfile = 이미지를 만들기 위한 설명서

Docker Desktop = Windows/Mac에서 Docker를 쉽게 쓰게 해주는 프로그램

WSL 2 = Windows 안에서 리눅스 환경을 사용할 수 있게 해주는 기능

Docker Hub = Docker 이미지 저장소

Docker Compose = 여러 컨테이너를 한 번에 관리하는 도구

Node.js = JavaScript 실행 환경

npm = Node.js 패키지 관리자

Package = 설치해서 사용하는 기능 묶음

Port = 프로그램 접속을 구분하는 번호

Environment Variable = 실행 환경마다 달라지는 설정값

Volume = 컨테이너 밖에 데이터를 저장하는 공간

Database = 데이터를 저장하는 시스템

Migration = DB 구조 변경 기록

Docker의 핵심 목적은 실행 환경을 통일하는 것이다.

코드만 관리하는 것이 아니라, 코드가 실행되는 환경까지 함께 관리하기 위해 Docker를 사용한다.

AD

제휴 광고

일부 링크는 제휴 링크이며, 구매 또는 가입 시 일정 수수료를 받을 수 있습니다.

AD

'Docker' 카테고리의 다른 글

전체보기