클라우드 정리(Docker2)

열공하는웅2·2025년 11월 4일

클라우드

목록 보기
4/13

🐳 Docker 컨테이너 실행 및 관리 명령어 정리

1️⃣ 컨테이너 실행 및 이름 지정

  • docker run ~ 명령어로 이미지를 실행할 때
    --name 옵션을 주지 않으면 임의의 이름(A)이 자동 부여됨.
    이후 docker rename A B 명령으로 이름 A를 B로 변경 가능.

2️⃣ Exited 상태의 컨테이너 재실행

  • docker ps -a 명령으로 Exited 상태의 컨테이너를 확인할 수 있음.
  • 이 경우 docker start <컨테이너명> 으로 먼저 컨테이너를 실행.

3️⃣ 컨테이너 재시작

  • docker restart <컨테이너명>
    → 내부적으로 docker stopdocker start 순으로 실행됨.
    멈춘 컨테이너를 다시 살릴 때 사용.

4️⃣ 실행 중인 컨테이너 접속

  • docker exec -it <컨테이너명> /bin/bash
    → 실행 중인 컨테이너 내부의 셸로 접속 가능.

5️⃣ 바로 셸로 들어가며 컨테이너 실행하기

  • 처음부터 바로 셸로 진입하려면

    docker run -it --name=rocky3 rockylinux:8 /bin/bash

    명령을 사용하면 됨.


rename 옵션

exit -> start -> exec => 데이터 남아있음.

docker rm -f => 컨테이너 삭제

docker rmi -f => 이미지 삭제

docker ps -aq => 컨테이너 id만 차례로 출력

docker rm -f $(docker ps -aq) => 명령어 안에서 삭제

docker rmi -f $(docker images)


Ubuntu 안에 Rockylinux 설치 그리고 Rocky안에 git 설치


🐳 Docker 컨테이너와 CPU 처리 방식 정리

1️⃣ Docker 컨테이너에서 프로그램 설치

  • 컨테이너 셸에서 다음 명령어를 입력하면 빠르게 업데이트 및 설치가 가능하다.

    yum update && yum -y install git
  • 도커 컨테이너는 CPU의 프로세스로 실행되기 때문에 매우 빠르게 업데이트되고 프로그램이 설치된다.


2️⃣ Monolithic vs MicroProcess 방식

  • Monolithic 방식으로 올려서 실행하는 것이 더 빠르다.
  • 그러나 Docker처럼 CPU에서 작업시키는 MicroProcess 방식가장 빠르다!

3️⃣ CPU, RAM, GPU의 역할

  • 일반적으로 마더보드에는 RAM(일반적인 DRAM)
    CPU(Central Processing Unit) 이 장착되어 있다.
  • CPU는 SRAM과 Cache Memory를 사용하여 더 빠른 데이터 접근이 가능하다.
  • 그래픽 연산 등 리소스를 많이 소모하는 작업은 GPU(Graphics Processing Unit) 를 통해 처리한다.
  • GPU를 사용하면 Big Data 같은 대용량 데이터 처리 속도가 매우 빨라지며,
    이것이 바로 NVIDIA가 성장한 이유이다.

4️⃣ MPU(Memory Protection Unit)

  • 이러한 MicroProcess 구조에서 사용되는 CPU는
    특별히 MPU (Memory Protection Unit) 라고 부른다.

docker commit rocky8-1 rocky-git => 기존이미지에서
새로운 이미지를 만들 때 commit을 사용한다.

docker images => images확인.

git가 설치 되어 있는 images를 가지고 태어났기 때문에
별도의 설치없이 git을 내장하고 있음을 보임.


🐳 Docker Image 생성 방법 정리

1️⃣ 기존 Bare Image 활용

  • Bare Image (예: nginx:latest)는
    https://hub.docker.com 에서 docker pull nginx:latest 식으로 받을 수 있는 Official Image이다.
  • 여기에 CI/CD 개념으로 필요한 설정을 추가하여 새로운 이미지를 생성할 수 있다.
  • 새로운 이미지를 만드는 방법은 여러 가지가 있다:

