vmware, virtualbox와 같은 가상 머신처럼 독립된 실행환경을 제공하면서도, 컴퓨터에 직접 애플리케이션을 설치한 것과 같이 빠르고, apt, npm, pip 처럼 명령어 한줄로 원하는 앱이 포함된 실행환경을 손쉽게 설치할 수 있는 환상적인 개발환경을 제공하는 툴.
🤦♂️ 찾아봅시다
Q. 도커와 가상머신의 차이점, 공통점은 뭔가요?
- 공통점 : 하나의 물리적 공간에서 여러가지 서비스를 사용할 수 있게 하기 위해서 독립적인 공간을 생성한다.
- 차이점 :
가상머신 VM 도커 Docker 호스트 운영체제를 공유 x 호스트 운영체제를 공유 O 보안적 측면에서 유리 보안위험, 취약점 많음 여러 운영체제 환경에 유리 단일 운영체제 환경에 유리
가상머신은 하나의 독립된 컴퓨터를 컴퓨터 안에 생성하는 것이라서, OS, binary, Library등 여러가지 필수로 들어가야 할 정보들의 있기 때문에 무겁다. 도커 엔진 위에서 도커 image를 실행시켜서 독립된 App을 실행시키는 원리이기 때문에 훨씬 가볍다. 보안적 측면에서 보면, VM은 운영체제를 공유하지 않기 때문에 호스트 커널에서 분리가 되므로 도커에 비해서 안전하다. 반대로 도커는 호스트 커널을 공유하고, 리소스도 공유되기 때문에 하나의 컨테이너에 접근가능하면 클러스터에 속한 모든 컨테이너에 접근이 가능해지므로, 보안 위험과 취약점이 많다. 도커의 경우에는 이식성이 뛰어나고, 영구적으로 리소스를 할당할 필요가 없고, 심지어 운영체제도 설치할 필요가 없기 때문에, 컨테이너를 확장하고, 복제하는것도 가상시스템에 비해 간단하다. - 따라서, 도커는 단일 운영체제에서 여러 응용프로그램을 실행하려는 경우에 더 적합하고, 서로 다른 운영체제환경에서 실행해야하는 어플리케이션이나 서버가 있는 경우에는 VM이 더 적합할 수 있다.
Anyway, 도커를 쓰십시요.
컨테이너 기술은 리눅스 운영체제 기술이다.
- 그러므로, 컨테이너와, 컨테이너에서 동작하는 앱들은 모두 리눅스 운영체제에서 동작한다는 뜻.
- 만약 내 컴퓨터가 리눅스 운영체제가 아니라면? 그래도 괜찮다!
윈도우, 맥 OS위에 가상머신을 깔고 가상머신에 linux를 깔면 되니까
도커는 리눅스 운영체제 기반으로 만들어졌으므로, 리눅스 운영체제상에서는 괜찮지만, 다른 운영체제에서는 가상머신을 이용해야하므로, 속도저하가 발생한다.
But, 그걸 감수하고서라도 도커를 설치해서 사용하는게 엄청난 성능향상을 가져온다.
도커는 윈도우 /맥 OS에서 그래픽환경을 지원하는 데스크탑 앱을 제공하지만, 명령어를 이용하는 cli환경에서 docker를 사용하는게 도커를 100% 사용하는 방법이다.
리눅스 OS에서 docker를 쓸 경우 "sudo"를 붙여서 실행해야함.
terminal에서 docker images
명령어가 에러없이 작동되면 docker설치가 정상적으로 종료되었다는 뜻이다.
도커에서는 dockerhub에서 image를 다운로드해서 실행하면 container가 됨.
Docker Hub
apache 웹서버 프로그램 : httpd라는 이미지로 등록되어 있음.
docker official image : 도커에서 공식적으로 관리하는 이미지들 태그.
Docker Docs : 도커 사용설명서
매뉴얼을 참고해서 명령어를 사용하면 됨.
docker pull httpd
docker images
이제 수많은 도커 이미지들을 다운로드받을 수 있게 됨!
run : 이미지를 기반으로 컨테이너를 실행시키는 명령어.
run 명령을 실행할 때는 컨테이너들의 이름을 서로 헷갈리지 않게 지정하는게 중요함!
실행중인 컨테이너가 컴퓨터의 자원을 이용하는 중이다 -> 자원의 사용률을 줄이고 싶다면, 컨테이너를 중지시키면 된다.
만약 컨테이너를 아예 삭제하고 싶다면 rm명령어를 이용하기.
명령어 정리
- httpd 기반으로 컨테이너를 만들고, 실행하기
docker run httpd
- 실행중인 컨테이너의 상황을 보기
docker ps
- 실행중이지 않은 컨테이너까지 모두 현재상황 보기
docker ps -a
- 새로운 컨테이너 이름을 ws2로 설정해서 생성하기
docker run --name ws2 httpd
- 실행중인 컨테이너를 중지하기
docker stop ws2
- 중지시켰던 컨테이너를 다시 실행하기
docker start ws2
- 컨테이너의 로그를 한번만 출력하기
docker logs ws2
- 컨테이너의 로그를 실시간으로 출력하기
docker logs -f ws2
- 컨테이너를 삭제하기
docker rm ws2
docker run httpd
docker ps
docker run --name ws2 httpd
docker stop ws2
docker ps// 꺼졌는지 확인
docker ps -a
docker start ws2 //이때 로그가 안보임
docker logs ws2
docker logs -f ws2
docker rm ws2 //현재 실행중인 컨테이너는 바로 삭제 불가능 -> 에러발생
//방법 1. 실행중지 후 삭제
docker stop ws2
docker rm ws2
//방법 2. 강제 삭제
docker rm --force ws2
image를 command line에서 삭제하고 싶을 때
:docker rmi httpd
서버 클라이언트, 포트, 네트워크에 대한 기본지식 필요.
docker run httpd
docker run -p 80:80 httpd
docker run -p 8000:80 httpd
docker pull httpd
docker ps
docker run --name ws3 --publish 8081:80 httpd
docker ps
이제 http라는 어플리케이션을 실행할 수 있는 상태가 됨.
index.html을 편집해서 web app을 만들기 위해서는, container안으로 들어가서 파일을 수정할 수 있어야 한다.
pwd
host에서 pwd가 아니라 container안에서 pwd실행한거
ls -a
container안에 있는 파일을 보여줌
docker ps
docker exec ws3 pwd
pwd명령을 컨테이너 대상으로 커맨드 1회 실행
docker exec ws3 -it /bin/sh
이때부터 내리는 명령은 모두 컨테이너 안에서 실행됨.
-it옵션 없이 실행하면, shell프로그램이 실행되자마자 바로 종료된다.
exit
container에서 host로 나가기
🤦♂️찾아봅시다
Q. -it 옵션의 의미?
-i --interactive : 명령어를 입력받을 수 있도록 상호 입출력가능하게 세션을 열어두도록 변경
-t --tty : tty를 활성화해서 셸(shell)을 사용하도록 활성화 (터미널과 유사한 환경을 제공)
index.html파일의 경로는 매뉴얼페이지에 적혀있다.
/user/local/apache2/htdocs/
폴더로 이동한다. It, workts
에서 Hello, Docker!
로 변경 후 저장한다.컨테이너안에 있는 index.html파일을 직접 수정할 수 있게 되었습니다. ㄱ와우ㄴ
위의 사진처럼, 컨테이너 안의 index.html파일만 수정해서 웹페이지를 변경했는데, 만약 컨테이너가 삭제된다면, 수정된 index.html파일도 삭제된다. 흑흑
만약, host에 있는 특정 폴더와 container의 특정 폴더를 연결하고, host에서 수정했을 때 container에 연동될 수 있다면?
mkdir ~/Desktop/htdocs && cd ~/Desktop/htdocs
vi index.html
docker run -p 8080:80 -v ~/Desktop/htdocs:/usr/local/apache2/htdocs/ httpd
vi index.html
🤦♂️찾아봅시다
Q. 도커 볼륨과 바인드마운트의 차이점이 무엇인가요?
둘의 가장 큰 차이점은, docker가 mount point를 관리해 주느냐의 여부로 나뉜다. 컨테이너화된 개발 환경을 구축하고 싶을 때는 bind-mount가 더 유리하기 때문에 로컬에서 개발할 때는 바인드 마운트 방식이 적합하다.
도커 볼륨 바인드마운트 Docker가 mount point관리 O (docker가 제시한 경로에 맞춰서 생성) X (원하는 경로를 명시) Type volume bind
Q. 지금은 바인드마운트를 사용한것 같은데 과제에서는 볼륨을 써야하나요?
subject에 volume2개를 사용하라고 명시되어있어서 yes로 추정 근데 docker-compose 보다보니 아닌거같기도해요..Q. 컨테이너를 run한 뒤에 나중에 volume 을 설정해줄 수는 없나요?
가능하기는 하다 하지만 권장하지 않음. 컨테이너는 시작시에 볼륨설정을 끝내야하므로, 볼륨을 추가하려면 재시작을 권고한다.
JAYOON님 의견
<웹서버 구동해보기 파트 첨언>
세 개의 컴퓨터에 운영체제부터 설치하는 게 잘 안 되는 게 아니라 웹 서비스 하나를 위해 컴퓨터 세 개나 필요한 게 문제입니다!
겨우 웹서버를 위해 가상 머신을 설치하는 것 때문에 굉장히 느려지는 게 아니라 host 운영체제 위에 다른 OS 를 설치하니까 느려집니다. 웹 브라우저와 웹 서버는 저수준 언어로 만들어져 있는데 이런 저수준 언어 프로그램을 사용하기 위해 OS 위에 또다른 OS 설치하는 것이 오버헤드가 너무 큽니다.