흔히 저지른 실수 1)
docker container run -dt centos7 이라고 썼음. 그리고 왜 안되지? 라고 생각했음.
docker container run -dt centos:7 으로 해야됨. 7은 tag거든 이름이 아니고.
흔히 저지른 실수 2)
docker container run --name centos2 centos:7 이라구 함.
이러면 -t가 부여가 안되었으니까, 제어 터미널(?)이 없으니까 쉘이 꺼지고, 컨테이너도 자동으로 꺼짐.
문제는 docker container start centos2를 해도, 프로세스가 안돌아가고 있으니까 바로 꺼짐.
docker container exec -it centos2 /bin/bash를 해도 안됨. 왜? 컨테이너가 꺼져있으니까.
결국 지우고 다시 만들어야 하는 것 같음.
도커 컨테이너 시작(Foreground)
$ docker container run --name CONTAINER IMG_REPO:TAG
도커 컨테이너 시작(Background) - 서비스
$ docker container run -d --name CONTAINER IMG_REPO:TAG
도커 컨테이너 시작(Shell)
$ docker container run -it --name CONTAINER IMG_REPO:TAG
도커 이미지 삭제
$ docker image rm IMAGE
도커 이미지 정리(Dangling Images) 컨테이너는 여러 개의 이미지 레이어로 되어있는데,
이미지는 여러 개의 레이어로 되어있는데,이미지가 업데이트가 되면서, 기존의 업데이트 부분이 지워지고 새로운 업데이트 부분이 덮어씌워지면, 새로운 업데이트 부분이 새로운 레이어로 올라가는거야. 기존의 레이어는 냅두고.
그러면 구버전에서는 기존 레이어에서 사용이 됐었는데, 새 버전에서는 새로운 레이어가 쓰이는거야.
그럼 기존 레이어는 untagged가 되는거고, 그걸 dangling image라고 해.
사용중이지 않은데 시스템에 남아 있는 것.
$ docker image prune -> dangling image"만" 지우는거야
-> image를 빌드 하다보면, 수정을 하게 되잖아? 이때, 새로운 버전을 쓰느라 기존 버전을 안쓰는 경우가 생길 수가 있대. ("불필요한 공간 차지")
도커 이미지 정리(사용중이지 않은 이미지) <-> docker container prune인 줄 알았네 ㅎ
$ docker image prune -a
도커 컨테이너 종료
$ docker container stop CONTAINER
$ docker stop CONTAINER
도커 컨테이너 삭제
$ docker container rm CONTAINER
$ docker rm CONTAINER
실행중인 모든 컨테이너 종료
$ docker container stop $(docker container ls -q)
종료된 모든 컨테이너 삭제
$ docker container rm $(docker container ls -a -q)
모든 컨테이너 강제 삭제
$ docker container rm -f $(docker container ls -a -q)
도커 컨테이너 일시 정지 (메모리에 프로세스는 남아있는 상태에서 동작만 멈추게 된다.)
$ docker container pause CONTAINER
도커 컨테이너 일시 정지 해제
$ docker container unpause CONTAINER
도커 호스트에서 컨테이너로 파일 복사
$ docker container cp DOCKER_HOST_PATH CONTAINER:/CONTAINER/PATH
컨테이너에서 도커 호스트로 파일 복사
$ docker container cp CONTAINER:/CONTAINER/PATH DOCKER_HOST_PATH
컨테이너 조작 차분 확인
$ docker container diff CONTAINER -> 컨테이너가 동작하면서 어떤 변화가 일어났는지 확인할 수 있음.
C /root는... 그 하위에 우리가 뭐 수정했으니깐 그런거임.
<DIFF 상태>
A 파일 추가 (add)
C 파일 수정 (change)
D 파일 삭제 (delete)
컨테이너 상세 정보 확인
$ docker container inspect CONTAINER
컨테이너 이미지 상세 정보 확인
$ docker image inspect IMAGE
컨테이너 리소스 사용 정보 확인
$ docker container stats CONTAINER
컨테이너에서 실행중인 프로세스 확인
$ docker container top CONTAINER (컨테이너 안에 ps가 없을 때는 top을 쓴다.)
docker exec centos1 ps -ef (그런데 컨테이너 이미지에 따라서 ps 명령어가 설치 안되어있을 수도 있어)
글구 잘 보면..
전자의 경우 ps -ef의 tty가 ?인데 비해, 후자의 경우 pts/1로 할당됨.
-----
Q) union file system에서 이미지 layer는 어떤 기준으로?
도커 네트워크 (참고. MAC address는 실행중인 Container에만 부여된다.)
Bridge Network
- Docker 내부에 네트워크를 구성하고 호스트의 인터페이스를 사용해서 외부 네트워크와 연결될 수 있는 네트워크
- Docker Host의 기본 브리지 네트워크 인터페이스 : docker0
- Docker Container의 기본 브리지 인터페이스 : vethXXXX
Host Network
- Docker Host의 네트워크를 직접 공유하는 네트워크
- Docker Host의 주소를 사용하여 Docker 컨테이너에서 사용중인 포트로 접근할 수 있음
netstat -ant | grep :80 (80번 포트 열려있는지 확인)
Null Network
- 네트워크가 필요하지 않은 도커 컨테이너에서 사용하는 네트워크 유형으로 외부와 단절되는 네트워크 유형
MAC VLAN Network (도커 호스트들을 여러 개 연결할 때 사용)
- 호스트 네트워크 인터페이스와 같은 네트워크에 연결하는 네트워크 유형
도커 네트워크 목록 확인
$ docker network ls
도커 네트워크 세부 정보 확인
$ docker network inspect NETWORK
네트워크 지정하여 컨테이너 실행
$ docker container run -d -t --network NETWORK --name CONTAINER IMAGE
참고) docker container run -dt --name centos7_net centos:7 --network my_bridge
-> 이렇게 하면 error 발생해.
https://velog.io/@seunghyeon/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B5%AC%EC%84%B1%EB%8F%84
도커 네트워크 생성
$ docker network create NETWORK -d NET_TYPE (여기서 d는 driver의 약자야.)
주의할 것) -d 이런거 모른다구 인터넷 찾아보지 말고, 그냥 docker network create --help 하면 나와!!!
이걸 습관으로 삼아야돼.
----- [실습 : Bridge network 생성] -----
$ docker network create -d bridge my_bridge
$ docker container run -d -t --network my_bridge --name centos7_11 centos:7
$ docker container run -d -t --network my_bridge --name centos7_12 centos:7
현 시점에서 my_bridge 네트워크에 centos7_net2라는 컨테이너가 물려있어.
$ docker container exec -it centos7_11 /bin/bash
[root@centos7_11]# yum install net-tools
[root@centos7_11]# ifconfig
(IP 주소 확인)
(컨테이너 네트워크의 다른 컨테이너와 통신 및 외부 네트워크 통신 테스트)
$ docker container exec -it centos7_12 /bin/bash
[root@centos7_12]# yum install net-tools
[root@centos7_12]# ifconfig
(IP 주소 확인)
(컨테이너 네트워크의 다른 컨테이너와 통신 및 외부 네트워크 통신 테스트)
그럼 Bridge network는 단순하게 해당 네트워크의 대역이 새롭게 만들어질 뿐, 인터넷이나 다른 네트워크의 pod과 연결하는건 동일한가보군.
-----
[실습 : Host network 사용]
브릿지모드는 기본 네트워크 방식이다. 도커 데몬을 실행하면 먼저 docker0이라는 브릿지가 생성된다. 컨테이너를 생성하게 되면, 각 컨테이너 마다 고유한 network namespace 영역이 하나씩 생성되며, 이때 docker0 브릿지에 컨테이너의 인터페이스들이 하나씩 바인딩 되는 구조이다.
호스트모드는, 컨테이너가 독립적인 네트워크 영역을 갖지 않고, 호스트와 네트워크를 함께 사용하게 된다. 컨테이너의 ip와 interface정보를 확인해 보면 아래처럼 host의 네트워크 정보와 동일한다. 호스트모드로 생성된 컨테이너의 경우, 브릿지 모드를 사용하지 않으므로, docker0에 바인딩 되지 않는다. -> 그럼 호스트 NIC에 직연결?
출처: https://rhr0916.tistory.com/235 [아름답게 나이들게 하소서]
-> 그럼 host가 VMware의 host-only가 아니네.
다른곳에서 접속하려면 Docker Host의 IP 주소로 접근해야 된대.
$ docker container run -it --network host --name centos_host centos:7
docker container run -it --name centos_host centos:7 --network host <- 이렇게 하면 error 발생
[root@DOCKER_HOST]$ yum install -y net-tools
[root@DOCKER_HOST]$ ifconfig
(Docker Host와 동일한 네트워크 카드가 확인됨)
[root@DOCKER_HOST]$ hostname
(Hostname은 Docker Host와 동일함)
-> 왜 같지??? 이유를 알 수가 없네... 아예 호스트의 NIC를 공유해서 그런가?
그런데 컨테이너를 그냥 만들고, host 네트워크에 connect 하려고 하면, 아예 안돼.
[root@DOCKER_HOST]$ yum install httpd
[root@DOCKER_HOST]$ systemctl start httpd
(컨테이너 내부이므로 systemctl 명령어가 실행 안됨)
그래서 직접 실행 시켜줘야해.
[root@DOCKER_HOST]$ /usr/sbin/httpd & (직접 실행)
[root@DOCKER_HOST]$ curl http://localhost
[root@DOCKER_HOST]$ curl http://DOCKER_HOST_IP
(Docker Host에서 확인)
$ curl http://localhost
$ curl http://DOCKER_HOST_IP
(Docker Host는 웹 서버를 실행하지 않았지만 정상 접속 확인)
이번에는 호스트 컴퓨터의(윈도우 10랩탑) 크롬 브라우저에서 접근해보자.
장점? 호스트 네트워크를 직접 공유해서 사용하면, 호스트의 IP, PORT, 도메인주소를 직접 사용할 수 있다.
단점? 반대로, 컨테이너에서 어떤 서비스를 하고 있으면, 호스트에서는 못씀.
ex) 컨테이너에서 웹서버 80번포트로 운영중이면, 호스트에서 80번 포트는 못씀.
호스트에서는 한 번에 하나의 포트만 쓸 수 있으니까.
HOST 네트워크 = 테스트 용.
테스트 목적으로 한 번에 여러 개의 포트를 개방해서 사용을 해야 한다거나, 사용 할 포트가 불분명할 때 사용하는거고, 보통은 외부에서 접속할 포트만 지정해서 사용하는 것이 바람직하다.
-----
[실습 : Null Network 사용]
네트워크가 연결될 필요가 없는 컨테이너
$ docker container run -d -t --network none --name centos_none centos:7
Docker 설치가 되면 기본적으로 Bridge, Host, Null (이름은 none) 네트워크 3개가 만들어짐.
원래는 저 컨테이너에서 ifconfig를 사용해서 ip를 확인하고 싶었는데, 저 컨테이너가 인터넷 연결이 끊어져있는 컨테이너라 직접 확인이 불가능함. 그래서 docker network inspect로 간접적으로 확인한건데.....
이미 네트워크 도구가 설치된 이미지를 설치하면 된다.
$ docker container run -d -t --network none --name test_none devops2341/network-multitool:latest (IP와 관련된 도구가 설치된 이미지)
$ docker container exec -it test_none /bin/bash
[root@test_none]$ ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
(다른 컨테이너, Docker Host, 외부 네트워크와 통신 테스트 시도시 통신이 안됨)
-----
Q) 강사님 호스트에서도 똑같이 웹서버 동작시켰을 때 호스트랑 호스트 네트워크를 가지고 있는 컨테이너 둘 중 어디로 접속이 되나요?
-> 동시에 동작이 안된다. 왜? 포트는 하나밖에 못열음.
'System Engineering > Kubernetes' 카테고리의 다른 글
docker 4/5 (0) | 2022.03.21 |
---|---|
Docker (Build, Ship, Run)? (0) | 2022.03.18 |
docker 2/5 (0) | 2022.03.16 |
실행중인 모든 컨테이너 한 번에 종료 (0) | 2022.03.16 |
docker exit code 의미 (0) | 2022.03.16 |
최근댓글