흔히 저지른 실수 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로 할당됨.

 

https://jootc.com/p/20170306208



-----

 

https://velog.io/@ckstn0777/%EB%8F%84%EC%BB%A4-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B5%AC%EC%A1%B0

 

6장. 도커 네트워크 구조

이 포스팅은 위키북스의 시작하세요! 도커/쿠버네티스 를 보고 공부한 내용을 바탕으로 하고 있습니다. (문제가 된다면 비공개 처리하겠습니다😂😂)앞서 언급한 바와 같이 도커는 172.17.0.X를

velog.io

 

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번 포트 열려있는지 확인)

참고로, netstat은 yum install net-tools로 설치 가능


 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 발생해.

 

docker container inspect centos7_net2. 아까 network 만들고 대역을 172.20.0.0/16으로 뒀거든. 그게 다였는데, 자동으로 Gateway가 생겼어.
docker network inspect my_bridge. 이 네트워크에 centos7_net2라는 컨테이너가 들어갔어.


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의 약자야.)

 

[Kubernetes] # 쿠버네티스 네트워크 구성도

❗️ 본 게시글은 개인적으로 이해한 내용을 작성한 게시글입니다. 쿠버네티스는 기본적으로 docker의 네트워크 구성도를 베이스로 한다. docker와 비슷하지만 미묘한 차이가 있다. 따라서 파드 네

velog.io

주의할 것) -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 주소 확인)
 (컨테이너 네트워크의 다른 컨테이너와 통신 및 외부 네트워크 통신 테스트)

 

컨테이너 외부와 통신 가능
게이트웨이와 통신 잘 됨
외부 인터넷과도 통신 잘 됨 (google.com)

 

그럼 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 주소로 접근해야 된대.

--network host로 하면 신기하게 host name이 바뀌네. 하지만 컨테이너 내부에 있는거다. 오해X. 유일한 차이가, 현재 위치가 / 라는거.. 원래는 ~ 였음. [root@docker ~]$ 이렇게.


$ 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 하려고 하면, 아예 안돼.

이런 에러가 뜨네?? 컨테이너 삭제하고 --network host로 다시 생성해야 한대. 처음에 만들면 default로 bridge로 연결된대.&nbsp; 참고 :&nbsp; https://stackoverflow.com/questions/54720587/how-to-change-the-network-of-a-running-docker-container


[root@DOCKER_HOST]$ yum install httpd
[root@DOCKER_HOST]$ systemctl start httpd
  (컨테이너 내부이므로 systemctl 명령어가 실행 안됨)

이런 에러가 발생함. 왜? 컨테이너에는 system.d가 없대. 이미지에 포함이 안되어있대.

그래서 직접 실행 시켜줘야해.


[root@DOCKER_HOST]$ /usr/sbin/httpd & (직접 실행)
[root@DOCKER_HOST]$ curl http://localhost
[root@DOCKER_HOST]$ curl http://DOCKER_HOST_IP

 

컨테이너가 host의 네트워크를 공유하니까, 여러 NIC 갖고 있는걸로 나옴. 그 ip로 접속해도 모두 접속 정상적으로 됨.



 (Docker Host에서 확인)
$ curl http://localhost
$ curl http://DOCKER_HOST_IP
  (Docker Host는 웹 서버를 실행하지 않았지만  정상 접속 확인)

컨테이너에서 빠져나옴. Docker Host는 웹 서버 실행 안했는데도 접속이 됨.

이번에는 호스트 컴퓨터의(윈도우 10랩탑) 크롬 브라우저에서 접근해보자.

 

참고로 가상 네트워크 어댑터 이미 있음.

 

안들어가짐. 왜? 방화벽이 막혀있어서 그렇대.
이렇게 하면 http에 대해서 방화벽이 open 되나봐.
접근이 됨.

장점? 호스트 네트워크를 직접 공유해서 사용하면, 호스트의 IP, PORT, 도메인주소를 직접 사용할 수 있다.

단점? 반대로, 컨테이너에서 어떤 서비스를 하고 있으면, 호스트에서는 못씀.

ex) 컨테이너에서 웹서버 80번포트로 운영중이면, 호스트에서 80번 포트는 못씀.

호스트에서는 한 번에 하나의 포트만 쓸 수 있으니까.

 

HOST 네트워크 = 테스트 용.

테스트 목적으로 한 번에 여러 개의 포트를 개방해서 사용을 해야 한다거나, 사용 할 포트가 불분명할 때 사용하는거고, 보통은 외부에서 접속할 포트만 지정해서 사용하는 것이 바람직하다.

 
-----

[실습 : Null Network 사용]

 

네트워크가 연결될 필요가 없는 컨테이너

잘 알아야 할 것) 이름은 none이고 방식이 null이다. 주의!


$ docker container run -d -t --network none --name centos_none centos:7

그래서 --network none으로 해야됨.
Networks가 none으로 만들어졌지.

Docker 설치가 되면 기본적으로 Bridge, Host, Null (이름은 none) 네트워크 3개가 만들어짐.

 

None 네트워크 밑에 centos_none이 위치함.

원래는 저 컨테이너에서 ifconfig를 사용해서 ip를 확인하고 싶었는데, 저 컨테이너가 인터넷 연결이 끊어져있는 컨테이너라 직접 확인이 불가능함. 그래서 docker network inspect로 간접적으로 확인한건데.....

이미 네트워크 도구가 설치된 이미지를 설치하면 된다.


$ docker container run -d -t --network none --name test_none devops2341/network-multitool:latest (IP와 관련된 도구가 설치된 이미지)

위 : bridge 네트워크, 아래 : null 네트워크. (null 네트워크는 NIC 카드가 없다)
다른 컨테이너, 외부 인터넷, Docker Host 어디로도 ping이 안감.


$ 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
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기