a) docker commit 방식

  • 기존 컨테이너의 변경사항을 새로운 이미지로 저장:

    docker commit 기존_NAME 새로운_NAME

    예시:

    docker commit rocky8 rocky8-git

    → 기존 rocky8 컨테이너가 rocky8-git이라는 새로운 이미지로 생성됨.


b) Dockerfile 방식

  • Dockerfile이라는 스크립트 파일을 만들어
    필요한 모듈과 설정을 추가하여 새로운 이미지를 생성할 수 있음.
  • 기업체에서는 반복 작업을 자동화하기 위해 주로 이 방법을 사용.

c) docker image tag 방식

  • 기존 이미지의 태그(TAG)만 변경하여 새로운 이미지로 생성:

    docker image tag rockylinux:8 rockylinux:latest

    → 동일한 이미지지만 태그를 새로 붙여 관리할 수 있음.




🌐 Nginx 컨테이너 포트 연결 및 리다이렉트 설정

  • Nginx를 실행하면 자동으로 외부에서 웹사이트와 연결될 수 있도록 설정된다.
    docker ps 명령어로 확인하면 PORTS 항목에 80/tcp로 표시된다.

  • 그러나 이 80번 포트는 컨테이너 내부 포트로,
    외부에서 접근 시 컨테이너를 호스팅하고 있는 Ubuntu 노드의 포트를 통해 연결된다.

  • 따라서 외부에서 컨테이너의 80번 포트에 접근할 수 있도록
    Ubuntu 노드의 포트(예: 8080) 와 연결되도록 Port Redirect(포트 포워딩) 를 설정해야 한다.

  • 즉, 외부에서는 Ubuntu:8080으로 접속하면
    내부적으로 컨테이너의 80번 포트로 연결되어 웹사이트에 접근할 수 있다.

  • 또한 '컨테이너의 IP_주소:80'을 직접 선택해도
    컨테이너 내부 웹사이트로 접근할 수 있다.


docker run -p 8080:80 -d nginx:latest

8080으로 접속

nginx 디폴트 홈페이지가 보이는 것을 볼 수 있다.
(컨테이너의 페이지)

다른 pc에 가도 보임.


docker run -d --name wordpressdb -e MYSQL_ROOT_PASSWORD=rootoor -e MYSQL_DATABASE=wordpress mysql:5.7


docker run -d -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=rootoor --name wordpresshomepage --link wordpressdb:mysql -p 80 wordpress:latest

docker exec wordpresshomepage curl mysql:3306 --silent

mysqladmin variables -u root -prootoor

깔끔하게 볼 수 있다.


🌐 컨테이너 IP 주소 설정 및 연결 방식

  • 컨테이너에 IP 주소를 직접 부여하여 실행할 수 있다.
  • 컨테이너도 보통 Class A나 Class B 주소 (예: 10.0.0.0/8, 172.17.0.0/16) 를 사용하여
    외부로 노출되는 가상 IP 주소를 가질 수 있다.
  • 컨테이너 내부에서 ifconfig 명령으로 확인 가능하지만,
    외부에서 접근하려면 호스트 노드의 특정 포트와 컨테이너의 포트를 매핑(Port Redirect) 해야 한다.
    → 즉, 외부에서는 컨테이너의 IP로 직접 연결할 수 없다.

🧩 Kubernetes 환경에서의 접근 방식

  • 컨테이너의 IP 주소로 직접 접근하려면,
    Kubernetes의 Service 리소스를 이용해야 한다.
  • 가상 머신처럼 컨테이너들을 통제하는 Kubernetes는
    auto-scale 기능을 제공한다.
    예를 들어, 4개의 웹 서버를 실행 중 하나가 다운되면
    자동으로 새로운 컨테이너를 띄워 4개가 항상 유지되도록 한다.
  • 이 경우 기존 컨테이너가 사용하던 IP는 사라지고
    새 컨테이너가 새 IP를 받게 된다.
    따라서 고정된 IP로 직접 접근하는 것은 드물다.

A~B클래스를 쓰는 이유는 너무 많기 때문이다.



