이제 가상 컨테이너에서 실행되는 Docker(API, OS 이미지)와 이를 운영‧관리해주는 Docker Orchestration, 즉 Kubernetes(Kube, K8s) 를 알아본다.
현재 삼성전자, 삼성 SDS, 현대 기아 자동차 AI Labs 등에서 사용 중인 도구로,
Docker는 VMware, Virtual PC, Virtual Box(Oracle) 등과 같이 2013년에 등장한 컨테이너 기반 가상화 도구이다.
Go 언어(Go-lang) 로 작성되었으며, API는 리눅스 상의 계층화된 파일 시스템을 기반으로 한다.
일반적으로 Python, PHP, Ruby, Java 등의 언어로 개발된 애플리케이션은
다양한 라이브러리나 프레임워크를 사용하며,
버전 관리·보안 패치·함수 의존성 등의 문제로 인해 개발에 어려움을 겪을 수 있다.
Docker는 이러한 문제를 해결하기 위해 등장한 기술로,
컨테이너를 통해 어플리케이션을 안정적으로 운영·통제할 수 있도록 해준다.
즉, Kubernetes는 Docker를 기반으로 동작하며 일부 모듈이 컨테이너로 되어 있다.
| 구분 | Container | Virtual Machine (VM) |
|---|---|---|
| 실행 환경 | 호스트 OS 위에서 실행 | 하이퍼바이저(Hyper-V, VMware 등) 위에서 실행 |
| 구성 요소 | 커널 공유 + 독립된 실행 파일(binary)/라이브러리(library) | OS 전체 포함 |
| 오버헤드 | 매우 낮음 → 클라우드에 최적 | 높음 (OS 중복 실행) |
💡 오버헤드 비교: HyperVisor > VM > Container 순으로 크다.
import graphic, #include stdio| 구분 | VM (가상머신) | Container |
|---|---|---|
| 실행 방식 | HyperVisor 위에서 동작 | 호스트 OS 위에서 직접 동작 |
| 구성 요소 | 독립적 CPU, RAM, HDD 포함 → 이미지 크기 큼 | 라이브러리와 실행 파일만 포함 → 이미지 크기 작음 |
| 실행 속도 | 느림 | 빠름 |
| 구분 | Container | Virtual Machine (VM) |
|---|---|---|
| OS 커널 | 외부 호스트의 커널을 공유 | 각자 독립적인 OS 커널 보유 |
| 실행 환경 | 격리된 CPU 프로세스에서 실행 | 독립적인 OS 상에서 실행 |
| 자원 사용량 | 매우 적음 (디스크·메모리 효율적) | 비교적 많음 |
| 부팅 속도 | 수 초 내 실행 가능 | 수 분 이상 소요 |

