BE전문가 프로젝트

3. Docker 컨테이너 애플리케이션 본문

Docker

3. Docker 컨테이너 애플리케이션

원호보고서 2024. 7. 2. 16:56

1. 컨테이너 네트워크 바인딩

컨테이너 역시 가상 IP주소를 할당받는다.

attach를 통해 컨테이너 내부에 접속 후 ifconfig를 입력하면 컨테이너의 네트워크 인터페이스를 확인할 수 있다.

도커의 NAT IP 172.17.0.2를 할당받은 eth0 인터페이스와 로컬 호스트인 IO 인터페이스가 있다.

지금 현 상태에서는 외부에서 컨테이너에 접근하는 것은 불가능하며 호스트에서만 도커 컨테이너에 접근 가능하다.

sudo docker run -i -t --name portexample -p 80:80 ubuntu:14.04

따라서 컨테이너에 접근하기 위해서는 eth0의 IP와 포트를 호스트의 IP와 포트에 바인딩해야 한다.

sudo docker run -i -t -p 10042:80 -p 192.168.0.300

-p 옵션을 추가하여 호스트와 컨테이너를 바인딩시킬 수 있다.

[호스트 포트]:[컨테이너 포트]

호스트의 10042번 포트와 컨테이너의 80 포트를 연결하고 싶다면 -p 에 10042:80을 입력하면 된다.

여러 포트를 바인딩하고 싶다면 -p 옵션을 여러개 사용하면 되며 특정 IP를 바인딩시키는 것도 가능하다.

 

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

컨테이너 내부에 들어와 apache2를 설치한 후 시작을 누르면 아파치가 설치 후 시작이 된다.

 

-p 옵션을 통해 포트를 바인딩 시켰기 때문에 호스트IP:80을 입력하면 아파치가 켜지는 것을 확인할 수 있다.

 

만일  -p옵션으로 10042:91로 바인딩을 했다면 아파치는 80번 포트를 이용하기 때문에 외부에서 접근이 안됐을 것이다. 따라서 바인딩을 시킬 때는 신중하게 잘 해야되는 것을 알 수 있다.

2. 컨테이너 연동

sudo docker run -d \
--name wordpressSql \ 
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \ 
mysql:5.7

해당 명령어로 mysql 이미지를 다운받아 컨테이너를 생성한다.

sudo docker run -d \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=password \
--name mywordpress \
--link wordpressSql:mysql \ 
-p 80 \
wordpress

해당 명령어로 wordpress 이미지를 통해 컨테이너를 생성한다. 

 

옵션

1) -d

이전 포스팅을 보면 -i, -t 옵션을 사용하여 컨테이너를 생성한 것을 확인할 수 있다. -i -t 옵션을 사용하면 attach 명령어를 사용하여 컨테이너 내부에 진입이 가능했으며 표준 입출력이 활성화 되었으며 상호작용이 가능한 셀 환경으로 컨테이너를 실행했다.

 

이와 반대로 -d 옵션은 dettached 모드로 컨테이너를 실행하며, dettached모드는 컨테이너를 백그라운드에서 실행하도록 설정하는 옵션이다. -i -t 옵션과 반대로 입출력이 없는 상태로 컨테이너를 실행하기 때문에 입력을 받지 않는다. Dettached 모드로 실행되는 애플리케이션은 컨테이너에서 프로그램이 실행되며 터미널을 차지하는 '백그라운드'로 실행되어 사용자의 입력을 받지 않는다.

 

-d 옵션으로 컨테이너를 실행 후 ps를 입력하면 Exited된 것을 확인할 수 있다.

Dettached 모드로 실행 후 start 명령어로 시작하면 포그라운드로써 동작하는 프로그램이 없음으로 시작이 되지 않는다.

 

mySql을 -d 옵션으로 실행하는 이유는 -i -t 옵션으로 실행해보면 해답이 나온다. mySql 이미지의 경우 컨테이너가 시작될 때 mysqlId가 동작되도록 설정되어 있다.

sql문을 실행시켜주는 command-line client인 mysql과 달리

mysqld는 백그라운드에서 돌아가고 있는 MYSQL 서버이다.

 

따라서 백그라운드로 실행되어야 하는 애플리케이션은 -it 옵션이 아닌 -d 옵션을 사용하여 컨테이너를 실행해야만 한다.

 

2) -e

컨테이너 내부의 환경변수를 설정할 때 사용하는 옵션이다. 위에 명령어를 보면 -e 옵션으로 password 등 애플리케이션을 실행할 때 필요한 여러 옵션들을 설정할 때 사용한다. 해당 옵션을 보고싶다면 컨테이너 내부에 들어가 echo 명령어를 사용하면 된다.

echo $MYSQL_ROOT_PASSWORD

 

하지만 mysql 컨테이너를 생성할 때 -d 옵션을 사용하였기 때문에 attach로 컨테이너 내부로 들어간다 해도 로그가 출력되는 것만 볼 수 있다. 하지만 exec 명령어에 -i -t 옵션을 사용한다면 입출력이 가능하다.

sudo docker exec -it wordpressSql /bin/bash

echo $MYSQL_ROOT_PASSWORD

exec 명령어는 컨테이너 내부로 들어가 명령어를 실행하는 것을 의미한다. 따라서 exec를 통해 /bin/bash 명령어를 사용하여 입출력이 가능하도록 한다. (exec 명령어에 /bin/bash 대신 ls 를 사용하면 컨테이너 내부에 있는 목록들을 볼 수 있다.)

그 후 echo 명령어를 사용하면 환경변수를 확인할 수 있을 것이다.

 

컨테이너 내부로 들어온 후 나가기 위해 exit를 사용하면 되는데 exec로 mysql컨테이너로 진입하였을 때는 exit 명령어를 사용해도 종료되지 않는다. mysqlId가 컨테이너 내부에서 포그라운드 모드로 동작하고 있기 때문이다.

 

3) --link

컨테이너 간의 연결이 필요하다면 컨테이너의 ip를 통해 접근해야한다. 하지만 수시로 변하는 컨테이너의 ip로 인해 연결할 때마다 ip를 바꿔가며 연결해줄 필요가 있다.

 

이를 해결하기위해서는 --link 옵션을 알아야될 필요가 있다. 내부 ip를 몰라도 alias로 접근하도록 설정하면 보다 쉽게 컨테이너에 접근이 가능하다.

 

위에 --link 옵션을 보면 wordpressSql:mysql으로 되어있는 것을 확인할 수 있는데 이는

wordpressSql(컨테이너 별칭) : mysql(호스트명)이라는 의미이며, 이를 해석하면 mysql이라는 호스트명으로 wordpresssSql에 접근하겠다는 의미이다.

 

linked된(wordpressSql) 컨테이너가 실행되어있지 않은 상태라면 mywordpress는 실행되지 않는데 그 이유는 의존성 때문이다.

 

도커브리지를 사용하면 --link옵션보다 쉽게 연결이 가능하며 이후 포스팅에서 설명하겠다.

 

 

 

 

'Docker' 카테고리의 다른 글

2. Docker 엔진  (0) 2024.07.02
1. Docker  (1) 2024.07.01
0.Docker 설치  (1) 2024.07.01
Comments