#12. Docker

HyunJunSon·2025년 6월 18일

Azure

목록 보기
12/13

※ 경기도 x MS 의 클라우드 강의 내용 중 주관적으로 낮설거나 헷갈리는 내용을 정리합니다. 모든 저작권은 해당 기관에 있습니다.

Docker Container

  • registry : 이미지 저장소 (ex. docker.io, quay.io(red-hat))
  • repository(저장소) : account(계정)

  • create로 생성한 컨테이너는 created 상태가 됨
  • 즉 docker ps 로 보이지 않음. start를 해주어야 running 상태가 됨
  • docker ps -a 로 보임

  • docker container create 단계에서 -it 옵션을 주었고, created 되었기 때문에 해당 ps를 start 할때는 기존 환경에 attach 한다는 의미에서 -ai 옵션만 주면 된다.
  • ps -e 로 pid를 볼때 bash 가 1번으로 root를 차지 하고 있기때문에, 이 컨테이너에서 exit을 하면 컨테이너는 바로 종료된다. root인 bash가 종료되기 때문이다.
  • 종료하지 않고 detach로 전환하려면 ctrl + p+q 를 이용하면 된다.
  • docker run을 활용하면 create + start가 한번에 된다.

  • 원래 그냥 centos, ubuntu를 run 하면 /bin/bash를 pid 1로 하여 자동으로 생성된다.
  • 위와같이 /bin/date 같은 명령어를 추가하면 pid 1은 /bin/date가 된다.
  • 따라서 날짜를 프롬프트에 실행한후 바로 프로세스가 종료되어 Exited 상태가 된다.
  • /bin/bash를 /bin/date가 덮어썼기 때문이다.

  • 원래는 /bin/ping localhost도 일회성으로 실행하고 끝나지만 -d로 백그라운드에서 돌도록 했기 때문에 ping을 계속 보내는 /bin/ping localhost를 1번 pid로 하는 컨테이너가 만들어진다.
  • 실행중인 컨테이너의 로그를 확인해보면 ping을 계속 보내고 있음을 알수 있다.
  • 이 컨테이너에 /bin/bash로 접속하면 잘 접속이 된다.
  • 또한 exit을 해도 컨테이너는 종료되지 않는다. 왜냐하면 이 컨테이너의 1(root) 프로세스는 /bin/bash가 아니라 /bin/ping 이기 때문에, bash에서 exit해도 컨테이너는 살아 있다.

  • attach는 bash를 활용해서 접근하는게 아니라 작동하고 있는 ps직접 붙는 명령어이기 때문에 잘 안쓴다.
  • docker exec test03 ip a > 이렇게 컨테이너 내부 ip 정보를 쉽게 볼수 있다.

  • -itd 는 커맨드와 상관없이 백그라운드에서 실행하게 한다.
  • cp 할때 컨테이너 내부는 컨테이너이름:path 형태로 지정해준다.

  • rm는 실행중인 컨테이너를 대상으로는 적용되지 않는다. -f 로 강제적용은 할수 있지만, 추천하지 않는다.

  • docker diff를 통해 컨테이너의 변경사항을 볼수 있다.

Docker network

  • 도커는 기본(default)로 브릿지 네트워크가 설정되어 있다.
  • docker network ls로 네크워크 항목을 살펴볼수 있고, docker inspect bridge 로 세부정보를 볼수 있다.
  • 여기에 gateway정보가 있는데, 이 gateway ip 가 host 에서 ip a 로 볼수 있는 docker0 nic 의 ip 주소이다. 즉 docker0가 도커 컨테이너들에 연결된 veth(virtual ethernet)카드 들과 연결되어 네트워크를 가능하게 한다.
  • docker0는 host의 private ip와 연결되고, 이는 nat로 외부 public ip로 연결된다.
  • host ubuntu 내의 도커 컨테이너로 찾아가는 방법은 NAPT(Network Address Port Translation)을 이용하는데, 하나의 IP주소를 여러 컴퓨터가 공유하는 기술로, IP주소와 포트번호를 변화하는 기술로 IP 마스커레이드라고 한다.

  • brctl show docker0로 docker0로 연결된 가상인터페이스 카드들(컨테이너들)을 볼수 있다.
  • 도커는 iptables -t nat에 보면 Docker chain을 새로 만들고 있는걸 볼 수 있는데, 이 정보를 통해 port-forwarding을 ubuntu 내의 도커 컨테이너에 전달할수 있게 한다.

Docker Image

  • docker image ls = docker images
  • docker image inspect (이미지 상세정보)

  • docker image prune -a 를 이용하면 현제 ps running 중인 이미지 제외하고 삭제된다.
  • prune은 가지치기를 의미한다.
  • 실행중인 ps의 이미지를 지우면 이름만 none으로 적용되고, 다시 pull하면 layer를 새로 받지 않는다.

  • docker hub 로그인을 위한 password는 /root/.docker/config.json에 저장되는데 실제로 auth 값을 echo 값 | base64 -d 로 디코딩해보면 비밀번호가 그대로 노출된다.

  • 이미지 태그는 이미지 자체의 변경점은 없이, 같은 이미지를 사용하는 새로운 이미지 하나를 만들어 낸다.
  • docker rename web01 web02 로 이름을 변경 가능하다.

  • 이미지 뿐 아니라, 사용중이지 않는 컨테이너,이미지,네트워크 일괄삭제가 가능하다.

  • public registry를 쓸수없는 폐쇄망 환경이라면, 이미지 저장소의 registry 이미지를 활용해 내부적으로 private registry를 컨테이너로 구축해서 쓸수 있다.
  • 그것도 힘들면 save/road를 통해 백업파일 형태로 관리도 가능하다.

  • 컨테이너의 이미지는 ready-only로 새로운 정보 기입이 불가능하다. 새로운 정보는 컨테이너로 띄워졌을때 컨테이너 환경에 기록된다. 변경된 점을 통째로 이미지로 만들고 싶을때 docker commit을 활용한다. -a(author), -m(message) 등의 정보를 추가할수 있다.
  • commit으로 새로 만든 이미지는 해쉬값이 달라진다. 즉 다른 이미지가 생성되는 것이다.
  • docker image inspect를 통해 기록한 author, message 정보도 확인할 수 있다.

Dockerfile

  • -t(tag) 를 의미한다.
  • 도커 파일이름과 위치를 모두 정해주어야 한다. .를 빠뜨리기 쉽다.

  • 도커 이미지 생성과정에서 From ubuntu 단계는 이미지이다. 그러나 그 아래 해쉬값들은 intermediate 컨테이너를 의미한다. 즉 기존 이미지에서 한줄한줄 변경점을 주고, docker commit을 통해 중간에 컨테이너를 잠깐씩 만드는 과정을 반복한다. 마지막에 intermediate container를 삭제하는 모습을 볼 수 있다.
  • 마지막에 successfully built 한것은 최종 이미지를 의미하는 해쉬값이다.

  • docker image history를 통해 이미지의 변경과정을 알수 있다.
profile
즐겁게 공부하고 사람들에게 도움을 주는 개발자가 되고 싶습니다.

0개의 댓글