제수기 - 제발 수업내용을 기억해라 / 단순 수업정리 시리즈
가상 컴퓨터를 만들어서 돌리는 기술이 있다.
예전에는 그냥 물리적인 baremetal
우리가 아는 물리적 컴퓨터가 있고 - 소프트웨어 돌리고 하는 거에서
virtual machine
을 이용해서 컴퓨터 위에 컴퓨터를 돌리는 게 가능해졌다. 단점은 꽤나 무겁다는 거였다.
이 무거운 걸 경쾌하게 만든 게 containerization
docker도 여기에 해당한다.
baremetal
은 하드웨어에 os, software들이 설치된다. virtual machine
은 컴퓨터 자원들을 조금 더 활용하기 위해서 하드웨어 위에 가상컴퓨터 하나를 더 올린다. 하드웨어 위에 host.os
올리고 그 위에 virutal machine
위에 virtual os
, 그 위에 software.
물리머신(하드웨어)
-host os
-docker engine(runtime)
-image
를 기반으로 - 실제 실행 주체인container
가 돌아간다.
위에 있는 container
, image
크기가 커봐야 1gb. 굉장히 작다. 몇 mb로 돌아간다.
가벼울 수 있는 이유는?
: image가 하나의 컴퓨터인데, 이 안에 os가 있을 텐데, 이걸 실제 host os와 공유한다.
작동방식
: host os
의 상당부분을 공유한다는 건 티가 잘 안 난다. 그냥 container
, image os
여기가 하나의 컴퓨터라고 인식하면 된다. 보통 image os
에 리눅스나 ubuntu 이런 걸 쓴다.
그 위에 python
, django
를 쌓는다. 이걸 미리 하나의 image
로 만들어둔다. 여기서 'image'
는 실행 가능한 상태를 스냅샷처럼 찍어놓는 것을 의미한다. 이걸 실제 container
라는 형태로 실행하게 된다.
이미지-컨테이너의 관계
: 어떤 program
을 실행하려면 다운 해서 저장 객체에 저장해둔다. 더블클릭해서 실행하게 하면 process화
돼서 실행이 된다. 이렇게 실제 실행중인 상태를 process
라고 한다. 이처럼 image
는 실행할 수 있는 상태. 파일이 있는 거고, 실제로 구동하려면 container
를 해야 한다.
program이 image, process가 container와 비슷한 역할을 한다고 이해하면 된다.
wsl2가 뭐길래?
host os
옆에WSL
(리눅스에서 만든) 걸 기반으로docker engine
이 돌아간다. 참고로docker engine
은 다운로드 받은docker
파일 이라고 보면 된다.
docker를 cmd로 다루게 되면, desktop 버전도 이해가 잘 될 거다. 먼저 cmd로 다뤄보자.
image를 어디서 가져오냐. docker hub
파이썬 이미지를 검색해서 찾을 수 있다. linux os
위에 python interpreter
가 있고 이걸 image
로 만들 걸 보여주는 거.
nginx
: 장고 앞에서 요청을 받아내는 image
. 이걸 다운받아서 실행하면 웹서버가 하나 돌아가게 된다.
docker
를 입력하면 command 할 수 있는 내용들이 쭉 나온다.
image 명령어 / container 명령어 나눠져있다.
순서 : 이미지가 있어야 컨테이너화가 가능하다!!!
docker image ls
docker container ls
docker search hello-world
official imgae는 사용자 이름 생략하고 official로 올라온다. cmd에서 docker hub에 hello world로 있는 image
를 검색해보자. 여기서 사용자 이름이 붙은 것과 없는 것을 확인할 수 있다.
docker pull hello-world
: 불러오기docker image ls
: 잘 불러졌는지 확인docker run hello-world
: 실행docker run -d -p 80:80 nginx
위에서 봤던 host os , docker engine, image, container... 이 구조에서
host os(local host)
안의 docker
안에 nginx container
하나가 돌고 있는 거다.
docker
는 공유기 정도로 생각하면 된다. 컴퓨터와 컴퓨터가 연결되려면 공유기에 꽂거나 랜선으로 연결을 해야 할텐데 그 역할을docker
가 한다.docker network
. 아무튼 연결해준다.
-d deamon
: background process
-d deamon이 들어간 이유 .. 설명 놓쳤다.
-p publish(port)
: 80:80
80이 뭐냐. localhost:80
이 앞에 80. 뒤에 80이 nginx:80
.
docker container
의 nginx container
안에 nginx 80
이 돌고 있다(웹서버는 기본 포트가 80이다). localhost에:80
요청이 들어오면 nginx 안에 있는 80 데몬에 연결해줘. 라고 하게 되는 것.
원래는 접속하려면 ip 등이 필요한데 이때는 필요없다.
localhost:80 쓰면 웹페이지가 열린다. (주소창에서 기본포트라서 :80
이 부분은 유지되지 않고 사라진다.)
docker container ls
지금 돌아가는 거
docker container ls -a
만든 거 다 확인
docker ps -a
얘가 더 잘 쓰인다.
CONTAINER ID : 앞에 3글자가 식별자 / IMAGE : 어떤 이미지인지 / COMMAND : 명령어 - 언제 만들어진건지(이미지로부터 컨테이너가 만들어진 시점) / STATUS : up 되고 있음 exited : 끝났음
아까 처음꺼는 이름을 정하지 않았기 때문에 이름이 아무렇게나 지어졌다. wizardly_varahamihira라고 지어진 게 보인다. 이번에는 이름을 ngix2. 로컬호스트 81로 해서 run을 해보자. 이제 두개가 돌아가는 걸 확인해 볼 수 있다.
- container -> image 순으로 삭제가 된다. -f를 넣어서 강제 시키면 강제로 삭제가 되기는 한다.
- 중단 먼저 해야 삭제가 된다.
docker container stop ngix2
docker container rm 330
docker image rm -f 0a399eb16751