| 계층 (Layer) | 주요 내용 | 해당 Apps / 예시 | 대응되는 OSI 계층 |
|---|---|---|---|
| Layer 6 | Development Workflow, Opinionated Containers | Docker Cloud, OpenShift, Cloud Foundry, Deis, Flynn 등 | 표현층 |
| Layer 5 | Orchestration / Scheduling Service Model | Kubernetes, Docker Swarm, Marathon/Mesos, Nomad, Diego 등 | 세션층 |
| Layer 4 | Container Engine | Docker, Rocket, RunC(OCI), OSv, LSC, LXD 등 | 전송층 |
| Layer 3 | Operating System | Ubuntu, RHEL, CentOS, Unikernels 등 | 네트워크층 |
| Layer 2 | Virtual Infrastructure | OpenStack, vSphere, EC2, GCP, AWS, Azure 등 | 데이터링크층 |
| Layer 1 | Physical Infrastructure | Raw Computer, Network, Storage 등 | 물리층 |
요약하자면,
컨테이너 환경은 OSI 7계층 구조를 응용해, 하드웨어(물리 인프라)부터 컨테이너 엔진과 오케스트레이션 계층까지 단계적으로 구성되어 있다.
CI/CD란 애플리케이션 개발 단계를 자동화하여 애플리케이션을 더욱 짧은 주기로 고객에게 제공하는 방법이다.
기본 개념은 다음 세 가지를 포함한다.
의미: 개발자들이 작성한 코드를 자동화된 프로세스를 통해 지속적으로 통합하는 과정
목표: 여러 개발자가 동시에 작업할 때 발생하는 코드 충돌 및 “통합 지옥(integration hell)” 문제 해결
방법:
Continuous Delivery
Continuous Deployment
대표적인 자동화 도구로는 다음이 있다.
Jenkins, CircleCI, TeamCity, Bamboo, GitLab CI/CD 등
요약하자면,
CI/CD는 Agile과 DevOps 문화를 기반으로 하여,
개발–테스트–배포 전 과정을 자동화하고
SRE 방식으로 시스템 안정성을 확보하는 현대적 소프트웨어 개발 패러다임이다.
컨테이너는 다음과 같은 특징 덕분에 가상 서버보다 우수한 애플리케이션 실행 환경을 제공한다.
요약하자면,
컨테이너는 효율성(자원 활용) + 속도(즉시 실행) + 유연성(환경 분리) 을 동시에 만족시키는
현대적 애플리케이션 실행 플랫폼이다.
컨테이너를 실행하기 위해서는 리눅스 커널 기반의 가상 서버가 필요하다.
Docker CE를 Mac이나 Windows에 설치할 경우,
이 구조는 하이퍼바이저 위에 Linux를 올리고, 그 위에서 컨테이너를 실행하는 형태다.
LinuxKit은 컨테이너 실행을 위한 경량 리눅스 서브시스템으로, Docker, IBM, ARM, MS, Intel 등이 공동 개발하였다.
| 구성 요소 | 설명 |
|---|---|
| Docker 데몬(Daemon) | 서버 단에서 도커 명령을 받아 컨테이너 및 이미지를 관리하는 핵심 엔진 |
| Docker 클라이언트(Client) | 사용자가 명령어를 입력하거나 외부 네트워크 요청을 통해 도커 데몬에 접근 |
| Docker 이미지(Image) | 컨테이너를 생성하기 위한 템플릿으로, 실행 환경과 애플리케이션을 포함 |
| Docker 레지스트리(Registry) | 이미지 저장소로, hub.docker.com과 같은 원격 저장소를 포함 |
요약하자면,
Docker는 리눅스 커널 기반의 경량 가상화 기술로,
클라이언트–데몬–이미지–레지스트리 구조를 통해
컨테이너 생성, 배포, 관리를 일원화한 오픈소스 플랫폼이다.
Docker는 서버 단의 도커 데몬(Daemon) 과 명령어로 제어되는 클라이언트(Client),
그리고 도커 이미지(Image) 및 레지스트리(Registry) 로 구성된다.
도커 데몬(Daemon)
| 명령어 | 설명 |
|---|---|
| docker build | 베이스 이미지에 기능을 추가하여 새로운 이미지를 생성 |
| docker pull | 원격 레지스트리(Docker Hub 등)에서 이미지를 다운로드 |
| docker run | 이미지를 기반으로 새로운 컨테이너를 생성 및 실행 |
| docker ps / docker container ls | 실행 중인 컨테이너 목록 확인 |
요약하자면,
Docker는 명령어 기반 제어 구조(CLI + API) 를 통해
클라이언트–데몬 간의 요청과 응답으로 컨테이너를 생성·배포·관리하는 체계적인 플랫폼이다.
로컬 호스트에 이미지가 없을 경우, 도커는 원격 레지스트리에서 자동으로 이미지를 다운로드(pull) 한 뒤 실행(run)한다.
docker pull jenkins # 원격 레지스트리에서 Jenkins 이미지 다운로드
docker run jenkins # 다운로드된 이미지로 컨테이너 실행
예: Nginx, CentOS 등의 이미지도 동일한 방식으로 실행된다.
Nginx 컨테이너는 Debian을 기반으로 생성됨.Dockerfile에 명시(Manifest) 한 뒤, 이를 빌드(build) 하여 생성한다.예시:
이 과정은 모두 자동화되어 수행된다.
| 명령어 | 설명 |
|---|---|
| docker run | 컨테이너를 실행한다. |
| docker stop | 실행 중인 컨테이너를 중지한다. |
| docker kill | 강제 종료한다. |
| docker rm | 컨테이너를 삭제한다. |
요약하자면,
Docker는
Dockerfile기반으로 이미지를 자동 생성하고,
run → stop → remove 순서로 컨테이너의 전체 라이프사이클을 제어할 수 있다.
docker start 명령으로 중지된 컨테이너를 다시 실행할 수 있다.Docker 컨테이너는 리눅스 커널 기반으로 실행되며,
사용되는 OS 버전에 따라 커널 버전이 다르다.
Docker CE 버전 16.04.0-ce 이상에서는 리눅스 커널 4.9.93-linuixkit-aufs를 사용한다.
리눅스 배포판마다 커널 버전이 달라도 실행 가능한 이유는,
도커가 ISO 표준화된 규격에 따라 호환성을 유지하기 때문이다.
| 구분 | 설명 |
|---|---|
| Docker Registry (도커 레지스트리) | 컨테이너 이미지가 저장되는 공간으로, 대표적으로 Docker Hub (hub.docker.com) 이 있다. |
| Docker Repository (도커 리포지토리) | 여러 도커 이미지를 모아둔 공간으로, 하나의 레지스트리 안에 여러 개의 리포지토리가 존재한다. |
예시:
docker run hello-world
→ Docker Hub의 공개 레지스트리에 등록된 hello-world 이미지를 다운로드하여
로컬에서 컨테이너로 실행한다.
| 유형 | 설명 | 대표 서비스 |
|---|---|---|
| a) 퍼블릭 레지스트리 | 누구나 자유롭게 접근 가능한 공개 저장소 | Docker Hub, Quay.io |
| b) 클라우드 레지스트리 | 퍼블릭 클라우드에서 제공하는 상용 저장소, 계정 인증 필요 | AWS ECR, Azure Container Registry, Google GCR, IBM Cloud Registry |
| c) 프라이빗 레지스트리 | 특정 조직이나 개인이 자체적으로 운영하는 폐쇄형 저장소 | Harbor, GitLab Container Registry, Docker Private Registry |
요약하자면,
Docker는 리눅스 기반의 표준화된 커널 위에서 작동하며,
이미지는 Registry → Repository → Container 순서로 관리되고 실행된다.
퍼블릭·클라우드·프라이빗 세 유형으로 구분되며, Docker Hub가 대표적이다.
Kubernetes도 Docker처럼 레지스트리(Registry) 에서 이미지를 다운로드받아 컨테이너를 실행한다.
이 과정은 다음과 같다:
docker build 명령으로 이미지 빌드docker push 명령으로 이미지를 레지스트리에 등록kubectl 명령으로 매니페스트(Manifest)에 기재된 오브젝트(Object) 생성 요청즉, Kubernetes는 Docker 이미지를 활용해 컨테이너를 관리한다.
dockerd) 없이도 작동 가능하다.요약하자면,
Kubernetes는 Docker 이미지를 기반으로 컨테이너를 실행하지만,
Containerd 중심의 경량 런타임 환경으로 전환 중이다.
이는 Kubernetes의 독립성과 효율성 향상을 위한 진화 과정이다.
Docker는 UnionFS 계열의 파일 시스템을 사용한다.
→ 서로 다른 파일 시스템의 디렉터리를 하나의 통합된 파일 시스템처럼 사용하는 기술.
주요 유형: aufs, btrfs, overlay2
aufs가 기본이었으나,overlay2 가 표준으로 채택되었다.overlay2는 속도가 빠르고 구조가 단순하다는 장점이 있다.
Kube는 컨테이너의 조직과 관리, 스케줄링, 서비스 발견, 모니터링 등을
체계적으로 통합한 Orchestration(오케스트레이션) 도구이다.
주요 기능
기업들은 이를 활용해 연산(Computing) 능력을 확장하고,
GPU 자원을 묶어 대규모 연산 처리를 수행할 수 있다.
(예: AWS 인스턴스, GPU 연산 노드 등)
Hadoop EcoSystem처럼 Kubernetes도 다양한 오픈소스 툴과 연동된다.
대표 구성 도구:
Fluentd, Elastic, Kibana, Jenkins, Prometheus, Grafana, Helm 등
→ 이들 도구가 통합되어 Kubernetes EcoSystem을 구성하며,
클라우드 환경에서 완전한 서비스 자동화 및 모니터링 체계를 구축할 수 있다.
요약하자면,
네임스페이스와 cgroup이 리눅스 컨테이너의 기반 기술이라면,
Kubernetes는 이를 클라우드 수준으로 확장하여
오케스트레이션 + 모니터링 + 확장성을 통합 제공하는 플랫폼이다.

