Docker

lamPolar·2023년 4월 4일
3

42seoul

목록 보기
4/5
post-thumbnail

'도커(Docker)' 란 무엇인가?

vmware, virtualbox와 같은 가상 머신처럼 독립된 실행환경을 제공하면서도, 컴퓨터에 직접 애플리케이션을 설치한 것과 같이 빠르고, apt, npm, pip 처럼 명령어 한줄로 원하는 앱이 포함된 실행환경을 손쉽게 설치할 수 있는 환상적인 개발환경을 제공하는 툴.

웹서버를 구동해보기

  1. 세개의 컴퓨터에 운영체제부터 설치 -> 잘 안됨
  2. 하나의 컴퓨터에 가상으로 컴퓨터를 만들고, 운영체제를 만든후에 웹서버를 설치하기-> 이게 가상머신 (vmware, virtualbox)
    웹서버를 위해서 가상머신을 설치한다면? 굉장히 느려진다!!
  3. 한대의 컴퓨터 안에서 각각의 앱을 격리된 환경에서 실행시키기
    호스트에서 실행되는 격리된 각각의 실행환경 = 컨테이너

    각각의 컨테이너에는 운영체제 전체가 아닌 앱을 실행하는데 필요한 라이브러리/ 실행파일만 포함된다. 그래서 무척 가벼워짐!!

    운영체제가 하나니까 속도도 빨라지고, 저장장치의 용량도 아낄수 있다.
    이런 컨테이너를 제공하는 툴중에 하나가 도커.

🤦‍♂️ 찾아봅시다

Q. 도커와 가상머신의 차이점, 공통점은 뭔가요?

  • 공통점 : 하나의 물리적 공간에서 여러가지 서비스를 사용할 수 있게 하기 위해서 독립적인 공간을 생성한다.
  • 차이점 :
가상머신 VM도커 Docker
호스트 운영체제를 공유 x호스트 운영체제를 공유 O
보안적 측면에서 유리보안위험, 취약점 많음
여러 운영체제 환경에 유리단일 운영체제 환경에 유리

가상머신은 하나의 독립된 컴퓨터를 컴퓨터 안에 생성하는 것이라서, OS, binary, Library등 여러가지 필수로 들어가야 할 정보들의 있기 때문에 무겁다. 도커 엔진 위에서 도커 image를 실행시켜서 독립된 App을 실행시키는 원리이기 때문에 훨씬 가볍다. 보안적 측면에서 보면, VM은 운영체제를 공유하지 않기 때문에 호스트 커널에서 분리가 되므로 도커에 비해서 안전하다. 반대로 도커는 호스트 커널을 공유하고, 리소스도 공유되기 때문에 하나의 컨테이너에 접근가능하면 클러스터에 속한 모든 컨테이너에 접근이 가능해지므로, 보안 위험과 취약점이 많다. 도커의 경우에는 이식성이 뛰어나고, 영구적으로 리소스를 할당할 필요가 없고, 심지어 운영체제도 설치할 필요가 없기 때문에, 컨테이너를 확장하고, 복제하는것도 가상시스템에 비해 간단하다. - 따라서, 도커는 단일 운영체제에서 여러 응용프로그램을 실행하려는 경우에 더 적합하고, 서로 다른 운영체제환경에서 실행해야하는 어플리케이션이나 서버가 있는 경우에는 VM이 더 적합할 수 있다.

Anyway, 도커를 쓰십시요.

도커 설치

도커를 이용하기 위해 알아야할 것

컨테이너 기술은 리눅스 운영체제 기술이다.

  1. 그러므로, 컨테이너와, 컨테이너에서 동작하는 앱들은 모두 리눅스 운영체제에서 동작한다는 뜻.
  2. 만약 내 컴퓨터가 리눅스 운영체제가 아니라면? 그래도 괜찮다!
    윈도우, 맥 OS위에 가상머신을 깔고 가상머신에 linux를 깔면 되니까
    도커는 리눅스 운영체제 기반으로 만들어졌으므로, 리눅스 운영체제상에서는 괜찮지만, 다른 운영체제에서는 가상머신을 이용해야하므로, 속도저하가 발생한다.
    But, 그걸 감수하고서라도 도커를 설치해서 사용하는게 엄청난 성능향상을 가져온다.

