본문 바로가기
Web/Docker

[Docker] 생활코딩 도커 입문수업 정리

by 임아톰 2021. 8. 24.

도커 소개

 

컴퓨터에서 어떤 애플리케이션을 만들기 위해서는 운영체제에 웹 서버나 데이터베이스 같은 소프트웨어를 깔아야 한다.

이러한 소프트웨어를 설치하는 일은 귀찮고 까다로운 일이다.

 

그림 출처. 생활코딩 Docker 입문 수업 - 1

그래서 이러한 개발환경이 있으면 좋겠다고 생각하게 됨.

 

한 대의 컴퓨터 안에서 각각의 앱을 실행시키고 각각의 앱은 격리된 환경에서 실행됨

이때 운영체제가 설치된 컴퓨터를 주인이라는 뜻에서  host라 부름
host에서 실행되는 각각의 격리된 실행 환경을 container라 부름

각각의 container에는 운영체제 전체가 설치된 게 아니라 앱을 실행하는데 필요한 라이브러리와 실행파일들만 포함되어 있음

이렇게 실행되면 얼마나 좋을까?

  • 이미 존재하는 운영체제를 공유하니까 무엇인가를 설치할 필요가 없고
  • 운영체제가 하나니까 속도가 느려지지도 않는다
  • 운영체제를 다시 설치할 필요가 없으니 시간을 절약할 수 있고
  • 저장장치의 용량도 아낄 수 있다

 

리눅스 운영체제에는 이런 환상적인 앱 실행 방법이 내장되어 있음. 이러한 기술을 컨테이너라 부름

컨테이너 기술을 이용해서 이런 걸 쉽게 해주는 대표적인 SW가 Docker

 

도커 설치

 

설치 전 알아야 할 것

 

docker와 같은 컨테이너 기술은 리눅스 운영체제의 기술

  • docker 위에서 돌아가는 컨테이너 그리고 컨테이너 안에서 돌아가는 앱들은 리눅스 운영체제에서 돌아가는 앱들임

그림 출처. 생활코딩 Docker 입문 수업 - 2

자신의 컴퓨터가 리눅스 운영체제가 아니라면 도커를 쓸 수 없는건가?

  • 그렇진 않다
  • 가상머신에 리눅스 운영체제를 깔면 그 위에서 도커와 같은 컨테이너 기술을 사용할 수 있음
  • 도커가 알아서 가상머신을 만들어주고 그 위에 리눅스를 설치해줌


운영체제가 리눅스라면 그 위에서 바로 도커를 실행할 수 있으므로 성능의 저하가 없음

  • 리눅스가 아니라면 가상머신을 설치하기 때문에 어느 정도 성능 저하를 감수해야 함
  • 윈도우나 맥OS임에도 불구하고 도커를 사용하는 건 도커를 사용했을 때의 편의성이 크기 때문


설치

https://docs.docker.com/get-docker/

 

Get Docker

 

docs.docker.com

운영체제 별로 도커를 설치하는 방법이 나와있다.

 

이미지 pull

 

그림 출처. 생활코딩 Docker 입문수업 - 3

 

어떤 프로그램이 필요할 때 우리는 app store에서 찾음. 이와 비슷하게 docker hub라는 레지스트리 서비스에서 필요한 SW를 찾게 된다.
    
app store에서 다운로드 받아서 컴퓨터에 저장한 걸 program이라 함. 이와 비슷하게 docker hub에서 찾아낸 걸 우리 컴퓨터에 다운로드 받아 가지고 있는 걸 image라 한다.

program을 실행하면 process라는 것이 동작함. 이와 마찬가지로 image를 실행하는 것을 container라 함. program이 여러 process를 가질 수 있는 것처럼 imgae도 여러 container를 가질 수 있다.

docker hub에서 이미지를 다운받는 행위를 pull이라 함. image를 실행시키는 행위를 run이라 함. run을 하게되면 image가 container가 되고 그 container가 실행되면서 container 안에 포함되어 있는 실행되도록 조치되어 있는 프로그램이 실행되면서 그 프로그램을 사용할 수 있게 된다.


Docker hub에서 image 다운 받기

 

https://hub.docker.com/

Explore - Containers 탭으로 들어가면 컨테이너 목록을 볼 수 있다. 카테고리를 통해 원하는 SW가 설치된 컨테이너를 찾을 수 있음

Apache Web Server를 컨테이너 위에서 실행시키고 싶다고 하자.
도커 hub 상에 httpd라고 검색한다.

