프로필사진

Go, Vantage point

가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.


Github | https://github.com/overnew/

Blog | https://everenew.tistory.com/





티스토리 뷰

반응형

 

 

 

 

 

 

 

 

Wordpress Mysql을 사용하여 2 Teir 환경을 컨테이너에서 세팅해 보자.

Wordpress Mysql은 같은 bridge와 연결하여 통신이 가능하게 하고, 다른 컨테이너와 분리한다.

외부로 노출되는 port Wordpress에 새로운 Bridge를 연결하여 Host pc에서 접속이 가능하게 한다.

이때 접속을 위해 사용하는 것이 Docker0에 연결하는 DNS container이다.

 

 

 

 

 

 

Wordpress 와 MySQL 연동

 

 

Mysql 설치

 

docker run -d --name mysql --network my_network -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=wordpress -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpress mysql:5.7

 

 

--network my_network

새로 만든 172.18.0.0/16 대역대를 사용하도록 세팅.

 

inspect로 env 확인해 보면 환경 변수가 들어가 있다.

 

 

 

 

 

마운트 된 볼륨도 확인이 된다.

 

 

 

wordpress 설치

 

워드프레스는 Apache 서버와 PHP 그리고 워드프레스가 빌드된 이미지 파일이다.

따라서 Web server + Was의 역할을 할 수 있다.

 

 

docker run -d --name wordpress --network my_network -v wordpress:/var/www/html --link mysql:mysql -e WORDPRESS_DB_HOST=mysql:3306 -e WORDPRESS_DB_PASSWORD=wordpress -p 80:80 wordpress:latest

 

--network my_network

MySQL과 통신해야 하므로 172.18.0.0/16 대역대를 사용하도록 세팅.

 

 

 

 

--link 옵션

link 옵션은 같은 호스트 내에 컨테이너 간 연결을 할 때 사용한다.

컨테이너의 ip는 동적으로 할당받으므로, 컨테이너가 다시 시작할 때 다른 ip를 가지게 될 수 있다.

따라서 동적 ip 기반으로 컨테이너 간의 통신을 구현하는 것은 리스크가 크다.

도커에서는 정적 ip를 사용하는 것이 아니라, 같은 bridge 내에서는 서로 container name으로만 접근 가능하다.

 

--link mysql:mysql

우리는 mysql이라는 변수를 mysql 컨테이너의 ip로 사용하겠다는 옵션을 준다.

 

 

 

이를 통해서

-e WORDPRESS_DB_HOST=mysql:3306

DB의 HOST ip에 mysql:3306를 대입하면 mysql 컨테이너의 ip의 3306 포트를 의미하게 된다.

 

 

 

 

 

-p 80:80

일단 80번 포트로 외부에 노출시키자.

 

Run 후에는 -v로 자동 생성된 volume을 확인할 수 있다.

 

 

 

 

 

 

 

 

 

MySQL 접근 거절 오류

 

Wordpress에 접속하면 DB connection에 오류가 발생한다.

 

 

 

Docker log 보기

docker logs <컨테이너 이름>

 

 

 

 

Access deny 문제 발생 중이다.

자세히 보면 user가 example 유저로 접속 시도 중이며, password는 잘 사용 중이다.

 

MySQL을 생성할 때 만든 유저는 wordpress이었으므로, word press 환경 변수에 유저 설정을 빠트렸음을 추론할 수 있다.

 

Wordpress run에서 아래의 환경 변수를 추가해 주자.

-e WORDPRESS_DB_USER=wordpress

 

docker run -d --name wordpress --network my_network -v wordpress:/var/www/html --link mysql:mysql -e WORDPRESS_DB_HOST=mysql:3306 -e WORDPRESS_DB_PASSWORD=wordpress -e WORDPRESS_DB_USER=wordpress -p 80:80 wordpress:latest

 

 

 

 

wordpress 접속

 

80번 port를 열어 두었으므로 접속해 보자.

 

 

 

 

 

 

 

 

간단히 게시글을 쓰면 잘 저장된 것이 로드된다.

 

 

 

 

 

Published port 추가

실행 중인 wordpress container에 bridge를 추가하고, 8080 포트로 외부에 노출시켜 보자.

 

 