개발 및 운영에 필요한 Add-on 서비스를 All-in-One 형태로 제공하므로
별도의 추가 비용이 발생하지 않는다.
예:
요약하자면,
Kubernetes EcoSystem은 다양한 오픈소스 도구를 통합하여
비용 절감 + 운영 효율화 + 확장성 향상을 동시에 실현하는
클라우드 기반의 컨테이너 오케스트레이션 플랫폼이다.
🔑 Docker와 Kubernetes의 모든 작업은
root권한으로 실행하는 것이 좋다.
멀티 모드 하둡(Multi-Mode Hadoop) 환경 구축
Master 노드에 Docker 설치
master, slave1, slave2 노드에 순차적으로 Docker Swarm 및 Kubernetes 설치관리 도구 사용
요약하자면,
Docker 및 Kubernetes 실습 환경 구축 시
Ubuntu 18.04 이상(권장: 20.04 Live-Server) 환경에서
root권한으로 설치 및 실행하는 것이 가장 안정적이며,
Ansible 기반 자동화 관리를 통해 클러스터 운영 효율성을 높일 수 있다.
실습

/etc/docker/docker.json 설정 파일

도커 설치 과정을 해주고
sudo systemctl status docker

docker COMMAND --help
→ 각 명령어(COMMAND)의 옵션과 세부 설명을 확인할 수 있다.
| 명령어 | 설명 |
|---|---|
| run | 이미지를 기반으로 새로운 컨테이너를 생성하고 실행한다. 예: -it 옵션을 주면 컨테이너 쉘로 진입 가능 (docker run -it ubuntu /bin/bash) |
| exec | 이미 실행 중인 컨테이너 안에서 명령어를 실행한다. |
| ps | 현재 실행 중인 컨테이너 목록을 확인한다. |
| images | 로컬에 저장된 이미지 목록을 출력한다. |
| create | 컨테이너를 생성만 하고 실행하지 않는다. (보통 docker run 명령이 더 자주 사용됨) |
| attach / detach | 실행 중인 컨테이너에 접속하거나(background/foreground 전환), 분리(detach)한다. |
| start | 중지(stopped)된 컨테이너를 다시 시작한다. |
| stop | 실행 중인 컨테이너를 정지시킨다. |
| rm / rmi | 컨테이너(rm) 또는 이미지(rmi)를 삭제한다. |
| inspect | Docker 객체(이미지, 컨테이너 등)에 대한 자세한 정보를 출력한다. |
| commit | 실행 중인 컨테이너를 새로운 이미지로 저장한다. (즉, Bare Image → Custom Image 생성 과정) |
run → exec → stop → start → rm 순으로 실습하면
docker ps,
docker ps -a

