10-18 21:19
Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
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
Archives
관리 메뉴

기록을 합시다.

[docker] network 명령어를 이용해 Apache2+Tomcat9+MariaDB 연결하기(feat. WAR 파일) 본문

공부/etc

[docker] network 명령어를 이용해 Apache2+Tomcat9+MariaDB 연결하기(feat. WAR 파일)

울집고양이세마리 2023. 4. 21. 03:00

docker에서 network를 사용하는 이유

docker에서 network 설정 없이, container를 생성하게 되면 default bridge에 container가 생성되고, default bridge에 생성된 container들끼리는 서로 통신하기가 힘들다. 그리하여 container들끼리 통신해야할 일이 생긴다면, network를 하나 생성(브릿지를 하나 생성)하여, 그 안에 container들을 포함시키게 만들면 된다. (와이파이 공유기에 연결된 기기끼리 통신할 수 있는 거랑 비슷함)

 

Use bridge networks

 

docs.docker.com

 

docker의 network 생성 명령어

docker network create --gateway [게이트웨이 주소] --subnet [서브넷마스크] [네트워크 이름]

docker의 network 삭제 명령어

docker network rm [네트워크 이름]

특정 network(브릿지) 안에 컨테이너 생성 명령어

네트워크 생성 후에 create해야한다. 보통 생성 명령어와 다른 점은 --network 옵션이다.

docker create --name [컨테이너 이름] --network [네트워크 이름] --p [호스트 포트:컨테이너 포트] [이미지이름:버전]

컨테이너를  네트워크에 붙이는 명령어

 docker network connect [네트워크 이름] [컨테이너 이름]

컨테이너를 네트워크에서 떼는 명령어

docker network disconnect [네트워크 이름] [컨테이너 이름]

네트워크의 서브넷 및 게이트웨이 설정하는 명령어

하지만 단순히 docker에서 아무 옵션 없이 create 명령문을 이용하여 network가, 자기가 지정한 게이트웨이+서브넷마스크를 이용하여 DHCP 비슷하게 유동 IP형태로 컨테이너에게 IP를 나눠주어서, 시간이 지나면 컨테이너끼리 서로 연결하기 귀찮아지는 일이 생긴다. 

 

그리하여 네트워크를 생성할 때, 아래와 같은 옵션을 이용하여 게이트웨이와 서브넷 마스크를 설정한다.

docker network create [네트워크 이름] --subnet=[서브넷 마스크] --gateway=[게이트웨이]

이렇게 딱 설정해주면, 아래와 같이 컨테이너에게 서브넷을 설정해줄 수 있다. 

docker create --name [컨테이너 이름] --network [네트워크 이름] --ip [서브넷] --p [호스트 포트:컨테이너 포트] [이미지이름:버전]

 


Tomcat9, Apache2, MariaDB에 담을 네트워크 생성

docker network create myboard --gateway 172.20.0.1 --subnet 172.20.1.0/24

이렇게 myboard라는이름의 네트워크를 생성했다. 

 

그러면 네트워크가 잘 생성되었는지 아래의 명령어로 확인해본다.

(보통 네트워크 뭐뭐 있는지 확인하기 위해서 사용하는듯)

docker network list

docker network list의 결과

myboard 네트워크가 생성 된 걸 보고, myboard 네트워크의 상세 정보를 아래의 명령어로 확인할 수 있다.

docker network inspect myboard

위의 사진을 보면 Subnet은 설정해준 대로 172.20.0.0/24이고, Gateway는 172.20.0.1이다. 

 

Tomcat9, Apache2, MariaDB 컨테이너를 네트워크에 붙이기

이제는 apache2를 깔아줄 것이다. 컨테이너 생성을 위한 명령어는 아래와 같다.

docker run --name apache2_myboard -dit -p 80:80 --network myboard --ip 172.20.0.2 --restart=always -e VIRTUAL_HOST=www.miniboard.com httpd

여기에서 특이점은 VIRTUAL_HOST=www.miniboard.com이라고 설정한 것이다. 

apache2를 구동시켰을 때, www.miniboard.com 으로  접속하기 위해서이다. 

 

그리고 tomcat을 깔아줘야 하는데, 그냥 tomcat image를 다운받으면 가장 최근의 것인 tomcat10이 깔린다.

우리는 tomcat9를 깔아야 하므로 일단은 아래의 명령어를 쳐 tomcat9가 있는지 확인한다.

docker search tomcat9

그러면 아래와 같이 검색된 이미지들이 나온다. (홈페이지 사용해도 됨)

그런데 공식 이미지는 없어서, 그냥 이 중에서 괜찮은 걸 다운 받아야 한다. 

그래서 clearpursuitdocker/tomcat9-jdk11-lite를 다운 받아준다. 

이것도 바로 컨테이너 생성해주고, network안에 포함시켜준다.

docker run --name tomcat9_myboard -dit -p 8080:8080 --network myboard --ip 172.20.0.3 --restart=always -e VIRTUAL_HOST=www.miniboard.com  clearpursuitdocker/tomcat9-jdk11-lite

 

