Docker

[Docker] 네트워크 연결하기(httpd)

언킴 2022. 3. 2. 16:35
반응형

이전 시간에 아파치 웹서버를 실행하기 위해 httpd 이미지를 설치해보았다. 일단 먼저 도커가 없이 웹서버를 사용하는 방법에 대해서 알아보자. 웹서버를 사용하기 위해서는 두 대의 컴퓨터가 필요하다. 한 대의 컴퓨터에는 Web browser가 설치되어 있고, 다른 컴퓨터에는 Web server가 설치되어 있다고 하자. 그 다음 Web page를 파일로 만들어 저장 장치의 특정 디렉토리에 위치시켜야 한다. 데이터가 저장된 공간을 File System이라고 부르자. 예를 들어 File System 내부에 있는 /user/local/apache2/htdocs/ 라는 디렉토리에 index.html 파일을 위치시켰다고 하자. 그리고 누군가가 Web Server에 웹페이지를 요청하면 해당 디렉토리에서 찾아야 된다고 설정해둔다.

 

한편 컴퓨터에는 65535개의 Port라는 개념이 존재해, 컴퓨터에 설치되어 있는 여러개의 소프트웨어들을 네트워크적으로 구분해준다. Port가 없다면 해당 컴퓨터로 접속이 들어왔을 때 어떤 소프트웨어가 그 접속을 마중나가야할지 알 수 없을 것이다. 우리의 Web Server는 80번 Port에서 접속을 할 수 있도록 대기하고, 웹 서버가 설치된 컴퓨터의 주소는 example.com로 지정한 후 접속을 시도해보자. 그렇다면 http://example.com:80/index.html을 입력하면 우리는 해당 웹 서버로 접근하며 80번 Port를 통해 접근할 수 있다. 웹 서버는 우리가 설정해둔 경로를 따라 index.html 파일을 찾을 것이다. 해당 파일을 읽은 후 웹 브라우저에게 index.html 코드를 전달하면 과정이 종료된다.  

 

 

 

지금까지는 도커가 없이 웹 서버를 이용하는 방법에 대해서 다루어 보았다. 그렇다면 이번에는 도커를 통해 웹서버를 이용하는 방법에 대해서 알아보자. 도커를 이용하면 웹 서버가 컨테이너에 설치된다. 그리고 웹 서버가 설치된 운영체제는 Host라고 부른다. 하나의 도커 Host에는 여러개의 컨테이너가 만들어질 수 있고, Host와 컨테이너는 서로 독립적이기 때문에 서로 독립적인 File System과 Post를 가진다. 

 

그렇다면 우리가 기존에 접근한 방식처럼 http://example.com:80/index.html을 통해 웹 서버에 접근할 수 있을까? 위 그림처럼 컨테이너와 Host간 연결이 끊겨있기 때문에 접속이 불가능하다. 연결을 해주기 위해서는 Host의 80번 Port와 컨테이너의 80번 Port를 연결시켜 주어야할 것이다. 

 

이와 같이 설정해주면 Host의 80번 Port가 컨테이너의 80번 Port로 전송되는 것이다. 이렇게 전달되는 방식을 port forwarding이라고 한다. 그 후 나머지 과정은 이전과 동일하다. 만약 접속 경로가 다른 Port로 바뀌었다면 -p 옵션의 앞 Port번호를 변경하면 동일하게 적용이 가능하다.  ( $docker run -p 8000:80 httpd )

 

docker run -p

-p 혹은 --publish는 컨테이너의 포트를 host로 연결시켜주는 코드이다. 아래의 코드를 통해 실행이 가능하다. 

$ docker run --name ws2 -p 8080:30 httpd

CONTAINER ID   IMAGE     COMMAND              CREATED         STATUS         PORTS                  NAMES
d29654da3035   httpd     "httpd-foreground"   2 minutes ago   Up 2 minutes   0.0.0.0:8080->80/tcp   ws2

그렇다면 우리가 만든 웹 서버를 실행해보자. Web browser와 컨테이너는 같은 컴퓨터에 설치되어 있기 때문에 localhost를 통해 접근할 수 있다. http://localhost:8080/index.html

 

접속을하게 되면 웹이 켜지면서 cmd 창에 아래와 같이 접근이 되었다는 코드가 출력된다.

172.17.0.1 - - [02/Mar/2022:07:33:10 +0000] "GET /index.html HTTP/1.1" 200 45
172.17.0.1 - - [02/Mar/2022:07:33:10 +0000] "GET /favicon.ico HTTP/1.1" 404 196
172.17.0.1 - - [02/Mar/2022:07:33:11 +0000] "GET /index.html HTTP/1.1" 304 -

 