☸️ Kubernetes의 Auto-Scale 및 Service IP 동작 원리

  • Kubernetes는 내부적으로 컨테이너(Pod)가 죽거나 비정상 종료되더라도,
    Auto-scale 기능을 통해 항상 지정된 개수의 컨테이너를 유지한다.
    예를 들어 웹 서버 4개를 운영 중 하나가 죽으면,
    자동으로 새로운 컨테이너가 생성되어 다시 4개가 유지된다.

  • 이때 각 컨테이너는 새로운 IP를 할당받지만,
    외부 사용자는 이러한 변경을 인식하지 못한다.
    그 이유는 외부 접속이 컨테이너의 개별 IP가 아니라
    Service 리소스가 가진 고정 IP(ClusterIP, NodePort, LoadBalancer 등) 로 이루어지기 때문이다.

  • 즉, 내부 Pod는 교체되더라도,
    외부에서는 Service의 고정 IP만 바라보기 때문에
    서비스는 중단되지 않고 지속적으로 연결이 유지된다.


Container 도 주소를 가짐

docker0: 게이트웨이 주소


ip addr


docker ps

컨테이너 하나가 각각의 인터페이스를 가지고 있음을 알 수 있음.



💽 Docker Volume

외부 Ubuntu 노드 안에서 실행되는 Docker Image 컨테이너는
OS나 APPs 이미지를 실행하고 있다.

Docker Volume은 노드 안에서
컨테이너 ↔ 컨테이너, 외부 Ubuntu 노드 ↔ 컨테이너 사이를 연결해서
데이터, 파일, 폴더 등을 공유시켜 준다.

예를 들어, MySQL과 같은 데이터베이스 컨테이너에서 작업한 결과 데이터는
외부 Ubuntu 노드의 하나의 CPU 프로세스에서 해당 컨테이너가 삭제될 때 함께 사라지므로
‘컨테이너 ↔ 컨테이너’, ‘노드 ↔ 컨테이너’ 간의 데이터 처리를
다른 컨테이너나 외부 Ubuntu 노드의 Host와 공유시켜주면 데이터를 지속적으로 저장할 수 있다.


📦 컨테이너가 외부 볼륨을 이용하는 방법

컨테이너가 외부 볼륨을 이용하는 기본 방식에는 다음이 있다.

a. 외부 Ubuntu 노드의 볼륨 이용
b. 다른 컨테이너를 이용하는 컨테이너 볼륨 이용
c. 모든 컨테이너들이 공동으로 이용할 수 있는 NAS 서버와 같은 도커 볼륨 이용


nginx는 그 자체이기 때문에 var/www/html/index.html 대신

이 위치에 파일이 있다.

docker run --name website1 -v $(pwd):/usr/share/nginx/html:ro -p 3010:80 -d nginx:latest
docker run --name website2 -v $(pwd):/usr/share/nginx/html:ro -p 3011:80 -d nginx:latest
docker run --name website3 -v $(pwd):/usr/share/nginx/html:ro -p 3012:80 -d nginx:latest

3010

3011

3012

한 곳 만 변경을 진행해주면,

모든 포트의 내용이 변경됨.

변경된 내용확인 가능하다.(website2 랜덤으로)

docker run --name website5 -v $(pwd):/usr/share/nginx/html:rw -p 8889:80 -d nginx:latest

rw 옵션으로 진행.

내용이 같음을 확인

내부작업

외부작업이 원활하게 이동이 가능하다.

외부에서도 그래픽을 두고 설정이 가능함.

docker volume

docker에서는 외부 HDD의 정보도 가져올 수 있고, 다른 컨테이너에서도 가져올 수 있다.

docker run --name website6 --volumes-from website5 -p 9090:80 nginx:latest

볼륨의 기본 위치


🧩 1️⃣

echo "IM DOCKER_VOL" > /var/lib/docker/volumes/myvol/_data/myvol.lst

➡ 이건 도커 볼륨 내부에 실제 파일을 직접 만들어 넣은 겁니다.

  • /var/lib/docker/volumes/
    → 도커가 볼륨 데이터를 저장하는 실제 호스트 경로입니다.
  • myvol/_data/
    myvol 이라는 이름의 볼륨에 연결된 실제 폴더입니다.
  • myvol.lst
    → 거기에 만든 파일 이름.

