지난 1편에 이어 마지막 2편이다.
다시 한번 말하지만,
아래 영상을 함께 보면 좋을 것이며,
이 글은 영상 5번부터 8번까지의 내용을 담고 있다.
- 생활코딩 Docker 입문수업 3. 이미지 pull
- 생활코딩 Docker 입문수업 4. 컨테이너 run
- 생활코딩 Docker 입문수업 7. 호스트와 컨테이너의 파일시스템 연결
네트워크로 웹 서버 세팅을?
Docker를 사용하기 위해서는
네트워크에 대해 어느 정도 알아야 한다.
Docker를 동작시키는 많은 소프트웨어가
네트워크를 이용하기 때문이다.
아래처럼,
80번 포트를 사용하는
http://example.com 웹 사이트를 개발하려고 할 때,
index.html 웹 페이지를 접속하고자 하는 과정을 통해 알아보자.
서버, 클라이언트, 포트 등에 대해 잘 모른다면
생활코딩의 WEB1, WEB2-HOME SERVER 강의를 보고 오자.
포트(Port)에 대해서만 간단하게 언급하자면,
Port, 한국말로 항구라는 뜻의 단어는
어떠한 선박이 어떠한 나라에 들어올 때
선박의 종류에 맞는 항구를 선택하여 들어가야 하는 것처럼,
어떠한 요청(request)이
어떠한 나라(server)에 들어갈 때
요청의 종류에 맞는 port로 들어가야 한다.
한 컴퓨터에는 약 65,000개의 포트가 존재하고
보통 웹 서버의 기본 포트는 80번 포트이다.
Docker 없이 웹 서버를 사용하는 방법
먼저 최소 두 대의 컴퓨터가 필요하다.
A라는 컴퓨터에서는 웹 브라우저를 실행해야 하고(클라이언트),
B라는 컴퓨터에서는 웹 서버를 설치해야 한다(서버).
내가 원하는 웹 페이지를 파일로 만든 후,
웹 서버가 설치된 B 컴퓨터 저장 장치의 특정 디렉터리
즉, 파일 시스템에 위치시켜야 한다.
index.html이라는 웹 페이지를 만들고
B 컴퓨터 파일 시스템으로 옮겼다고 가정해보자.
누군가 A 컴퓨터를 이용하여 index.html을 요청하면(request),
B 컴퓨터에서는 index.html이 위치한 경로를 뒤진 후
return 해야 한다(response).
웹 브라우저(A 컴퓨터)에서 http://example.com:80/index.html을 입력하면
웹 서버(B 컴퓨터)에 요청(request)이 들어오고,
웹 서버의 파일 시스템에서 index.html의 경로를 찾고 읽은 후
웹 브라우저에게 전달하면 과정이 끝난다.
Docker를 사용하여 웹 서버를 사용하는 방법
Docker가 설치된 컴퓨터(Host)에서
"docker run httpd"를 실행하여
아파치 서버(웹 서버)를 Container에서 띄운다.
하지만 위의 명령어로 아파치 서버를 띄운 후,
http://example.com:80/index.html을 입력해도
처음에는 접속이 불가능하다.
Container, Host 모두 각각 독립적인 실행 환경이어서
각자의 독립적인 포트와 파일 시스템을 갖고 있기 때문이다.
더 자세히 말하자면,
Host의 80번 포트와 Container의 80번 포트는
연결되어있지 않기 때문에,
Host의 80번 포트로는 요청(request)이 들어왔지만,
Container의 80번 포트까지는 요청(request)이 가지 않는다.
그렇기 때문에,
"docker run -p 80:80 httpd" 명령어를 실행하여
포트 포워딩(Port Forwarding)을 해주면
Host와 Container의 80번 포트가 연결된다.
만약 Host의 8000번 포트를 사용할 것이라면,
"docker run -p 8000:80 httpd" 명령어를 실행하면 된다.
Container의 포트 번호는
보통 해당 이미지를 만든 사람이 미리 지정해둔다.
실행 명령어
실행 중인 Container 내부에서
Linux의 pwd, ls 같은 아래의 명령어들을 실행할 수 있다.
하지만 Container의 기본 덕목은
'적은 용량'이기 때문에 vim, nano와 같은
부가적인 에디터들은 default로 설치되어 있지 않다.
// ws3라는 컨테이너 내부에서 pwd 명령어 실행하기
docker exec ws3 pwd
// ws3 컨테이너 내부에서 bourne shell 실행하기
// shell의 역할은 사용자가 입력한 명령어를 받아 os에게 전달하는,
// 일종의 창구 역할을 함
// 하지만 아래 명령어를 입력하면 바로 연결이 끊김
docker exec ws3 /bin/sh
// ws3 컨테이너 내부에서 지속적으로 사용 가능한 bourne shell 실행하기
// exit를 입력하면 연결이 끊어지고 다시 Host와 연결이 된다
// bourne shell은 기능이 많이 부족하여 /bin/bash (bash shell)을 많이 사용한다
// i == interactive, t = tty
docker exec -it ws3 /bin/sh
여담으로,
httpd(아파치 서버)의 공식 문서를 보면
index.html과 같은 파일이 등록되는 경로를 알 수 있다
(/usr/local/apache2/htdocs/).
Host와 Container의 연결
위에서 우리가 만든 index.html과 같은 웹 페이지를
Container에서 직접 수정하는 것은
번거롭고 위험한 작업이다.
Container를 사용하는 이유가
필요할 때 언제든 만들고,
필요 없어지면 언제든 지우는 것이기 때문에
내가 수정한 파일이 있는 Container 또한
언제든지 사라질 가능성이 있기 때문이다.
그래서 똑똑한 사람들은
Host의 파일 시스템을 Container의 파일 시스템과 연동하여
Host의 파일 시스템 내부에 있는 파일을 수정하면,
Container의 파일 시스템 내부에 있는 파일에도 반영되게 만들었다.
이로 인해,
'적은 용량'의 덕목을 갖고 있는 Container의 단점을 극복하고
Host에서 파일 버전 관리, 백업 혹은 에디터 등을 사용하여
파일 수정 및 관리가 가능하게 되었다.
그러한 파일 시스템 연동 명령어는 아래와 같다.
// docker run 시, option에 -v를 사용하면 연동이 가능해진다
docker run -p 8080:80 -v ~/Desktop/htdocs:/user/local/apache2/htdocs/ httpd
Docker에 대해 기본 개념을 잡기에는
이보다 더 좋은 수업은 없을 것 같다.
끝!
'Study > Docker' 카테고리의 다른 글
[Docker][생활코딩] Container & Docker - (1) 배경, 개념, 설치, 기본 명령어 (0) | 2021.08.21 |
---|