Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/
티스토리 뷰
Docker 3 Tier 환경
모두 같은 bridge에 위치시켜 서로 간의 통신은 가능하게 하고,
Web server만 포트를 외부로 노출시키자.
같은 브릿지 내에서는 container의 이름으로 IP가 매칭되므로 세부 ip 세팅은 신경 쓰지 말자.
Web server 컨테이너
Httpd image를 사용할 것이다.
Httpd는 apache server의 image이지만, 세팅 방식이 상당히 다르다.
docker run -itd --name web -p 8080:80 --network my_network httpd
--netowork : 자신이 새로 생성한 network bridge의 이름을 넣어주자.
#컨테이너 접속
docker exec -it httpd /bin/bash
#접속 후 편집기 설치
apt-get install update
apt-get install nano
was로의 프록시 설정
#설정 파일 수정
nano /usr/local/apache2/conf/httpd.conf
설정 파일의 맨 마지막에 아래의 프록시를 위한 구문을 추가한다.
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
ServerName <컨테이너 주소 혹은 컨테이너 이름> #같은 bridge 내에서 진행되므로 컨테이너 이름으로도 DNS 가된다.
#/team1 경로로 접속 시, WAS의 team_data.php로 트래픽 전달
ProxyPass /team1 http://was/team_data.php
ProxyPassReverse /team1 http://was/team_data.php
이때 모듈 충돌 시, mpm_prefork_module은 하나만 가능하기 때문에 아래의 module은 주석처리하기
LoadModule mpm_event_module modules/mod_mpm_event.so
#이후 컨테이너 내에서 apache 재시작하기
apachectl restart
DB 컨테이너
실행 시에 미리 환경 변수를 제공해 주자.
docker run -d --name db --network my_network -e MYSQL_ROOT_PASSWORD=wordpress -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpress mysql:5.7
root의 password는 wordpress로 만들어 주었다.
#컨테이너 접속
docker exec -it db /bin/bash
#mysql 접속
mysql -u root -p
접속 후 Table과 데이터를 만들어 준다.
테이블 설정 및 데이터 삽입
테이블은 team1이라는 이름으로 만든다.
create database team1;
CREATE TABLE user(ID varchar(100), NAME varchar(100), AGE varchar(100), GOAL varchar(100), SKILL varchar(100)); #user 테이블을 만들고 우리 팀원들을 모두 넣어주자.
use team1;
insert into user (ID,NAME,AGE,GOAL,SKILL) values ('jin','ㅁ', '24', 'DevOps', 'aws');
insert into user (ID,NAME, AGE,GOAL,SKILL) values ('joohy','ㅁ', '25', 'SA', 'security');
insert into user (ID,NAME, AGE,GOAL,SKILL) values ('sjk','ㅁ', '30', 'SA', 'VMware');
insert into user (ID,NAME, AGE,GOAL,SKILL) values ('soo','ㅁ', '31', 'SA', 'python');
WAS 컨테이너
Was 컨테이너도 httpd 이미지로 진행하려 했지만, apache2와의 세팅이 많이 달라서 고전했다.
더 이상 시간 소모는 무리라고 판단하여 ubuntu image를 베이스로 apache2와 php를 설치하는 방향으로 전향했다.
docker run -itd --name was --expose 80 --network my_network ubuntu
--expose port : 내부 브릿지에서 apache로의 port를 노출시키기.
(Ubnutu 이미지는 기본적으로 port 노출이 없기 때문.)
#컨테이너 접속
docker exec -it was /bin/bash
# apahce와 php 설치
apt-get update
apt-get install nano apache2 php8.1 php8.1-mysql libapache2-mod-php
# libapache2-mod-php 는 apache에서 php를 사용하기 위한 패키지
# php8.1-mysql 는 php에서 mysql에 접속하기 위한 패키기
test.php 파일에 아래의 코드를 넣어주자.
<?php php.info(); ?> # php의 함수 호출
echo “<?php php.info(); ?>” > test.php
이후 apache 재시작 후, 해당 파일에 접속하여 정상 실행되면 잘 작동하는 것이다.
PHP에서 mysql 접속
https://gist.github.com/overnew/9a045f8cc015d6ea0d9de0b44a9a4934
이제 위의 링크에서 확인되는 코드처럼
$db = new mysqli('db', 'root', 'wordpress', 'team1');
$db = new mysqli('<db 컨테이너 ip 또는 이름>', 'root', 'password', 'table_name');
db 접속을 위한 매개변수를 잘 넣어주자.
완성된 코드는 cp로 컨테이너에 전송해 사용하자.
docker cp /home/jin/team_data.php was:/var/www/html/team_data.php
DB 접속 오류(권한 부여)
하지만 데이터가 불러와지지 않아서, WAS 컨테이너 속에서 로그를 확인해 보았다.
tail /var/log/apache2/error.log 에서 확인해 보면, access deny가 발생 중.
Root 계정으로부터의 접속을 모든 ip에서 가능하도록 하는 설정을 빠트렸다.
db container의 mysql에 접속해서 권한 부여를 진행한다.
#root 계정을 모든 네트워크에서 접속 허용,
#하지만 브릿지 내에서만 접속하므로 '%.%.%.%' -> '172.18.%.%'로 세팅하는 것이 적합하다.
grant all privileges on *.* to 'root'@'%.%.%.%' identified by 'wordpress';
FLUSH PRIVILEGES;
NAT 포트 포워딩으로 HOST PC에서 접속하기
Web server 컨테이너에 접속이 되는 8080 포트로 접속하게 세팅.
(Web server 컨테이너의 80번 포트는 HOST VM의 8080과 연결되어 있다.)
/team1으로 접속 시, 프록시로 WAS에게 잘 전달되었다.
DB에서 입력한 정보도 잘 조회가 된다.
On Premiss 3Tier와의 차이점
이번 실습의 목표는 기존에 진행해 보았던, server 별로 VM에 나누어 서비스했던 3Tier와의 차이점을 비교해 보자.
3Tier 환경 구성에서는 네트워크를 각 서버별로 모두 분리했기 때문에 라우터 장치와 그 세팅이 추가로 필요했다. GNS3로 가상의 환경을 구성했지만, 실제라면 라우터뿐만 아니라 회선을 직접 연결해 주어야 한다.
물론 도커 3Tier 실습에서는 모두 같은 bridge 내에 두었기 때문에 비교하기는 애매한 부분이 있지만,
컨테이너들을 다른 네트워크로 분리했더라도 라우터까지 갈 필요 없이, Ubuntu의 iptable을 통해서 다른 브릿지로 데이터를 전달할 수 있다. 따라서 Ubuntu의 외부로 데이터가 나갈 필요 자체가 없어진다.
데이터가 외부로 나가지 않고 격리된 환경을 가지는 것 자체가, 보안적으로도 우수한 환경으로 볼 수 있다. 또한 비용적인 측면에서도 추가적인 물리 장치 없이 동작이 가능해진다.
결론적으로 모두 분리된 환경을 가져야 했던 서버들이, 도커를 통해 여러 가지 서버들이 하나의 HOST OS위에 격리되어 동작하게 되었다. 따라서 전체적인 인프라의 관리와 비용 효율성이 증대되었다.
'개발 > Docker' 카테고리의 다른 글
Windows에서 Linux 컨테이너는 어떻게 실행될까? (WSL) (0) | 2024.08.25 |
---|---|
[Docker] Host OS와 Container OS가 다른 경우 어떻게 될까? (0) | 2024.07.17 |
WordPress로 Docker 2tier 구현하기 (with DNS) (0) | 2024.03.01 |
Docker Image Backup 전략 (Docker Registry container) (0) | 2024.03.01 |
Docker container storage (docker run -v), 볼륨과 마운트 차이 (0) | 2024.02.28 |