official image는 도커에서 공식적으로 관리하는 이미지라는 뜻

 

이를 클릭한다.


docker pull httpd라는 명령어를 통해서 다운로드 받을 수 있다는 걸 알려줌 
스크롤을 내리면 아래에는 httpd에 대한 사용 설명서가 나와있다.

 

docker docs에 pull 명령어에 대한 설명이 있다.

https://docs.docker.com/engine/reference/commandline/pull/

 

docker pull

docker pull: Most of your images will be created on top of a base image from the [Docker Hub](https://hub.docker.com) registry. [Docker Hub](https://hub.docker.com) contains many pre-built images that you can `pull`...

docs.docker.com


httpd를 레지스트리로 부터 다운로드 받으려면 아래 명령어를 cmd에서 입력한다.

$ docker pull httpd


이미지를 잘 다운로드 받았는 지 확인하려면 다음 명령어를 입력

$ docker images

 

REPOSITORY에 httpd가 보이면 잘 다운로드 받은 것이다.


이는 docker desktop에서도 확인가능하다.

 

컨테이너 run

 

컨테이너와 이미지를 사용하는 기본적인 명령어에 대해 살펴보자

run 명령어를 통해 이미지를 실행시켜서 컨테이너를 만들 수 있다. 

https://docs.docker.com/engine/reference/commandline/run/

$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

 

  • IMAGE: 실행시키고 싶은 이미지의 이름
  • [COMMAND]: 컨테이너 안에서 실행시키고 싶은 명령어
  • []는 생략해도 되는 내용

httpd를 실행시켜 컨테이너를 만들고 싶으면 다음의 명령어를 입력하면 된다.

$ docker run httpd

 

실행시킨 컨테이너를 목록을 보고 싶은 경우

$ docker ps

 

 

하나의 이미지는 여러 개의 컨테이너를 만들 수 있음

$ docker run --name ws2 httpd
  • --name은 컨테이너의 이름을 지정하는 옵션
  • 컨테이너의 이름을 ws2로 지정

새로운 컨테이너가 만들어졌을 것임. 이를 확인하려면

$ docker ps

 

실행시킨 컨테이너를 끄고 싶을 때

$ docker stop ws2

 

아래의 명령어를 입력해보면 위에서 끈 컨테이너는 확인할 수 없음

$ docker ps

그렇다면 삭제가된걸까? 그렇진 않다. 아래의 명령어를 입력하면 stop시킨 ws2도 화면에 나타난다.

$ docker ps -a

 

stop 했다고 컨테이너를 삭제 시킨 건 아님

 

컨테이너를 다시 켜고 싶다면

$ docker start ws2

 

중지 시켰던 컨테이너를 다시 실행시킴
그러나 아까와는 다르게 로그가 뜨지 않음

log 명령어로 로그를 확인할 수 있다.

$ docker logs ws2


컨테이너를 삭제할 때

$ docker rm ws2

 

실행중인 컨테이너를 삭제하려 하면 에러가 발생한다.

실행중인 컨테이너는 바로 삭제할 수 없음.
컨테이너를 stop하고 rm해야 한다.

바로 삭제하고 싶으면

$ docker rm --force ws2

 

 

이미지를 지우고 싶으면

$ docker rmi httpd

 

Docker 네트워크

Docker가 없이 웹 서버를 사용하는 방법

그림 출처. 생활코딩 Docker 입문수업 - 5


두 대의 컴퓨터가 필요. 하나의 컴퓨터에는 브라우저, 다른 컴퓨터에는 웹 서버가 설치되어 있다.

웹 브라우저에서 주소를 입력하고 엔터를 누르면 웹 브라우저는 80번 포트로 example.com에 접속한다.

80번 포트에는 웹 서버가 대기중이기 때문에 웹 서버로 요청이 전달됨.
웹 서버는 파일 시스템의 지정된 경로에서 index.html을 찾음

index.html 파일을 읽어서 웹 브라우저에게 index.html을 전달한다.

 


Docker를 이용해서 웹 서버를 사용하는 방법

그림 출처. 생활코딩 Docker 입문수업 - 5



도커를 사용하면 웹 서버가 컨테이너에 설치됨.
컨테이너가 설치된 운영체제는 도커 Host라 부름. 하나의 도커 Host에는 여러 개의 도커 Container가 설치될 수 있음  

컨테이너와 Host 모두 독립적인 실행 환경이기 때문에 각자 독립적인 포트와 파일 시스템을 가지고 있음

호스트와 컨테이너의 포트를 연결해주는 작업이 필요. 이를 포트 포워딩(port forwarding)이라 함. 

$ docker run -p 80:80 httpd

 

  • 앞의 80은 Host의 포트, 뒤의 80은 컨테이너의 포트
  • Host의 80번으로 들어온 신호가 컨테이너의 80번 포트로 전송

사용해보기
Apache image 다운로드

$ docker pull httpd

localhost의 8081번 포트를 ws1의 80번 포트로 포트 포워딩

$ docker run --name ws1 -p 8081:80 httpd

localhost의 8082번 포트를 ws1의 80번 포트로 포트 포워딩

$ docker run --name ws2 -p 8082:80 httpd

 

 

웹브라우저 검색창에 

localhost:8080

를 입력한다.

 

브라우저에 접속하면 아래의 화면이 뜬다

 

명령어 실행


idex.html을 수정하려면 컨테이너 안으로 들어가서 컨테이너를 수정할 수 있어야 한다.

도커 데스크톱에서 수정

CLI 버튼을 누르면 터미널이 실행됨

이 터미널에서 

# pwd

를 입력하게 되면 이는 컨테이너 안에서 명령어를 실행한 것이 된다

커맨드 라인에서 실행


docker exec 명령어를 사용함

https://docs.docker.com/engine/reference/commandline/exec/

$ docker exec ws2 pwd
  • pwd는 실행시키고 싶은 명령어 
  • 컨테이너에서 pwd를 실행한 결과가 출력된다

 

컨테이너와 지속적으로 연결을 유지하면서 명령어를 입력하고 싶을 때

docker exec -it ws2 /bin/sh

 

연결을 끊고 싶으면 exit

# exit

 

sh는기능이 부족해서 bash 를 많이 사용한다.

$ docker exec -it ws2 /bin/bash


index.html 파일 수정하기

apache 웹 서버의 메뉴얼 페이지에 가면 index.html 파일이 어디에 위치하고 있는지 알 수 있다.

위의 경로에 사용자가 요청한 웹 페이지를 보관하도록 약속되어 있다는 정보를 준다.

 

다음의 명령어로 ws2 컨테이너에 접속

$ docker exec -it ws2 /bin/bash

 

메뉴얼에서 찾았던 경로로 이동

# cd /usr/local/apache2/htdocs/

 

여기서 파일을 조회하면 index.html 파일을 확인할 수 있다.

# ls -al

 

vim이나 nano 같은 에디터를 사용하려고 하면 없다. 컨테이너의 덕목은 용량이 작은 것이기 때문.

 

nano 설치

apt update

apt install nano

 

nano 에디터로 index.html을 수정한다.

# nano index.html

idex.html은 다음 내용으로 수정하였다.

<html><body><h1>Hello, Docker!</h1></body></html>

 

다시 브라우저에 접속하면 Hello, Docker!가 뜨는 걸 확인할 수 있다.

 

호스트와 컨테이너의 파일시스템 연결

 

docker 안의 파일을 직접 수정했었음

컨테이너 안에서 index.html 파일을 직접 수정했는 데 컨테이너가 사라지면 어렵게 작업한 내용이 물거품이 됨.

컨테이너의 /usr/local/apache2/htdocs/ 디렉토리와 host의 /Desktop/htdocs 디렉토리를 연결하고 host 쪽에서 수정이 일어났을 때 그것이 컨테이너 파일 시스템에 연동이 되면 컨테이너가 날라가도 소스코드가 host에 남아있기 때문에 보다 안전하게 개발할 수 있다.

파일 버전 관리도 용이.

 

실행환경은 컨테이너에게 맡기고 파일을 수정하는 작업은 host에서 진행하는 법에 대해서 알아보자

 

연결하고 싶은 경로에 index.html 파일을 생성

 

터미널을 열고 다음의 명령어를 입력

$  docker run -p 8888:80 -v C:\htdocs:/usr/local/apache2/htdocs/ httpd
  • volume의 약자인 -v 옵션을 쓴다
  • 호스트의 C:\htdocs 디렉토리와 컨테이너의 /usr/local/apache2/htdocs/ 디렉토리를 연결

 

접속을 시작하면 아래와 같이 뜬다.

다음과 같이 host에 있는 파일을 수정하면

 

아래와 같이 반영된다.

 

*reference

생활 코딩 Docker 입구 수업 재생목록

생활 코딩 opentutorials

반응형