컨테이너의 파일 차분 확인
$ docker container diff CONTAINER
컨테이너의 초기 상태 (이미지일 때의 상태) 로부터 무엇이 달라졌는지 알 수 있다.
A 파일 추가
C 파일 수정
D 파일 삭제
hostname 바꾸는 법?
근데 이렇게 해도 변경이 안됨. 강사님이 추정컨대, docker가 name을 관리하고 있어서 변경이 안되는거같대.
하여간... 이거는 diff로 바뀌는 내용 확인하려고 한거고. 별 의미 없음.
이미지 상세 정보 확인
$ docker image inspect IMAGE
컨테이너 상세 정보 확인
$ docker container inspect CONTANIER
컨테이너 리소스 사용 정보 확인
$ docker container stats CONTAINER
$ docker container exec centos7_1 ps -ef -> 만약에 해당 컨테이너에 ps가 설치 안되어있으면 실행 불가
$ docker container top centos7_1 -> 이건 암것도 설치 안되어있는 컨테이너에서도 사용 가능
둘 다 PID 보여주는거긴 한데, exec는 컨테이너 관점에서, top은 Docker host관점에서 보는거임.
Dangling Image Layers 정리
$ docker image prune
컨테이너에서 사용되지 않는 이미지 정리
$ docker image prune -a
컨테이너 이름 바꾸기
docker container rename 구이름 신이름
-----
도커 네트워크
Bridge Network (컨테이너가 만들어지면 여기에 속함.)
- Docker 내부 네트워크가 호스트의 인터페이스를 통해 외부 네트워크와 연결 될 수 있는 네트워크
- Docker Host의 기본 브리지 네트워크 인터페이스 : docker0
- Docker Container의 기본 브리지 인터페이스 : vethXXXX
Host Network (얘도 외부와 통신이 되더만. 그런데 테스트용...)
- Docker Host의 네트워크를 직접 공유하는 네트워크
Null Network
- 네트워크가 필요하지 않은 도커 컨테이너에서 사용하는 네트워크 유형으로 외부와 네트워크가 연결되지 않는 네트워크
MAC VLAN Network (여기서 다루진 않고, 도커 호스트가 여러 개가 있는 상황에서 쓰는거래.)
- 호스트 네트워크 인터페이스와 같은 네트워크에 연결하는 네트워크
네트워크 목록 확인
$ docker network ls
네트워크 상세 정보 확인
$ docker network inspect NETWORK
네트워크 생성
$ docker network create NETWORK
$ docker network create -d NETTYPE --subnet SUBNET_CIDR --gateway GATEWAY NETWORK
-d : bridge, host, null
네트워크 인터페이스 중에 lo : 루프백 인터페이스, 실제로 통신은 하지 않고 네트워크가 정상적으로 동작하는지 확인하기 위해 사용하는 인터페이스. 물리적으로 존재하지는 않음.
ping -c 3 www.google.com 이렇게 되면 핑 3번만 날림.
ifconfig도 쓰고 싶으면:
apt-get install net-tools -y
이번엔 새로운 컨테이너에 네트워크를 붙여보자.
docker container run -dt --name debian_2 debian:latest /bin/bash
docker network connect net2 debian_2 (일케 하면 원래 bridge network랑 net2 network 동시에 연결)
docker network disconnect bridge debian_2 (이렇게 하면 bridge network 떼버림)
참고) 실수로 알아낸건데, 한 컨테이너에 여러 네트워크를 붙이는 것도 가능.
참고2)
원래 default network가 bridge니까 이게 eth0으로 잡히거든.
그런데 이걸 disconnect하면 eth0 사라지고 eth1 eth2 이렇게 남아.
그리고 다시 bridge network를 connect 하면?
eth0으로 다시 잡히는게 아니라!
eth1 eth2 eth3 이렇게 새 네트워크로 잡혀.
컨테이너에 네트워크 지정하여 실행
$ docker container run -d -t --network NETWORK --name CONTAINER IMAGE
실행중인 도커 컨테이너에 네트워크 연결 (실행중인 컨테이너의 네트워크를 중간에 바꾸고 싶으면?)
$ docker network connect NETOWRK CONTAINER
도커 컨테이너에 네트워크 연결 해제
$ docker network disconnect NETWORK CONTAINER
도커 네트워크 삭제
$ docker network rm NETWORK
참고) 컨테이너가 연결된 네트워크는 못지움. 네트워크 끊어주고 지우면 됨. "disconnect"
Q) 내부 컨테이너와는 연결이 되고, 외부 컨테이너와는 연결이 안되게 하려면?
(나 internal 네트워크를 만들어서 컨테이너들을 연결해야되는줄 몰랐어... ㅁㅊ... )
일단 3가지 네트워크중 뭘 써야할까? (난 틀림. null인가..함...)
ㄴbridge로 해야된대
여기에 있네. --internal. --subnet. --gateway (X 이건 외부로 나가는 관문)
docker network create -d bridge --subnet 172.21.0.0/16 --internal internal-net
docker container run -dt --network internal-net --name internal1 devops2341/network-multitool:latest
docker container run -dt --network internal-net --name internal2 devops2341/network-multitool:latest
사용하지 않는 네트워크 삭제(컨테이너가 1개라도 연결되지 않은 네트워크)
$ docker network prune
서비스 제공을 위한 특정 포트 포트 포워딩
$ docker container run -d -p HOST_PORT:CONTAINER_PORT --name CONTAINER IMAGE
기본적으로 외부에서 컨테이너로 바로 접근할 수는 없다. 반드시 docker host를 거쳐서 와야한다.
docker host로 들어온 넘을 다시 컨테이너로 넣어줘야돼.
즉, 포트 포워딩을 해줘야 해.
일종의 NAT가 일어나는거지.
docker container run -d -p 80(host port):80(container port) --name centos7_1 centos:7
만약에 컨테이너에서 여러 개의 웹 서비스를 제공해야 한다면?
기본적으로 하나의 호스트에서 동시에 80번 포트를 여러 개 열 수가 없어. 무조건 하나의 프로세스와 연결되어야 하거든.
그럼 Docker host의 포트 번호를 다르게 해서 전달을 해줘야대.
docker container run -d -p 8080(host port):80(container port) --name web1 ubuntu/apache2
docker container run -d -p 8081(host port):80(container port) --name web2 ubuntu/apache2
컨테이너 실행시 링크를 사용하여 특정 컨테이너와 연결
$ docker container run -d -t --link TARGET_CONTAINER --name CONTAINER IMAGE
web 컨테이너 (192.168.100.2), nfs 컨테이너(192.168.100.3)가 있었어.
그런데 nfs 컨테이너가 비정상 종료를 했어. 그리고 그 이후에 A라는 컨테이너가 켜지고 ,nfs 컨테이너가 그 다음에 켜졌어. 그럼 컨테이너에서 ip는 자동 할당되는거니까, a컨테이너가 192.168.100.3이 되고 nfs 컨테이너가 192.168.100.4가 돼. 그러면 a컨테이너에 접속할테니 정상 작동을 안할거아냐. 그럼 a컨테이너를 통해서 nfs 컨테이너를 찾아갈 수 있게, 컨테이너의 이름으로 컨테이너에 접근할 수 있게 연결해주는걸 link라고 함.
컨테이너 만들면 이름이 default로 랜덤하게 만들어지지? 그래서 컨테이너 이름으로 접속할 수 있음.
심지어 재시작을 해도 ip가 달라질 수 있어. 그때, 링크를 걸면 달라진 ip를 컨테이너의 이름으로 찾아갈 수 있어.
web3로 들어갔음.
거기서 curl http://172.17.0.2 (web2 ip) -> 결과 잘 나와
curl http://web1 -> 이것도 결과가 잘 나와!
docker daemon이 컨테이너의 ip가 바뀌더라도 컨테이너의 이름으로 접속할 수 있게 해줌.
즉.... 한마디로 요약하면
web3에다가 web1을 link 걸어두면, 나중에 web1이 재시작되어서 ip가 바뀌더라도, 이름으로 찾아갈 수 있다!
(ip가 바뀌더라도 접근이 되어야되는 서비스에 응용을 할 수 있다. 예를 들어, 웹서버가 디비에 연동이 된다고 하자. 이럴 때, 컨테이너가 재시작 되더라도 (ip가 바뀌더라도) link를 사용해서 연결을 유지해주는거야.만약 link를 사용하지 않는다면 별도의 dns를 구축 해야겠지?
(질문)도커 공식 문서에서 link 옵션은 레거시 기능이라 사라질 수 있어서 네트워크 옵션을 추천하던데, 네트워크 주소 변경되는 문제점은 dns 서버 구축 말고 컨테이너 이름을 사용하여 통신하는 것으로 해결 안되나요?
-> deprecated (사라질?) 될 예정인건 맞다. 그런데 link는 두 컨테이너간 환경 변수도 공유가 된다.사라지기 전까지는 컨테이너들을 긴밀하게 연결하기 위해서는 써도 좋을 것 같다. 라고 말씀 하셨는데, 나는 안쓰는게 나을 것 같음.여기서 네트워크 옵션은, 같은 네트워크에 넣고 그 네트워크끼리 통신하라는 소리같음. 근데 그러면 ip는 바뀔텐데... 결국 dns 서버를 구축해야겠군?
네트워크 connect는 환경 변수 공유가 안된대. 별도의 방법을 이용해서 공유해야한대.
2022/04/08 강사님이 놓친 부분이 있다.
완벽한 IT 인프라 구축을 위한 Docker 2판, 132p를 보면 --link를 대체할 옵션이 제시되고있다.
"한편 사용자 정의 네트워크는 docker 데몬에 내장된 내부 DNS 서버에 의해 Name resolution이 이루어집니다. 내부 DNS 서버를 사용하면 link 기능과 같이 /etc/hosts 파일에 의존하지 않고 Name resolution을 할 수 있으므로 컨테이너명뿐만 아니라 컨테이너 시작 시에 지정한 --net-alias 옵션을 사용한 앨리어스명으로도 통신을 할 수 있습니다.
사용자 정의 네트워크를 사용하는 편이 보다 유연하고 쉽게 네트워크 구성 관리를 할 수 있기 때문에 특별한 이유가 없는 한 이쪽을 사용하는 것이 좋습니다."
이제 web1, web2 컨테이너가 같은 bridge network에 속하게 되었어.
web1에서 web2의 dns alias로 ping을 보내보자.
ping이 잘 간다.
--link 안쓰고 network를 만든 다음에 --net-alias 쓰는게 낫네.
주의)
1) default network에 연결된 container는 --net-alias 설정을 할 수 없다.
까먹고 사용자 정의 network에 연결 안하고 --net-alias를 해줬는데, docker container inspect로 확인해보니
Aliases:null로 나와서 어 이거 왜 안되지? 라고 생각했었어.
2) Container를 생성할 때 --net-alias 설정을 해줘야 한다.
생성된 후에는 alias를 설정할 수 없다. -> 할 수 있다.
-> alias1이라는 container를 default gateway에서 떼내고, web-network에 labeling이라는 alias로 지정을 해 줬는데
이렇게 뜬다. null로 나와.
의문)
음... 뭐지? 그러면 docker network connect의 --alias 옵션은 왜 있는거야? ㅡㅡ;
container가 생성된 후에도 가능해야할 것 같은데?
잘못봤다!!! 된다!!!!
-----
컨테이너는 서버를 경량으로 실행하는 형태. 컨테이너는 임시적으로 실행되는 성격이 강하다.
데이터를 계속 갖고 있기에는 적합하지 않다. 데이터를 누적/영구적으로 사용하기 위해서는 volume이라는 개념을 사용한다.
그래서 컨테이너는 컨테이너 바깥의 공간에 저장해야한다. 그게 바로 볼륨임~
컨테이너에도 데이터를 저장할 수는 있긴 하지만, 많은 데이터를 저장하면 컨테이너가 무거워진다.
컨테이너는 경량으로 유지되어야 하므로 이는 부적절하다.
볼륨
도커 컨테이너에서 데이터를 저장하는 방식을 제공하는 기능
볼륨의 종류 2가지
- Bind Mount
도커 호스트의 파일시스템의 디렉터리 저장 공간을 컨테이너에 제공하는 방법
- Volume
도커의 볼륨 오브젝트를 컨테이너에 연결하여 저장공간을 제공하는 방법
[실습 : Bind Mount]
$ docker container run -d --volume DOCKER_HOST_PATH:CONTAINER_PATH --name CONTAINER IMAGE
$ docker container run -d -p 8080:80 --volume /home/user:/web --name web1 ubuntu/apache2:latest
$ docker container run -d --volume VOLUME:CONTAINER_PATH --name CONTAINER IMAGE <- 요렇게 써야댐.
이렇게 하면 Docker host의 디렉토리인 /home/user가 컨테이너의 /web과 연결된거야.
(참고로 컨테이너의 /web는 없어도 만들어진다.)
[실습 : Volume]
$ docker container run -d --volume VOLUME:CONTAINER_PATH --name CONTAINER IMAGE (Volume Object 사용)
$ docker container run -d -t --volume testvol:/work --name centos_vol1 centos:7
질문)
Volume 오브젝트가 이해가 안갑니다. 볼륨 오브젝트 생성을 어디에 하고 어떤 객체 인건지...
오브젝트 : Docker Daemon이 API가지고 관리하게 됨. 도커가 관리하는 대상!
도커 이미지, 도커 네트워크, 도커 이미지, 몽땅 다 오브젝트임.
볼륨을 생성하는건 도커 호스트에 생성됨. 어디에 저장되는건지는, 도커 데몬이 알아서 관리하는거임.
Volume에 대한 더 자세한건 내일 알려준대.
'System Engineering > Kubernetes' 카테고리의 다른 글
docker 6/6 도커 사설 레지스트리 (0) | 2022.03.23 |
---|---|
docker 5/5 (0) | 2022.03.23 |
Docker (Build, Ship, Run)? (0) | 2022.03.18 |
docker 3/5 (0) | 2022.03.17 |
docker 2/5 (0) | 2022.03.16 |
최근댓글