웹 서버 생성하기

위와 같이 localhost에 접속하게 되면 index.html에 It works!라는 이미지만 출력된다. 해당 이미지만 출력되면 아무런 쓸모없는 웹 페이지일 것이다. 그렇기 때문에 우리는 index.html을 수정해서 우리가 원하는 웹 앱을 만들어보자. CLI 창에 접근하기 위해서는 아래와 같은 코드를 입력하면 된다.  exec에 대한 자세한 내용은 여기를 참고하자.

$ docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

명령을 전달하고 싶은 컨테이너의 이름을 지정한 후 실행시키고 싶은 명령어를 지정해준다. 

 

ls -al은 현재 File System에 있는 파일을 전부 불러온다. 

$ docker exec ws2 ls -al
total 56
drwxr-xr-x 1 www-data www-data 4096 Mar  1 13:20 .
drwxr-xr-x 1 root     root     4096 Mar  1 13:02 ..
drwxr-xr-x 2 root     root     4096 Mar  1 13:20 bin
drwxr-xr-x 2 root     root     4096 Mar  1 13:20 build
drwxr-xr-x 2 root     root     4096 Mar  1 13:20 cgi-bin
drwxr-xr-x 4 root     root     4096 Mar  1 13:20 conf
drwxr-xr-x 3 root     root     4096 Mar  1 13:20 error
drwxr-xr-x 2 root     root     4096 Mar  1 13:20 htdocs
drwxr-xr-x 3 root     root     4096 Mar  1 13:20 icons
drwxr-xr-x 2 root     root     4096 Mar  1 13:20 include
drwxr-xr-x 1 root     root     4096 Mar  2 07:28 logs
drwxr-xr-x 2 root     root     4096 Mar  1 13:20 modules

 

위와 같은 방식은 매번 할 때마다 exec를 통해 컨테이너에 접근한 후 명령어를 입력하는 방식이다. 그렇기 때문에 지속적으로 컨테이너를 작성하기에는 무리가 있다. 지속적으로 컨테이너에서 코드를 입력하고 싶을 땐 아래와 같은 코드를 작성해 실행하면 된다. 

 

$ docker exec -it ws2 /bin/sh

# pwd
/usr/local/apache2
# ls
bin  build  cgi-bin  conf  error  htdocs  icons  include  logs  modules


# 나가고 싶을떄 !
# exit

 

-i or --interactive 와 -t or --tty 두개를 조합하여 -it를 만들어 명령어에 추가를 해주었다. -it를 지정하면 터미널과 그 컨테이너와 지속적으로 실행할 수 있게 도와주는 코드이다. 

 

이제 컨테이너에 접근하능 방법까지 알아봤으니 index.html 파일을 직접 수정해보자.  index.html은 /usr/local/apache2/htdocs/ 라는 위치에 저장되어 있다. 해당 정보를 바탕으로 접속해보자. 

 

$ docker exec -it /bin/bash
# root@d29654da3035:/usr/local/apache2/htdocs# ls -al
total 16
drwxr-xr-x 2 root     root     4096 Mar  1 13:20 .
drwxr-xr-x 1 www-data www-data 4096 Mar  1 13:20 ..
-rw-r--r-- 1      504 staff      45 Jun 11  2007 index.html

# root@d29654da3035:/usr/local/apache2/htdocs#

/bin/sh는 본 셸(born shell)이라고 불리는 프로그램이 실행된다. 본 셸은 사용자가 입력한 명령어을 셸 프로그램이 받아서 운영체제에 전달해주는 일종의 창구 같은 역할을 하는 프로그램이다. 본 셸이라는 프로그램은 기능이 많이 부족하기 때문에 최근에는 배시 셸(bash shell)을 사용한다. 컨테이너에 따라 배시 셸이 없는 경우도 존재하기 때문에 그때에는 본 셸을 사용하면 된다. 

 

여기서 패키지들을 설치하고 싶으면 다음과 같은 명령어를 입력해주면 된다. apt에 대한 설명은 여기를 참고하자.

# apt update

# apt install nano

nano editer를 설치하는 방법이다.  그후 아래의 코드를 입력해주면 이제 index.html을 수정할 수 있게 된다. 

 

# nano index.html

내부에서 html을 수정해 폴더를 열면 변경된 것을 확인할 수 있다.

 

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

ctrl + o 를 실행한 후 Enter를 입력하고 ctrl + x를 해서 빠져나오면 된다. 

 

 

참고 : youtube