즉,
"IM DOCKER_VOL" 이라는 문자열이 담긴 myvol.lst 파일을
도커 볼륨에 미리 만들어 둔 겁니다.


🧩 2️⃣

docker run -it --name myvol_1 -v myvol:/root/ ubuntu:18.04

➡ 이 명령은 myvol 볼륨을 새 컨테이너의 /root 디렉터리에 마운트한 겁니다.

  • -it → 터미널 접속용 (interactive + tty)
  • --name myvol_1 → 컨테이너 이름 지정
  • -v myvol:/root/도커 볼륨 myvol을 컨테이너 내부의 /root 위치에 연결
  • ubuntu:18.04 → Ubuntu 이미지 기반 컨테이너 실행

🧩 3️⃣

ls /root/

➡ 컨테이너 내부에서 /root 를 확인하니까
myvol.lst 파일이 보이죠.

✅ 즉, 호스트의 /var/lib/docker/volumes/myvol/_data/ 안에 있던 파일이
컨테이너 내부 /root 로 연결되어 보이는 겁니다.


💡 정리하면

구분경로설명
호스트/var/lib/docker/volumes/myvol/_data/myvol.lst실제 파일이 저장된 물리 위치
컨테이너 내부/root/myvol.lst마운트되어 접근 가능한 가상 경로
마운트 옵션-v myvol:/root/이 둘을 연결한 명령

✅ 결과적으로

  • 도커 볼륨(myvol)은 컨테이너가 종료돼도 데이터가 유지됩니다.
  • 컨테이너를 지우고 새로 만들어도 -v myvol:/root/ 만 붙이면
    같은 데이터(myvol.lst)가 그대로 다시 보입니다.

🌐 도커 네트워크

조직에서 AWS와 같은 상용 클라우드(On-Demand)나 로컬(On-Premise) 환경에서
수십 대의 가상머신을 생성해 네트워크를 구성할 때는
다른 조직의 네트워크와 구별되어야 하기 때문에,
조직만의 네트워크 설정이 중요하다.


🧩 도커 컨테이너의 네트워크 구조

  • 도커 컨테이너 가상머신 내부 셸에서 ifconfig 명령을 실행하면
    eth0lo가 보이며, 도커는 내부 IP 주소(172.17.0.10, …)를
    순차적으로 컨테이너에 할당한다.

  • 하지만 이 내부 IP 주소는 컨테이너를 재시작할 때마다 변경될 수 있으며,
    도커가 설치된 외부 Ubuntu 노드에서만 접근 가능하다.
    즉, 내부망 IP 주소로는 외부와 직접 연결되지 않는다.

  • 외부에서는 Port Redirect(포트 포워딩) 방법으로
    포트를 통해 컨테이너에 접근할 수 있다.


🧩 Ubuntu 노드의 네트워크 인터페이스

Ubuntu 셸에서 ip addr 명령을 실행하면 다음과 같은 인터페이스들이 보인다:

  • ens33 → Ubuntu의 NIC(물리 네트워크 카드)
  • lo → Ubuntu의 localhost (127.0.0.1, loopback address)
  • veth → 외부에서 본 컨테이너의 가상 인터페이스
    (veth는 외부 노드의 ens33과 도커의 docker0를 통해 연결된다.)
  • docker0 → 브리지(bridge)로서 각 컨테이너의 veth들을 연결해주는 스위치 역할을 한다.
    외부 노드의 ens33과 내부 컨테이너를 연결시키는 가상 네트워크 허브 역할을 수행한다.

🧩 Kubernetes와의 관계

  • Kubernetes에서는 Service라는 모듈이 위와 같은 스위치 및 라우팅 역할을 수행한다.
  • 외부에서 들어오는 패킷은 Ubuntu 노드의 ens33 → docker0 → 컨테이너의 veth 순으로 전달된다.
  • 즉, 도커 내부에는 ens33과 연결된 docker0(스위치/브리징-veth와 바인딩)이 존재하며,
    이를 통해 도커 컨테이너 간 가상머신들이 외부로 나가거나 외부에서 들어올 수 있게 된다.


🌉 디폴트 docker0 브리지에 컨테이너 가입하기