4개 실행
각각의 하나의 프로세스임.
Docker Image는
다양한 스냅샷 형태로 제공되며, 대부분 무료로 사용할 수 있다.
필요한 이미지는 Docker Hub에서 다운로드하거나
직접 Dockerfile을 작성하여 생성할 수도 있다.
docker build -t myimage .
docker run myimage
실행 시 외부 Ubuntu 상의 프로세스 중 하나로 컨테이너 형태로 동작한다.
여러 개의 Ubuntu 머신(노드)을 구성하면,
각 노드에서 여러 컨테이너(Kubernetes에서는 Pod)가 실행된다.
이때 컨테이너와 노드를 관리하는 방식에는 두 가지가 있다:
→ Kubernetes는 노드 및 컨테이너를 통합적으로 관리하며,
클러스터 전체의 상태를 제어한다.
요약하자면,
Docker Image는 OS·App·DB 등 다양한 환경을 스냅샷 형태로 제공하며,
Docker Swarm과 Kubernetes는 이를 분산 환경에서 관리하는 오케스트레이션 도구로 작동한다.





respective(각각의)

옆에 보라색 마크는 우수마크

docker pull rockylinux:8
docker pull centos:7

docker images
기존 버전의 거의 1/10 수준의 크기를 가짐.

docker run rockylinux:8 => 포그라운드(foreground) 실행
docker run -d rockylinux:8 => 백그라운드 실행
3699ff7d6ada3a9d85255354a5efab17bd903abb47179670873f9d305667968d