도커는 윈도우 /맥 OS에서 그래픽환경을 지원하는 데스크탑 앱을 제공하지만, 명령어를 이용하는 cli환경에서 docker를 사용하는게 도커를 100% 사용하는 방법이다.
리눅스 OS에서 docker를 쓸 경우 "sudo"를 붙여서 실행해야함.
terminal에서 docker images 명령어가 에러없이 작동되면 docker설치가 정상적으로 종료되었다는 뜻이다.

이미지 설치

도커에서는 dockerhub에서 image를 다운로드해서 실행하면 container가 됨.

  • docker hub 에서 image를 다운로드 받는것 : pull
  • image를 실행시키는것 : run.

Docker Hub
apache 웹서버 프로그램 : httpd라는 이미지로 등록되어 있음.
docker official image : 도커에서 공식적으로 관리하는 이미지들 태그.
Docker Docs : 도커 사용설명서

매뉴얼을 참고해서 명령어를 사용하면 됨.

  • dockr hub 에서 httpd 이미지를 pull받기 ( 다운로드 받기 )
    docker pull httpd
  • image 현황 확인하기
    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

네트워크 설정

서버 클라이언트, 포트, 네트워크에 대한 기본지식 필요.

도커 없이 웹서버 만들기 :

  1. 2개의 컴퓨터 필요 ( 웹브라우저/ 웹서버 용)
  2. 웹페이지를 파일로 만들어서 특정 디렉토리에 위치 시키기.
  3. index.html파일을 /usr/local/apache2/httdocs/에 위치시킴.
  4. 0-65535 포트중에 하나로 들어와야함. (80번 포트를 사용)
  5. 웹서버의 주소는 example.com로 가정했을 때,
  6. http://example.com:80/index.html 로 접속
  7. 80번 포트에서 대기중엔 웹서버에 요청 전달
  8. index.html파일을 찾고, 코드를 전달.

도커를 사용해서 웹서버 만들기 :

웹서버를 컨테이너에 설치하기

  • docker run httpd
    host의 80번 포트가 container의 80번 포트와 연결되지 않았기 때문에 http://example.com:80/index.html 로 접속해도 연결되지 않음
  • docker run -p 80:80 httpd
    -p 80:80은 포트포워딩을 위한 명령어로, 첫 80은 host의 80 포트, 두번째 80은 container의 80포트로, host의 80포트로 들어오는 신호를 container의 80포트로 전송한다는 의미이다.
  • docker run -p 8000:80 httpd
    호스트의 8000번 포트를 container의 80번 포트로 전송

연결 과정 실습

  • docker pull httpd
  • docker ps
  • docker run --name ws3 --publish 8081:80 httpd
    이미지를 만든 사람이 80포트를 기본으로 설정함.
  • docker ps
    포트포워딩 확인
  • http://localhost:8081/index.html 로 접속
  • container 로그 확인하기

이제 http라는 어플리케이션을 실행할 수 있는 상태가 됨.

컨테이너 내부에 접근하기

index.html을 편집해서 web app을 만들기 위해서는, container안으로 들어가서 파일을 수정할 수 있어야 한다.

host에서 container안으로 들어가는 방법

  1. docker desktop에서 해당 container 의 cli버튼 클릭 시 terminal이 실행되는데, 이때 여기서 입력하는 명령어는 host가 아닌 container내부에서 실행되는 명령어이다.

    pwd
    host에서 pwd가 아니라 container안에서 pwd실행한거
    ls -a
    container안에 있는 파일을 보여줌

  2. terminal에서 접근
    sh대신 bash를 쓰고 싶을 경우 : /bin/bash로 실행
    (container에 따라서 bash실행이 안되는 경우 sh로 실행하기)

    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)을 사용하도록 활성화 (터미널과 유사한 환경을 제공)

web server의 index.html 파일 수정해보기

httpd manual