컨테이너를 생성하면 기본적으로 docker0 브리지(스위치, 게이트웨이) 를 통해
내부와 외부로 통신할 수 있다.

여기에는 여러 네트워크 드라이버가 존재하며, 대표적으로 다음과 같다:

  • bridge : 기본 브리지 네트워크 (docker0)
  • host : 컨테이너가 호스트의 네트워크를 그대로 사용
  • none : 네트워크 비활성화
  • container : 다른 컨테이너의 네트워크를 공유
  • overlay : 여러 호스트 간 네트워크 구성 (멀티 호스트용)

이 외에도 드라이버 확장으로
weave, flannel, openvswitch 등이 있다.


기존 172.17.0.0/24 대역에서
새로운 Bridge 172.18.0 네트워크를 받음.

ifconfig

이런 식으로도 가능함.

docker network create mypribr --driver=bridge --subnet=172.20.0.0/24 --ip-range=172.20.0.0/24 --gateway=172.20.0.1

docker run -it --name mypri_u1 --net mypribr ubuntu:16.04

u3 는 u2의 네트워크 주소를 가짐


⚙️ 도커 데몬(Daemon)

도커는 클라이언트와 서버로 작동될 수 있으며,
도커 데몬은 일반 서버 서비스(httpd, mysqld 등)의 데몬과 동일한 방식으로 작동한다.

종류설명
도커서버컨테이너 실행과 이미지를 관리하는 주체이며, dockerd 프로세스로 작동한다.
도커엔진외부에서 API로 입력받아서 도커가 실행되게 해주는 엔진이다.
도커데몬도커 프로세스가 실행되어 서버가 서비스 요청을 입력받을 준비가 된 상태를 말하며, API로 입력받아 도커 엔진의 기능을 수행한다. 클라이언트에게 API를 통하여 도커 CLI를 제공하며, 일반 서버 서비스 데몬과 동일하다.
도커 클라이언트/var/run/docker.sock 위치한 소켓을 통해 도커 데몬의 API를 호출한다.

즉,

  • dockerd → 백그라운드에서 도커 엔진을 구동하는 프로세스(데몬)
  • docker → 사용자가 명령을 내리는 CLI(클라이언트)
    이며,
    둘 사이는 /var/run/docker.sock 소켓 파일을 통해 통신합니다.


🐳 도커 이미지

모든 도커 컨테이너는 이미지(image) 를 기반으로 생성된다.
따라서 이미지의 이름, 저장소, 태그 등 관리가 매우 중요하다.

도커 이미지는 기본적으로 https://hub.docker.com 사이트에서 다운로드할 수 있다.
누구든지 공개(Public) 상태로 이미지를 올리면 다른 사용자가 자유롭게 다운로드하여 사용할 수 있다.
반면 비공개(Private) 상태로 설정하면 특정 사용자만 접근할 수 있으며, 이 경우에는 요금이 발생한다.


🧩 이미지를 사용하려면

a. 필요시 도커 데몬을 실행한다.

sudo service docker start

b. Docker Hub 사이트에 접속하지 않고 CLI에서 바로 검색할 수 있다.

docker search ubuntu

→ 이 명령으로 Ubuntu 관련 이미지를 확인할 수 있으며,
STARS 항목은 이미지의 인기(다운로드 수)를 나타내고,
OFFICIAL 표시는 공식 인증 이미지를 의미한다.


docker search ubuntu


🧱 Dangling 이미지

  • A image에 필요한 소프트웨어를 추가하여 새로운 B image를 생성한 뒤,
    B image의 기반이 되는 A image를 삭제하면,
    B image는 더 이상 기반이 없기 때문에 온전하지 못한 상태가 된다.

  • 이렇게 기반 없이 허공에 떠 있는 이미지
    👉 Dangling 이미지라고 부른다.


💡 참고 명령어

  • Dangling 이미지 확인:

    docker images -f dangling=true
  • Dangling 이미지 삭제:

    docker image prune -f

bear image의 first

bear image first + second 2줄

docker history

first는 second가 참조하기 때문에 삭제할 수 없음.

Dangling 이미지

profile
훌륭한 it 엔지니어 꿈나무

0개의 댓글