| 구분 | 이미지명 | 용량 | 특징 |
|---|---|---|---|
| CentOS 7 | centos:7 | 약 450MB 이상 | 안정적이지만 이미지 크기가 큼 |
| Rocky Linux 8 | rockylinux:8 | 약 204MB | CentOS 계열 대체 OS, 크기가 작음 |
| Alpine Linux | alpine:latest | 약 20MB | 초경량, Docker 환경에 최적화 |
| Rocky (Full ISO) | Rocky8.9 ISO | 약 4.6GB | OS 전체 설치 이미지 (Docker용 아님) |
➡️ Alpine Linux는 20MB 수준으로 매우 가볍기 때문에
시스템 리소스가 부족한 환경(예: IoT, 소형 서버, Docker Cluster)에 최적화되어 있다.
즉, 리소스 제약이 있는 환경에서는 Alpine이나 BusyBox 기반 이미지가
Docker 컨테이너 운영 효율을 극대화하는 선택이다.
→ 결과적으로 업데이트 부담이 없고,
외부 Ubuntu 호스트 노드에도 부하가 적다.
요약하자면,
Docker Hub에서 제공되는 Bare Image는 순수한 기본 OS 이미지이며,
조직은 이를 기반으로 커스터마이즈하여 자체 CI/CD 환경에서
효율적이고 가벼운 배포 시스템을 구축할 수 있다.
-d 옵션 (detach mode) 실습 정리-d 옵션의 의미-d 옵션을 사용하면 컨테이너가 백그라운드 모드(detach mode) 로 실행된다.docker stop 명령을 실행해야 한다.💡 웹서버나 데이터베이스처럼 지속적으로 동작해야 하는 서비스를 실행할 때 유용하다.
여러 컨테이너를 동시에 띄워야 할 때에도 효과적이다.
a. docker run -d --name my_doc1 nginx:latest
→ nginx 컨테이너를 백그라운드로 실행
b. docker ps
→ 현재 실행 중인 컨테이너 목록 확인
c. docker stop my_doc1
→ 컨테이너 중지
d. docker ps
→ 실행 중인 컨테이너 없음
e. docker ps -a
→ 중지된(Exited) 상태의 컨테이너 포함 전체 목록 출력
f. docker start my_doc1
→ 중지된 컨테이너 다시 시작
g. docker ps
→ 다시 실행 중인 컨테이너로 표시됨
-d 옵션 없이 실행할 경우docker run nginx
Ctrl + C 로 직접 중단해야 함-it 옵션docker run -it ubuntu /bin/bash
-it = -i(interactive) + -t(pseudo-TTY)| 실행 옵션 | 실행 형태 | 터미널 사용 | 종료 방식 | 주용도 |
|---|---|---|---|---|
docker run -d | 백그라운드 | 가능 | docker stop | 서비스 실행용 |
docker run | 포그라운드 | 불가 | Ctrl + C | 단발성 실행 |
docker run -it | 인터랙티브 | 쉘 진입 | exit | 디버깅 / 실습용 |