docker network connect

동작 중인 상태에서 container에 새로운 bridge를 붙여서 published port로 열자

 

docker network connect my_bridge_network2 container1

->  docker network connect mogi wordpress

 

 

이러면 새로 network가 추가되면서, 포트 포워딩도 새로운 network에 바뀌어 적용된다.

그 이유는 host vm의 80번 포트가 단 하나의 포트와 매핑되어야 하기 때문으로 생각된다.

 

 

 

우리는 실행 시 80:80을 적용하였으므로, 8080:80으로 포트 포워딩을 바꾸어야 한다.

 

 

 

컨테이너 포트포워딩 변경

 

이를 변경하기 위해 구성 파일을 변경한다.

그전에 컨테이너들을 stop 하고,

 

 

systemctl stop docker

도커 엔진을 중지시킨다.

 

 

/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json

 

 /var/lib/docker/containers/268b8c784cebd3f9a423822b6979a742038d79b96ebb81a514eafba38eabfa61/hostconfig.json

Hash 정보는 inspect를 통해 확인.

 

 

Json 정보에서 HostPort를 80번에서 8080으로 변경한다.

 

 

 

도커 엔진을 시작해 주고, 컨테이너를 다시 start 한다.

systemctl start docker

docker start mysql

 

 

 

이제 docker의 port가 8080 -> 80으로 변경되었다.

 

 

 

 

 

(172.18은 VM 내부에서만 인식되고 외부 노출이 안되어 있다.)

이제 Host VM의 NAT 포트 포워딩을 적용한다.

 

127.0.0.1:80(HOST PC) -> 10.0.2.15:8080(HOST VM) -> 172.19.02:80(WordPress container)

 

이제 127.0.0.1:80으로의 웹접근이 WordPress container로 포워딩된다.

 

 

 

 

 

 

DNS 컨테이너 사용

 

Docker hub에 업로드해 둔 이미지 사용.

docker run -d --name dns-server -p 53:53/udp --restart=always everenew/dns-jin:latest

 

https://hub.docker.com/repository/docker/everenew/dns-jin/general

 

Docker

 

hub.docker.com

 

 

nano /etc/bind/named.conf.options

listen on을 container ip로 변경.

 

 

레코드를 워드프레스로 연결해 둔 127.0.0.1로 설정

nano /etc/bind/zones/db.superbaboy.com

 

 

 

 

 

적용을 위해 재시작.

service named restart

 

 

 

Host VM에서 DNS server를 127.0.0.1로 바꾸어 nslookup 시도.

nano /etc/resolv.conf

 

( 정상 동작 확인)

 

 

Host VM의 NAT 포트 포워딩에서 DNS의 port인 UDP 53을 VM으로 전달.

 

127.0.0.1:53(HOST PC) -> 0.0.2.15:53(HOST VM) -> 172.17.02:53(DNS container)

 

 

 

 

Host PC인 윈도우의 DNS 주소를 127.0.0.1로 변경.

 

 

 

 

 

 

이제 윈도우에서 DNS Container에게 질의하여 IP를 받아온다.

 

 

 

 

 

단, 세부 페이지 접근 시에는 ip로 바뀐다. (wordpress 서비스 내에서 DNS container를 사용하도록 바꾸어 주지 않았기 때문인 듯하다.)

 

 

 

 

 

공인 IP로 노출시키기

추가적인 IP들도 접근하도록 만들어 줄 수 있다.

 

HOST PC의 IP가 사실상 외부로 노출되는 최상위 IP이므로 공인 IP라고 생각하면,

HOST PC의 IP(본인은 10.84.248.21)로 접근하도록 하는 것이 적절하다.

 

 

 

 

레코드에도 추가해 주자.

 

 

 

 DNS flow는 아래와 같다.

127.0.0.1:53(HOST PC) <-> 10.0.2.15:53(HOST VM) <-> 172.17.02:53(DNS container)

 

 

DNS로 획득한 주소로 접근하면 flow는 아래와 같다.

10.84.248.21:80(HOST PC의 IP) -> 10.0.2.15:8080(HOST VM) -> 172.19.02:80(WordPress container)

 

 

 

 

 

반응형
댓글
반응형
인기글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함