LabHub

도커 기초 · 이미지와 컨테이너 · 실습

첫 컨테이너 띄우기

LabHub 에서 이어서 보기

이 실습은 진짜 VM 에서 돕니다

이 상자는 파드가 아니라 KubeVirt 가 띄운 가상머신입니다. 리눅스 커널이
따로 돌고 systemd 가 실제로 서비스를 관리하며, docker 는 흉내가 아니라
진짜 도커 엔진입니다. docker run 으로 띄운 컨테이너는 실제로 프로세스가
되고 docker execdocker logs 도 그대로 동작합니다.

예전에는 이 실습이 파드 안에서 돌았습니다. 커널 권한을 전부 내려놓은 상자라
컨테이너를 띄우는 단계가 막혀 있었고, 그래서 이미지 아카이브를 직접 풀어
보는 우회로 배웠습니다. 이제 우회가 필요 없습니다.

알아 둘 것이 둘 있습니다.

목표

이미지와 컨테이너를 손으로 다루면서, 태그가 이미지를 복사하지 않는다는 것과
컨테이너 안팎이 서로 다른 파일 트리를 본다는 것을 직접 확인합니다.

왜 중요한가

컨테이너를 처음 만나면 대부분 명령어를 외우려 듭니다. 그런데 실무에서
막히는 지점은 명령어가 아니라 모델입니다. "이미지를 지웠는데 컨테이너가
살아 있다", "태그를 바꿨는데 용량이 안 줄었다", "컨테이너 안에서는 파일이
있는데 호스트에는 없다" — 전부 **이미지는 읽기 전용 레이어 더미이고
컨테이너는 그 위의 쓰기 레이어 + 프로세스**라는 한 문장에서 설명됩니다.
그래서 이 실습은 명령을 익히는 것이 아니라 그 문장을 눈으로 확인하는
과정입니다.

단계

1. /root/dk1 디렉터리를 만들고, 이 상자에서 쓸 수 있는 이미지 목록을 /root/dk1/images.txt 로 저장합니다. 저장소와 태그가 함께 보여야 합니다.
docker images 는 이 상자에서 동작하지 않습니다. 대신 /opt/images/*.tar 안의 index.json 에서 .manifests[0].annotations["org.opencontainers.image.ref.name"] 를 읽으면 docker.io/library/alpine:3.20 같은 이름:태그가 그대로 나옵니다 — docker images 의 Repository·Tag 두 열이 어디에서 오는지를 한 겹 아래에서 보는 셈입니다.
2. alpine:3.20 이미지로 dk-hello 라는 이름의 컨테이너를 만들어 hello-labhub 를 출력하게 하고, 종료 후에도 컨테이너를 남겨 둡니다.
3. nginx:1.27-alpinedk-web 이라는 이름으로 백그라운드 실행합니다.
4. nginx:1.27-alpine 컨테이너가 보는 /etc/os-release 를 읽어 /root/dk1/web-os.txt 로 저장합니다.
docker exec dk-web cat /etc/os-release 로 읽습니다. 이 VM 의 /etc/os-release 를 그냥 읽으면 우분투가 나와 실패합니다 — 그 차이가 곧 마운트 네임스페이스가 하는 일입니다.
5. dk-web 의 컨테이너 IP 주소를 알아내 /root/dk1/web-ip.txt 에 IPv4 주소 한 줄만 저장합니다.
6. alpine:3.20labhub/base:v1 이라는 이름을 추가로 붙입니다.
7. dk-hello 컨테이너를 삭제합니다. dk-web 은 그대로 둡니다.
8. /root/dk1/report.txt 에 아래 세 줄을 실제 값으로 채워 넣습니다.

image=<dk-web 이 쓰는 이미지 이름:태그>container=dk-webstate=<dk-web 의 현재 상태>

참고

단계 8개

  1. 이미지 목록 저장하기
  2. 한 번 실행하고 끝나는 컨테이너
  3. 백그라운드로 계속 도는 컨테이너
  4. 실행 중인 컨테이너 안에서 명령 돌리기
  5. 컨테이너의 IP 알아내기
  6. 이미지에 다른 이름 붙이기
  7. 끝난 컨테이너만 정리하기
  8. 현재 상태를 보고서로