몇 개로 나눠서 다운 받는 모습을 볼 수 있다.
=> 공통적인 부분을 Layer로 각각 구분해서 Cached에 넣어두면 상위 버전을 다운 받을 때 중복되는 부분은 바로 다시 캐시 메모리에서 바로 받고, 중복되지 않는 일부분만 받으므로 매우
빠르게 다운로드됨.

docker start mydoc1 해야
ps에서 보임.

docker run --name mydoc2 nginx:latest
포어그라운드에서 실행되면, 사용자는 현재 터미널을 사용할 수 없다.

새로운 터미널을 열어봄.
종료후

안보임.

멈춘 것을 확인

다시 start 명령어로 살릴 수 있음.



로그를 이렇게도 볼 수 있음
docker는 컨테이너 id, name 둘다 사용이 가능함

| 명령어 | 주요 용도 | 비고 |
|---|---|---|
| docker create | 새로운 컨테이너를 생성만 할 때 사용 | ⚠️ 잘 사용하지 않음 (보통 docker run으로 대체됨) |
| docker run | 이미지를 최초 실행할 때 사용 (없으면 자동 다운로드 후 실행) | 가장 자주 사용 |
| docker start | docker ps -a에서 Exited 상태인 컨테이너를 다시 실행할 때 | 중지된 컨테이너 재시작 |
| docker exec -it <컨테이너명> /bin/bash | 실행 중인 컨테이너에 들어가서 콘솔 명령어를 실행할 때 | 디버깅 및 설정용 |
| docker stop <컨테이너명> | docker ps로 확인된 실행 중 컨테이너를 일시 정지할 때 | 컨테이너 종료 |
| docker restart <컨테이너명> | docker stop으로 정지된 컨테이너를 다시 시작할 때 | stop + start 결합 기능 |
CONTAINER_ID보다 NAME으로 지정하는 것이CONTAINER_ID도 인식되지만, 너무 길어서 실무에서는 주로 --name 옵션을 사용한다.docker run -d --name mynginx nginx:latest # 컨테이너 실행
docker ps # 실행 상태 확인
docker exec -it mynginx /bin/bash # 내부 접속
docker stop mynginx # 중지
docker start mynginx # 재시작
docker rm mynginx # 삭제

docker는 데이터를 저장할 수 없기 때문이다.

