Docker- 3

박형준·2024년 4월 24일

#docker rm -f $(docker ps -a -q)
#docker rmi -f $(docker images -q)

이미지와 컨테이너를 한번에 지우는 명령어


*nginx 이미지로 컨테이너 생성 이름은 mynginx 포트 설정(8080:80)

  • 볼륨생성과 마운트 /usr/share/nginx/html 로 마운트
  • #docker container run -d --name mynginx -p 8080:80 -v myvol:/usr/share/nginx/html nginx

볼륨 생성 후 마운트 지점 확인

  • 볼륨 생성 (myvol)
  • 생성된 볼륨 확인 ( myvol )

*마운트 확인
#docker container inspect mynginx | grep Mount -A 10

마운트 확인

  • 생성된 볼륨의 정보를 자세하게 확인 ( mount 지점 확인 )

*컨테이너 안으로 들어가 보기

  • #docker exec -it [mynginx2] /bin/bash

*빠져나와서 컨테이너를 중지/삭제를 해도 마운트된 /www 데이터는 보존이됨.

  • docker container stop mynginx2
    • ls /www
    • cat /www/index.html
  • docker rm mynginx2
    • cat /www/index.html

바인드 후 컨테이너에 접속해서 확인

  • 생성된 컨테이너로 접속 ( docker exec -i -t, /bin/bash )
  • 컨테이너로 접속해서 마운트 지점 확인
  • 내용 확인 ( 접속하기 전에 mount soure의 index.html의 내용과 동일 )
  • 정지 후 에도 볼륨 내용 보존

-도커 네트워크

  • 도커 네트워크 명령어

-네트워크 드라이버

  • none(null) : 네트워크 비활성화
  • bridge : 애플리케이션과 통신할때 사용하는 네트워크
  • host : 독립된 네트워크 , 호스트끼리 네트워크 차단, 독립된 네트워킹 사용
  • 오버레이(overlay) : 여러개의 데몬을 연결가능, 서로통신이 가능.( 7계층 )

*도커는 가상 네트워크(SDN) 를 사용

  • OS에 도커를 설치하면 Docker0 네트워크가 추가됨
    • ⇒ IP 범위는 172.17.0.0/16 가 추가됨.
  • 컨테이너 생성시 네트워크를 지정하지 않으면 기본 브릿지에 지정이 되며, 브릿지에
    • 할당된 IP를 부여 받음 172.17.0.x/16

*네트워크 인터페이스 관련

  • docker run --rm busybox ip addr
  • docker run --rm --network host busybox ip addr
  • docker run --rm --network none busybox ip addr

도커 네트워크 (host)

  • 도커 네트워크 리스트 확인 ( docker network ls )
  • --rm 옵션 : 1회성 컨테이너 생성
    • busybox이미지를 이용하여 컨테이너 내의 네트워크 인터페이스와 IP 주소 정보를 보여줌 ( 기본 )
  • busybox 이미지를 사용하여 컨테이너를 호스트 네트워크 모드로 실행 ( 추가, busybox 컨테이너가 호스트의 네트워크 네임스페이스를 공유하게 되어 호스트와 동일한 네트워크 환경을 가짐 )

none

  • busybox 컨테이너는 네트워크를 가지지 않은 상태로 실행 ( 지우고 만들기, 네트워크 인터페이스와 IP 주소 정보가 표시되지 않을 것 )

nginx 이미지의 네트워크 확인 ( inspect )

  • docker network inspect bridge
  • docker network inspect host
  • docker network inspect none

*포트 설정 방법

  • #docker run --name mywebserver -d -p 8080:80 nginx
    • [8080:외 80:내부]

컨테이너의 포트번호 확인

  • 호스트 포트( 빈 값 )컨테이너 포트(80)으로 지정
    • 호스트 포트와 컨테이너 포트를 빈 값으로 지정 ( 포트번호 80으로 자동 지정 )
  • 생성된 컨테이너 포트 번호 확인

-이미 생성되어 동작하고 있는 컨테이너에 포트 할당은?

  • 동작하고 있는거 ⇒ 중지 ⇒ commit ⇒ 다시 컨테이너 생성하면서 포트할당

