docker run ~ 명령어로 이미지를 실행할 때--name 옵션을 주지 않으면 임의의 이름(A)이 자동 부여됨.docker rename A B 명령으로 이름 A를 B로 변경 가능.docker ps -a 명령으로 Exited 상태의 컨테이너를 확인할 수 있음.docker start <컨테이너명> 으로 먼저 컨테이너를 실행.docker restart <컨테이너명>docker stop → docker start 순으로 실행됨.docker exec -it <컨테이너명> /bin/bash처음부터 바로 셸로 진입하려면
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 설치
컨테이너 셸에서 다음 명령어를 입력하면 빠르게 업데이트 및 설치가 가능하다.
yum update && yum -y install git
도커 컨테이너는 CPU의 프로세스로 실행되기 때문에 매우 빠르게 업데이트되고 프로그램이 설치된다.

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

docker images => images확인.

git가 설치 되어 있는 images를 가지고 태어났기 때문에
별도의 설치없이 git을 내장하고 있음을 보임.
Bare Image (예: nginx:latest)는docker pull nginx:latest 식으로 받을 수 있는 Official Image이다.docker commit 방식기존 컨테이너의 변경사항을 새로운 이미지로 저장:
docker commit 기존_NAME 새로운_NAME
예시:
docker commit rocky8 rocky8-git
→ 기존 rocky8 컨테이너가 rocky8-git이라는 새로운 이미지로 생성됨.
Dockerfile 방식Dockerfile이라는 스크립트 파일을 만들어docker image tag 방식기존 이미지의 태그(TAG)만 변경하여 새로운 이미지로 생성:
docker image tag rockylinux:8 rockylinux:latest
→ 동일한 이미지지만 태그를 새로 붙여 관리할 수 있음.

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


깔끔하게 볼 수 있다.
10.0.0.0/8, 172.17.0.0/16) 를 사용하여ifconfig 명령으로 확인 가능하지만,A~B클래스를 쓰는 이유는 너무 많기 때문이다.
Kubernetes는 내부적으로 컨테이너(Pod)가 죽거나 비정상 종료되더라도,
Auto-scale 기능을 통해 항상 지정된 개수의 컨테이너를 유지한다.
예를 들어 웹 서버 4개를 운영 중 하나가 죽으면,
자동으로 새로운 컨테이너가 생성되어 다시 4개가 유지된다.
이때 각 컨테이너는 새로운 IP를 할당받지만,
외부 사용자는 이러한 변경을 인식하지 못한다.
그 이유는 외부 접속이 컨테이너의 개별 IP가 아니라
Service 리소스가 가진 고정 IP(ClusterIP, NodePort, LoadBalancer 등) 로 이루어지기 때문이다.
즉, 내부 Pod는 교체되더라도,
외부에서는 Service의 고정 IP만 바라보기 때문에
서비스는 중단되지 않고 지속적으로 연결이 유지된다.
Container 도 주소를 가짐


docker0: 게이트웨이 주소

ip addr

docker ps
컨테이너 하나가 각각의 인터페이스를 가지고 있음을 알 수 있음.
외부 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


볼륨의 기본 위치

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 파일을
도커 볼륨에 미리 만들어 둔 겁니다.
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 이미지 기반 컨테이너 실행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 명령을 실행하면
eth0와 lo가 보이며, 도커는 내부 IP 주소(172.17.0.10, …)를
순차적으로 컨테이너에 할당한다.
하지만 이 내부 IP 주소는 컨테이너를 재시작할 때마다 변경될 수 있으며,
도커가 설치된 외부 Ubuntu 노드에서만 접근 가능하다.
즉, 내부망 IP 주소로는 외부와 직접 연결되지 않는다.
외부에서는 Port Redirect(포트 포워딩) 방법으로
포트를 통해 컨테이너에 접근할 수 있다.
Ubuntu 셸에서 ip addr 명령을 실행하면 다음과 같은 인터페이스들이 보인다:
127.0.0.1, loopback address)veth는 외부 노드의 ens33과 도커의 docker0를 통해 연결된다.)
컨테이너를 생성하면 기본적으로 docker0 브리지(스위치, 게이트웨이) 를 통해
내부와 외부로 통신할 수 있다.
여기에는 여러 네트워크 드라이버가 존재하며, 대표적으로 다음과 같다:
이 외에도 드라이버 확장으로
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의 네트워크 주소를 가짐
도커는 클라이언트와 서버로 작동될 수 있으며,
도커 데몬은 일반 서버 서비스(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
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 이미지