ctrl+pq
| 상황 | 데이터 유지 여부 | 설명 |
|---|---|---|
docker stop → docker start | ✅ 유지됨 | 컨테이너의 파일시스템이 그대로 남아 있기 때문에 Exited 후 재시작해도 데이터 존재 |
docker rm (삭제) | ❌ 사라짐 | 컨테이너 자체가 삭제되므로 내부 데이터도 완전히 제거됨 |
docker run (새로 생성) | ❌ 새 컨테이너라 데이터 없음 | 같은 이미지라도 완전히 새로운 인스턴스이므로 데이터는 새로 초기화됨 |
| Volume 또는 Bind Mount 사용 시 | ✅ 영구 유지 | /var/lib/docker/volumes 또는 호스트 디렉터리에 저장되어 컨테이너 삭제 후에도 유지 가능 |
1️⃣ 컨테이너 생성 및 데이터 작성
docker run -it --name test1 centos:7 /bin/bash
echo "hello" > /tmp/data.txt
exit
2️⃣ 종료 후 다시 실행
docker start -ai test1
cat /tmp/data.txt
# 출력: hello ✅ (데이터 유지)
3️⃣ 컨테이너 삭제 후 재생성
docker rm test1
docker run -it --name test1 centos:7 /bin/bash
cat /tmp/data.txt
# 출력: No such file or directory ❌ (데이터 사라짐)
stop 상태에서는 이 계층이 그대로 보존되지만,rm으로 삭제하면 Writable Layer 자체가 사라져서 모든 변경 내용이 날아가요.✅ 정리 문장으로 기억
stop은 멈춤, 데이터 유지rm은 삭제, 데이터 소멸- 영구 보존하려면 Volume을 써라
“실제 Docker 컨테이너를 관리하는 하루 시나리오”처럼 자연스럽게 흐르는 예시
이걸 한 번 직접 따라 치면 run → exec → stop → start → ps → ps -a 흐름이 몸에 익습니다.
docker run)처음으로 Nginx 서버를 띄워보자.
docker run -d --name web1 nginx:latest
📘 의미:
nginx:latest이미지를 다운로드하여web1이라는 이름의 컨테이너를-d(백그라운드 모드)로 실행
이제 브라우저에서 localhost:80 으로 접속하면 nginx 화면이 보입니다.
docker ps)docker ps
✅ 결과: web1 컨테이너가 “Up” 상태로 표시됨
docker exec)docker exec -it web1 /bin/bash
📘 의미:
- 실행 중인
web1컨테이너에 접속해서 bash 쉘로 명령 실행- 즉, 컨테이너 안의 “작업 현장”으로 들어간다.
컨테이너 내부에서 확인:
root@web1:/# echo "Hello Docker!" > /usr/share/nginx/html/index.html
이제 브라우저 새로고침 → "Hello Docker!" 페이지가 뜸 🖥️
docker stop)하루 작업이 끝나서 서버를 잠시 내린다.
docker stop web1
컨테이너가 정상 종료(Exited 상태)로 바뀜
docker ps vs docker ps -a)docker ps
아무것도 안 나옴 (실행 중인 컨테이너 없음)
docker ps -a
web1이 “Exited” 상태로 표시됨
docker start)서버를 다시 가동해보자.
docker start web1
web1이 다시 Up 상태로 전환됨 (데이터 유지됨)
docker ps)docker ps
web1이 Up 상태로 다시 표시됨.
(아까 만들었던 “Hello Docker!” 페이지 그대로 유지됨 ✅)
docker rundocker psdocker execdocker stopdocker startdocker ps -adocker run -d --name web1 nginx
docker ps
docker exec -it web1 /bin/bash
docker stop web1
docker ps
docker ps -a
docker start web1
docker ps
✅ 이해 포인트
run은 “처음부터 새로”exec은 “이미 켜진 데 접속”stop은 “잠시 멈춤”start는 “다시 켜기”ps, ps -a는 “상태 확인 도구”[ 이미지 (Image) ]
│
▼
┌──────────────────────────────┐
│ docker run │
│ ▶ 새로운 컨테이너 생성 + 실행 │
└──────────────────────────────┘
│
▼
┌──────────────────────────────┐
│ 실행 중 (Running) │
│ • docker exec → 내부 접속 │
│ • docker ps → 실행 확인 │
│ • docker stop → 정지 │
└──────────────────────────────┘
│
▼
┌──────────────────────────────┐
│ 정지됨 (Stopped / Exited) │
│ • docker start → 재시작 │
│ • docker rm → 삭제 │
│ • docker ps -a → 전체 확인 │
└──────────────────────────────┘
│
▼
┌──────────────────────────────┐
│ 삭제됨 (Removed) │
│ • 다시 시작 불가 │
│ • docker run 으로 새로 생성 │
└──────────────────────────────┘