mariadb도 위와 같은 방식으로 컨테이너 생성해주고, network안에 포함시켜준다.

docker run --name mariadb_myboard -dit -p 3307:3306 --network myboard --ip 172.20.0.4 --restart=always -e MYSQL_ROOT_PASSWORD=12345 mariadb

이렇게 mariadb, tomcat9, apache2의 컨테이너를 네트워크에 포함되게 생성해주었다.

 

다시 docker inspect myboard 해보면, 네트워크에 넣어준 세 개의 컨테이너들을 확인할 수 있다. 

docker inspect myboard

이제 mariadb에서 사용자를 생성해준다. 

이 때, mariadb container의 터미널 창에 접속하기 위해서 아래와 같은 명령어를 적어준다.

docker exec -it mariadb_myboard /bin/bash

그리고, 아래 사진과 같이 database와 user를 생성해준다. 

그리고, heidi에서 잘 들어가지는지 한 번 확인해주고~ 

이 때, 포트 넘버가 3307인 이유는 도커가 아닌 내 컴퓨터에서 mariadb가 3306을 사용하고 있기 때문에, 컨테이너를 생성할 때, 호스트 포트 번호로 3307을 주었기 때문이다. 

 

이제 자기가 원하는 테이블을 생성해준다. 

 

그리고, 호스트 설정을 위해 메모장을 관리자 권한으로 열어주고,

C:/Windows/System32/drivers/etc에 들어가 hosts 파일을 열어준다.

참고로hosts.ics가 아니라 그냥 hosts를 열어야한다.

 

애초에 apache2 컨테이너를 생성할 때, 환경변수로 VIRTUAL_HOST=www.miniboard.com 설정했었기 때문에 로컬에서 www.miniboard.com으로 접속하기 위해서 127.0.0.1 www.miniboard.com 으로 설정해주었다. (위에 있는 다른 dns는 무시해도 됨) 

 

여기까지 저장을 하면, www.miniboard.com을 로컬에서 접속해보면 apache2가 잘 작동된다는 것을 알 수 있다.

그리고 톰캣이 잘 돌아가는지 확인하기 위해서 포트 번호 8080으로 접속해보면 톰캣 오류가 아주 잘 난다.

오류가 나는 건 당연한 거고, 그냥 톰캣이 잘 작동되고 있는지 확인하기 위해서이다. 

Apache2 설정

이제는 apache2와 tomcat9을 연결해주기 위해 httpd.conf에서 아래의 것들을 주석 해제해준다.

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_http_module modules/omd_proxy_http.so

Include conf/extra/httpd-vhosts.conf

위의 세 가지를 찾아서 주석을 해제해준다. 

물론 컨테이너의 터미널에 접속하여 vi로 수정해줘도 되지만, 그냥 편하게 도커 데스크톱을 이용하자.

httpd.conf에서 주석을 해제하는 모습

 

또, httpd-vhosts.conf에서 아래와 같이 수정해준다. (나머지는 다 지워야함)

<VirtualHost *:80>
    DocumentRoot "/usr/local/apache2/htdocs"
    ServerName miniboard.com
    ServerAlias www.miniboard.com
    ErrorLog "logs/www.miniboard.com-error_log"
    CustomLog "logs/dummy-host.example.com-access_log" common
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / http://172.20.0.3:8080/
    ProxyPassReverse / http://172.20.0.3:8080/
</VirtualHost>

 

Tomcat9 설정

tomcat9의 폴더 안의 server.xml에서 Host 태그 안에 아래의 context 태그를 넣어준다.

path에서 Board라는 WAR파일이 있으면 알아서 unpack해준다는 뜻이다. 

참고로 여기서 path="/"는 tomcat9안에 있는 webapps폴더를 의미한다. 

<Context path="/" docBase="Board" unpackWARs="true" reloadable="true" />

 

 

WAR 파일 Tomcat9의 webapps로 옮겨주기 

일단은 자바 프로젝트 내에 나도, 이걸 읽는 분들도 무언가를 작성했을 것이다. 그것을 export 시켜준다.

참고로, 파일 안에 MariaDB Driver 설정만 해주면 MariaDB 컨테이너랑 연결이 되니 이것만 숙지해주면 tomcat9, apache2, mariadb 이렇게 세 개를 충분히 연동할 수 있다. 

 

로컬에 있는 WAR 파일을 아래와 커맨드를 이용해 컨테이너 안으로 이동시킨다. 

docker cp [파일이름] [컨테이너:컨테이너경로]

tomcat9 container안에 WAR 파일이 잘 들어갔는지 확인하고, Restart를 해준다.

방금 context에서 unpackWARs=true로 설정했기 때문에, 알아서 unpack해준 모습이 보인다. 

이제 miniboard.com을 들어가면 아래와 같이 WAR 파일 내부의 소스가 뜬다.

내용은 걍 가림..

포트 번호 80으로 접속했고, webapps의 jsp파일이 보이는 것을 고려하면 apache2, tomcat9가 잘 연동되었음을 알 수 있다.  그리고 뭐.. CRUD 잘 되면 mariaDB도 연동이 잘 된 것이다. 

Comments