-이미지 다운(nginx) ⇒ 컨테이너 생각(이름은 webser) ⇒ 동작(start) ⇒ ps

  • 컨테이너 중지 stop ⇒ #docker commit webser webser
    • ⇒ 커밋확인(docker images) ⇒ #docker run -itd --name webser2 -p 8080:80 webser
    • ⇒ 포트 할당 확인 (# docker ps)

이미 생성되어 동작하고 있는 컨테이너 포트 할당 (commit)

  • 이미지 다운로드
  • 컨테이너 동작 (이름: webser)
  • 컨테이너 동작 멈추고,
    • 이미지를 복사 ( 포트 번호를 추가하고자 하는 컨테이너의 이미지, docker commit )
    • 이미지 확인 후
    • 포트 번호를 추가하여 컨테이너 생성 ( 이미지는 복사한 이미지 )

-컨테이너 dns 설정

*vi /etc/resolv.con ⇒ nameserver 8.8.8.8
#docker container run -d --dns 8.8.8.8 nginx ⇒ 컨테이너에 DNS 설정

컨테이너 dns 설정

  • 컨테이너의 dns를 8.8.8.8으로 지정

*호스트 이름하고 IP매핑

#docker container run -it --add-host www.test.com:192.168.10.10 cento

컨테이너 호스트 추가 ( 192.168.10.10 )

  • --add-host 옵션을 사용하여 www.test.com 호스트를 192.168.10.10 IP 주소로 매핑 ( -it 옵션을 사용하여 상호작용 가능한 쉘을 가진 컨테이너를 실행 )
  • ip addr을 통해 확인

*rocky9와 docker1 연결 확인

  • 컨테이너 하나 생성 후 (nginx)
  • 컨테이너 생성
    • rocky9에서 localhost 확인 후 ( curl localhost )
    • docker1 에서 8080 포트 번호로 확인 ( curl 10.0.2.15:8080 )

브리지 생성

  • 네트워크 브릿지 생성 ( docker network create )
    • 생성한 네트워크 확인 ( docker network ls )
    • ip addr로 확인

*컨테이너 생성 과 생성된 브릿지에 연결

  • #docker container run --rm -it --network=mynet centos

컨테이너를 생성하면서 네트워크 지정

  • 네트워크 지정하면서 컨테이너 생성 ( --network=mynet 옵션을 통해 컨테이너 생성 )
  • ip addr로 확인

네트워크 삭제

  • 네트워크 삭제 ( mynet, docker network rm )
  • 삭제 확인

네트워크 리스트 확인 ( --filter 옵션 , --no-trunc: ID만 )

  • docker network ls --filter driver=host
    • docker network ls --filter driver=bridge
    • docker network ls --filter driver=none

네트워크(브릿지) 생성 후 확인

  • 네트워크 생성 ( br0 )
    • 네트워크 생성 ( 서브넷 지정, --subnet 옵션 )
    • 네트워크 생성 ( 게이트웨이 지정, --gateway 옵션 )
  • 네트워크 생성 확인
    • ip addr로 확인

*네트워크 상세정보 확인

#docker network inspect br0

inspect로 생성한 네트워크 확인 (자세하게, inspect)

  • docker network inspect br0
  • docker network inspect br1
  • docker network inspect br2

*네트워크 연결 / 해제

  • docker network connect [네트워크이름][컨테이너 이름]

컨테이너 생성 후 네트워크 연결 후 해제

  • 컨테이너 생성
    • 네트워크 연결 ( br1과 webtest, docker network connect )
    • 네트워크 연결 해제 ( docker network disconnect )

컨테이너 생성하면서 네트워크 연결 후 해제

  • 컨테이너 생성하면서 네트워크 연결
    • docker attach로 접속 가능
    • 컨테이너 접속 ( docker exec -it, /bin/bash )
    • 컨테이너 연결 해제

*네트워크 삭제

  • #docker network ls
  • #docker network rm [이름][이름이 없으면 네트워크ID]
  • #docker network rm br0 br1 br2
    • ⇒ 만약 네트워크가 컨테이너와 연결되어 있다면 삭제안됨. 컨테이너 중지 하고 네트워크 삭제하면됨.

docker network 삭제

  • 네트워크 삭제 ( docker network rm )
    • 삭제후 네트워크 리스트 확인
  • 네트워크가 컨테이너와 연결이 되어있으면 연결 해제 후 삭제 ( 컨테이너 중지 후 삭제도 가능 )

-컨테이너 운용
*컨테이너에 접속(연결) 방법 2가지

  • #docker exec -it [컨테이너이름] /bin/bash ⇒ 컨테이너ID #
  • #docker attach [컨테이너이름] ⇒ / # 보여짐.

*컨테이너 삭제시 반드시 stop 후삭제를 권장함 강제 삭제( -f ) 하면 이미지 손상될
수 있음

도커 컨테이너 접속

  • 도커 컨테이너 생성
    • 도커 접속 ( docker attach를 이용해서 )
    • 도커 접속 ( docker exec -it )
  • 컨테이너 접속을 할 때는 컨테이너 동작을 시킨 후에

*컨테이너에 프로세스 수행해보기

  • 두가지 방법으로 접속이 가능하고 차이점은 attach 명령어로 접속시 명령어에 제한이 따름,
    • 쉘모드의 컨테이너에서는 명령어가 가능하지만 그 이외는 안됨.
    • 따라서 접속 후 프로세스를 실행시키려면 exec 방식으로 접속이 유용함.

*다시 exec 방법으로 접속 후 pwd , id , hostname, top, ps 등을 해보면 안되는 명령어 도 있음(별도 설치해야 사용가능)

-모두 삭제

도커 컨테이너 프로세스 확인

  • 도커 컨테이너 생성
  • 컨테이너로 접속 후에
    • ps와 top 패키지 설치 후 (procps)
    • top 실행
    • ps 실행

*컨테이너의 실시간 프로세스 확인

  • #docker container run --name mysol -d -p 80:80 nginx
  • #docker [container ] top 컨테이너이름

*매핑된 포트 확인

  • #docker port [컨테이너이름]

*컨테이너 이름 변경

  • #docker rename mysol 새이름 ⇒ 변경할때 안되면 컨테이너 중지후 변경/시작

컨테이너 모니터링

  • 컨테이너 생성
    • top 명령어를 통해 컨테이너 확인 ( aux옵션 : 전체로 보여주는 것 )

포트번호 확인

  • 도커 포트 번호 확인 (docker port)

컨테이너 이름 변경

  • 이름 변경 ( docker rename )
  • 변경이 안될 때 컨테이너 중지 후 변경

*컨테이너에서 호스트로 파일 복사

  • [root@www ~]# docker container cp mytestsol:/etc/nginx/nginx.conf /tmp/nginx.conf
    • Successfully copied 2.56kB to /tmp/nginx.conf

-중지된 컨테이너에서 파일을 가져 올 수 있을까? yes

  • ⇒ 컨테이너 중지 후 nginx.conf을 nginx2.conf로 복사 해보기

-중지된 컨테이너로 파일 복사 해서 넣어보기도 가능.

컨테이너 하나 더 생성 후 ( 복사해서 )

  • 컨테이너의 파일을 rocky9의 /tmp/nginx.conf 에 복사 ( new-mysol: )
  • 복사된 파일 확인 (/tmp)
  • 반대로 rocky9의 파일을 컨테이너의 폴더에 복사 (new-mysol:, 경로:/etc/nginx/)
  • 컨테이너 중지 후 파일 가져오기와 복사해서 넣기 가능 가능

*컨테이너 로그 확인

  • #docker logs -n 10 mytestsol
  • #docker logs -t mytestsol ⇒ t = time

-로그파일 자세하게 확인

  • #docker container inspect --format="{{.LogPath}}" mytestsol

    • /var/lib/docker/containers/bc75f67f015a82f59482fe09b3fc103bc8cb06d9330dc682686ecc9a85d7d1cb/bc75f67f015a82f59482fe09b3fc103bc8cb06d9330dc682686ecc9a85d7d1cb-json.log
  • #cat /var/lib/docker/containers/bc75f/bc75f67-json.log

컨테이너 로그 확인

  • 컨테이너 로그 확인 ( docker logs, -n 옵션은 줄 갯수 )
  • 옵션 -t 는 시간 확인

컨테이너 자세한 로그 확인

  • curl http://172.17.0.2:80 으로 컨테이너 접속한 후에
    • docker container inspect --format="{{.LogPath}}" new-mysol로 new-mysol log경로 확인
    • cat /var/lib/docker/containers/0bc987bc/-json.log로 로그 확인

0개의 댓글