docker 이미지, 네트워크 등 기본 명령어
## 이미지
#이미지의 기본개념
도커는 이미지라는걸 사용해서 컨테이너를 띄운다.
https://jacobowl.tistory.com/230
docker 기본 개념, 설치 및 컨테이너 관련 기본명령어들
# 일반적인 가상화 (우리가 쓰는 VMware workstation) 먼저 아래서부터 순서대로 우리 데스크탑에 깔려있는 host hard ware위에 윈도우OS가 깔리고 hypervisor 역할로는 VM ware work station이 있다. 그리고 guest har
jacobowl.tistory.com
이 포스팅에서 이미지와 docker hub에 관한 내용이 잠깐 들어있으니 찾아보자.
# 이미지 가져오기 명령어 pull
docker pull 이미지이름:태그
docker hub에 있는 잘 만들어진 이미지들을 가져올 수 있다.
이전 포스팅에선
docker run 이미지이름:태그
run 명령어는 단순 명령어로 pull 없이 바로 이미지를 pull해온후 컨테이너를 create해온후 start해버린다.
따라서
docker run --name hellotistory nginx
docker pull nginx
docker create --name hellotistory nginx
docker start hellotistory
두 박스의 명령어는 같은 명령어이다.
실제로 쳐보면
이렇게 컨테이너가 무사히 띄워진걸 볼 수 있다.
정확히는.. run -d로 백그라운드로 띄워야 정확히 일치한다고볼수있지만.뭐 중요한건 개념이니 걍여기까지..
# 이미지 목록보기
docker images
docker image ls
걍이렇게 둘중 원하는거 쓰면된다.
둘다 걍 똑같이 생겼다. 기타등등 모르겠는건 넘어가고, 여기서 중요한 컬럼은
레포지토리와 태그 컬럼이다.
pull을 칠때 repository:tag 이런식으로 치게된다. 아까 이미지명:태그로 쳤다고한게 이거다.
만약 이미지명만 치게된다면 태그는 latest로 보통 지정된다.
암튼 이 이미지명과 태그는 이미지파일의 식별자라고 볼 수 있다.
# 이미지 삭제
docker rmi 이미지명:태그
지워진다.
모든 이미지를 삭제하는 명령어는
docker rmi $(docker images -q)
얘다.
+ 컨테이너 전체삭제
docker rm $(docker ps -a -q)
도커 이미지가 삭제가 안될떄가 있는데,
docker rmi -f 이미지명:태그
이 명령어로 지울 수도 있다.
만약 어떤 이미지로 띄운 컨테이너가 동작중인데, 해당 이미지를 강제로 삭제한다면 띄워있는 컨테이너는 어떻게될까?
아래 코드들을 보면
이미지가 삭제되었지만 컨테이너는 계속 띄워있다.
이미지리스트에는 nginx 이미지가 NONE으로 바뀌어있다.
뭐 이럴경우는 없겠지만 이래버리면 컨테이너가 오류를 띄울수도 있다고 한다.
# 도커이미지 뜯어보기 inspect
docker inspect 이미지명:태그
이 명령어다. 이걸로 nginx를 뜯어보면
이렇게 나온다. 죄다 해시스트링 천지라 뭔지모르겠지만 중요한건 layer다. 도커 이미지는 계층적인 구조로 이루어진다.
때문에 nginx:latest 이미지로 커스텀이미지를 만들게된다면 그 커스텀이미지는 저 layer 어레이에서
몇개씩 요소가 추가가되더라.
+ nginx official이미지에선 nginx를 포그라운드로 동작시키는 CMD가 추가되어있는거 방금 알게됨 ㅋ
# 이미지 검색
docker search 이미지명:태그
nginx를 검색해보면
요렇게 이미지들이 나온다. 이미지 원하는거 다운받으려할떄 없으면 써보면될듯.. 도커헙 호스트도 나오고 그러니까.
# 이미지 이름 변경
docker tag 현재이미지이름:태그 새이미지이름:새태그
바꾼다는건데 실제로 쳐보니 새로운이름의 카피가 나오더라.
# 도커 커스텀 이미지 만들기 명령어 (중요하지만 나중에 자세히씀)
docker build -t 이미지이름:태그 경로
docker commit 컨테이너이름 만들이미지이름
커스텀 이미지를 만들때 쓰게되는 명령어인데
커스텀이미지 포스팅에서 주로 다룰예정임.
## 도커 네트워크
도커 네트워크는 기본적으로 아래 그림과 같은 구조를 가지고 있다.
그림그림그림그림
# 네트워크 생성하기
docker network create 네트워크이름
이렇게 네트워크를 만들 수 있다.
docker network ls
얘는 생성된 네트워크 보는 명령어임. 암튼 네트워크 만들고 목록보고 해보면
이렇게 네트워크가 만들어진걸 확인할수 있다.
만들어준 네트워크 상세설정을 보려면
docker network inspect 네트워크이름
이 명령어로 확인 할 수 있는데 아까 만든 babonet을 확인해보면,
요래뜬다.
자동으로 172.19.0.0/16의 네트워크가 만들어졌고 이 네트워크의 아이피들을 dhcp서버마냥 뿌려줄거다.
게이트웨이는 172.19.0.1로 자동설정이 되었다.
또한 해당 네트워크에 연결된 컨테이너를 Containers라는 프로퍼티에서 확인할 수 있는데, babonet은 만들기만 헀으니 아직 연결된 컨테이너가 없다.
# 네트워크 서브넷과 뿌려줄 아이피 대역
docker network create --subnet=172.18.0.0/16 --ip-range=172.18.0.0/24 --dns=8.8.8.8 네트워크이름
네트워크 생성할때 여러 옵션을 줘서 만들 수 있다.
저기서 --subnet과 --ip-range 옵션으로 네트워크 대역대와 뿌려줄 아이피 대역을 정해줄 수 있다.
위 코드에선 172.18.0.0/16대역대를 쓴다고 되어있다.
그리고 ip-range로 해당네트워크에서 dhcp서버에서 아이피 뿌려주듯 뿌려줄 아이피의 대역을 정해줄수 있다.
만약 host네트워크대역이랑 겹치게되서 host의 아이피나 게이트웨이 아이피를 어떤 컨테이너가 받게되면 네트워크가 멈춰버리는 현상이 일어날 수도 있으니까 아예 겹치지 않는 네트워크 대역대를 잡아주는게 좋을거다.
물론 컨테이너 별로 많이 띄울일도 없으면 필요없기도 하지만 혹시모르니..
무슨말인지 이해가안되면 네트워크 아이피주소체계에대해서 알아보고오면 될거다.