본문 바로가기

개발/Docker

기본적인 도커 정리 (2) - 외부와의 연결, 네트워크, 웹서버 실습

컨테이너를 외부에 노출

컨테이너는 가상 머신과 마찬가지로 가상 IP 주소를 할당받습니다. 기본적으로 172.17.0.x 의 IP를 순차적으로 할당합니다.

docker run -i -t --name network_test ubuntu:14.04

ifconfig 명령어를 통하여 컨테이너의 네트워크 인터페이스를 확인할 수 있습니다.

IP가 172.17.0.2 인 것을 확인할 수 있음

위에서 확인할 수 있듯이, 172.17.0.2 를 할당받았습니다. 아무런 설정을 하지 않았다면 이 컨테이너는 외부에서 접근할 수 없고, 호스트에서만 접근할 수 있습니다.

 

외부에 컨테이너의 어플리케이션을 노출하기 위해서는 eth0의 IP와 포트를 호스트의 IP와 포트에 바인딩해야 합니다.

 

docker run -i -t --name mywebserver -p 80:80 ubuntu:14.04

호스트의 7777번 포트를 컨테이너의 80번 포트와 연결하려면 7777:80과 같이 입력하면 됩니다. 호스트의 특정 IP를 사용하려면 192.168.0.100:7777:80과 같이 바인딩할 IP와 포트를 명시합니다.

또한 여러개의 포트를 외부에 개방하려면 -p 옵션을 여러 번 써서 설정합니다.

docker run -i -t -p 3306:3306 -p 192.168.0.100:7777:80 ubuntu:14.04

 

웹서버를 만들어보자!

여기서는 간단한 웹페이지를 만들면서, 다양한 실습을 해볼 수 있습니다.

먼저 아래의 명령어로 3306, 80번이 열린 docker 컨테이너를 하나 run 합니다.

docker run -i -t -p 3306:3306 -p 80:80 ubuntu:14.04

 

그 후, 컨테이너 내부에서 아래의 명령어를 통해 아파치 웹 서버를 설치합니다.

# apt-get update
# apt-get install apache2 -y
# service apache2 start

그 후, 호스트의 IP:80으로 웹브라우저에서 접근해봅니다.

로컬 환경에서 개발하였을 때 기준으로, 브라우저 창에 localhost:80 을 입력하면 아래와 같이 뜨게 됩니다.

docker 를 이용한 아파치 웹서버

호스트의 IP 80번 포트 -> 80번 포트의 바인딩 규칙 -> 컨테이너의 80번 포트에서 구동되는 아파치 웹서버 접근

 

컨테이너 어플리케이션 구축

실제 MSA서비스와 마찬가지로, 컨테이너에 어플리케이션을 하나만 동작 시키면 컨테이너 간의 독립성을 보장함과 동시에 버전관리, 소스코드 모듈화 등이 더욱 쉬워집니다. 이 책에서는, 웹 서버와 데이터베이스를 컨테이너를 분리하고 있습니다.

 

데이터베이스와 워드프레스 웹 서버 컨테이너를 연동해 블로그 서비스를 만들어 봅니다.

docker run -d \
--name wordpressdb \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
mysql:5.7
docker run -d \
-e WORDPRESS_DB_PASSWORD=password \
--name wordpress \
--link wordpressdb:mysql \
-p 80 \
wordpress

각각 mysql, wordpress 컨테이너를 생성하게 됩니다. 

  위의 명령어를 조금 더 자세히 바라보면, -p 80은 호스트의 포트 중 하나와 무작위로 컨테이너의 80번 포트를 연결합니다.

docker ps 로 확인해보아야합니다.

 

이전과 다르게 추가된 옵션들이 있습니다. 

 

  • -d : -i -t가 attach 가능한 상태로 설정한다면, -d는 detached 모드로 컨테이너를 실행합니다. 백그라운드에서 동작하도록 설정합니다. detached 모드인 컨테이너는 반드시 컨테이너에서 프로그램이 실행돼야하며, 포그라운드 프로그램이 실행되지 않으면 컨테이너는 종료됩니다. mysql은 하나의 터미널을 차지하는 mysqld를, 워드프레스는 apache2-foreground를 실행하므로 -d 옵션을 지정해 백그라운드로 설정한 것입니다.
  • -e : -e 옵션은 컨테이너 내부의 환경변수를 설정합니다. 자주 사용하는 옵션 중 하나입니다. 리눅스에서 환경변수를 확인하는 간단한 방법은 echo를 사용하는 것입니다. 하지만, mysql 컨테이너는 -d 옵션으로 생성되었으므로, attach 명령어를 쓰는 것이 의미가 없습니다. 이럴때는, exec 명령어를 사용하면 쉘을 사용할 수 있습니다.
docker exec -i -t wordpressdb /bin/bash
  • --link : A 컨테이너에서 B 컨테이너로 접근하는 방법 중 가장 간단한 것은 NAT로 할당받은 내부 IP를 쓰는 것입니다. 하지만, 도커 엔진은 컨테이너에게 내부 IP를 순차적으로 할당하고, 시작할 때마다 재할당하는 것이므로 매번 변경되어서 접근하기 어렵습니다. 그래서 --link 옵션을 사용하게 되면, 내부 IP를 알 필요 없이 별명(alias)로 접근하도록 설정합니다. 즉, 워드프레스 웹 서버 컨테이너에서 mysql 이라는 호스트 이름으로 ping을 전송하면 wordpressdb의 내부 IP로 접근하는 것을 확인할 수 있습니다.