index.html파일의 경로는 매뉴얼페이지에 적혀있다.

  • /user/local/apache2/htdocs/ 폴더로 이동한다.
  • 경로에 존재하는 index.html을 읽으려고 하면,
    vim / nano등의 텍스트 에디터가 설치되어있지 않아서 에러가 난다.
  • 원하는 에디터를 설치해서 index.html을 읽고,
    내용을 It, workts 에서 Hello, Docker! 로 변경 후 저장한다.
  • 웹 브라우저에서 리로드를 해보면, 내용이 변경된 페이지를 확인할 수 있다.

컨테이너안에 있는 index.html파일을 직접 수정할 수 있게 되었습니다. ㄱ와우ㄴ

볼륨

위의 사진처럼, 컨테이너 안의 index.html파일만 수정해서 웹페이지를 변경했는데, 만약 컨테이너가 삭제된다면, 수정된 index.html파일도 삭제된다. 흑흑

  • 컨테이너를 사용하는 이유는, 필요할 때 언제든지 생성/ 삭제 가능하기 때문인데, 파일이 컨테이너에 종속되면 그 의의가 사라진다고도 할 수 있다.

만약, host에 있는 특정 폴더와 container의 특정 폴더를 연결하고, host에서 수정했을 때 container에 연동될 수 있다면?

  • 너무너무 좋겠다! 버전 관리도 훨씬 쉽고, 실행환경과 파일 수정환경을 분리할 수 있고, 백업 정책 수립도 가능하고, 원하는 ide로 편집도 가능하다.


볼륨 설정 실습

  • mkdir ~/Desktop/htdocs && cd ~/Desktop/htdocs
  • vi index.html
    index.html을 원하는 소스로 수정하기 (ex)hello, docker?)
  • docker run -p 8080:80 -v ~/Desktop/htdocs:/usr/local/apache2/htdocs/ httpd
    파일시스템 연결
  • vi index.html
    index.html 수정하기
  • 웹페이지 리로드시 수정된 파일이 보인다.

🤦‍♂️찾아봅시다

Q. 도커 볼륨과 바인드마운트의 차이점이 무엇인가요?
둘의 가장 큰 차이점은, docker가 mount point를 관리해 주느냐의 여부로 나뉜다. 컨테이너화된 개발 환경을 구축하고 싶을 때는 bind-mount가 더 유리하기 때문에 로컬에서 개발할 때는 바인드 마운트 방식이 적합하다.

도커 볼륨바인드마운트
Docker가 mount point관리O (docker가 제시한 경로에 맞춰서 생성)X (원하는 경로를 명시)
Typevolumebind

Q. 지금은 바인드마운트를 사용한것 같은데 과제에서는 볼륨을 써야하나요?
subject에 volume2개를 사용하라고 명시되어있어서 yes로 추정 근데 docker-compose 보다보니 아닌거같기도해요..

Q. 컨테이너를 run한 뒤에 나중에 volume 을 설정해줄 수는 없나요?
가능하기는 하다 하지만 권장하지 않음. 컨테이너는 시작시에 볼륨설정을 끝내야하므로, 볼륨을 추가하려면 재시작을 권고한다.


참고

생활코딩 도커입문수업

JAYOON님 의견

<웹서버 구동해보기 파트 첨언>
세 개의 컴퓨터에 운영체제부터 설치하는 게 잘 안 되는 게 아니라 웹 서비스 하나를 위해 컴퓨터 세 개나 필요한 게 문제입니다!
겨우 웹서버를 위해 가상 머신을 설치하는 것 때문에 굉장히 느려지는 게 아니라 host 운영체제 위에 다른 OS 를 설치하니까 느려집니다. 웹 브라우저와 웹 서버는 저수준 언어로 만들어져 있는데 이런 저수준 언어 프로그램을 사용하기 위해 OS 위에 또다른 OS 설치하는 것이 오버헤드가 너무 큽니다.

오늘의 깨달음 (4/5)

  1. 웹브라우저와 웹 서버는 저수준이다.
  2. Q. exec과 run의 차이점은?
  3. 왜 공부할수록 질문만 늘어나는 것 같을까요?
profile
불안을 안고 구르는 작은 모난 돌

0개의 댓글