이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Docker

02. Docker tomcat, MySQL 환경 구성

이쿠우우 2020. 8. 30. 14:45
반응형

 

Docker tomcat, MySQL 환경 구성

 


 

실습 환경 참고

OS = CentOS 7

docker version :1.13.1

 


 

 

1. Docker tomcat 환경 만들기

1.1. tomcat 8 이미지 다운

[ 명령어 ]

docker pull tomcat:8

docker images

 

[ 결과 ]

 

1.2. docker Tomcat 8 container 실행

 

[ 명령어 ]

docker run -d -i -t ---name iksoonTomcatTest -p 8081:8080 tomcat:8

 

[ 명령 옵션 설명 ]

 -d 
백그라운드에서 실행
-i
--interactive=false 옵션과 동일
표준 입출력 stdin을 활성화하며 컨테이너와 연결되어있지 않더라도 표준 입력을 유지함
-t
--tty=false 옵션과 동일
TTY 모드를 사용 bash를 사용하려면 이 옵션을 설정해야 함
이 옵션을 설정하지 않으면 명령어는 입력할 수 있지만
결과가 표시되지 않음
-p
포트 포워딩 설정
docker 가 설치되어 있는 OS에 8081 포트로 들어오면
docker container의 8080 포트로 넘겨줌
--name
컨테이너 이름 설정

 

[ 상태 ]

 

[ 컨테이너 동작 확인 명령어 ]

docker ps

 

 

1.3. tomcat 기본 페이지 접속

외부에서 접속하는 주소 : docker 가 설치되어있는 서버의 ip주소:8081

docker 가 설치되어있는 서버에서 접속하는 주소 : localhost:8081

[결과]

404 오류 발생

 

 

1.4. 결과를 알아보기 위해 컨테이너에 bash shell로 접속

[ 명령어 ]

docker exec -it 7bf3f0a8aaac /bin/bash

 

[ 명령 옵션 설명 ]

-i

--interactive=false 옵션과 동일
표준 입출력 stdin을 활성화하며 컨테이너와 연결되어있지 않더라도 표준 입력을 유지함

-t

--tty=false 옵션과 동일
TTY 모드를 사용 bash를 사용하려면 이 옵션을 설정해야 함
이 옵션을 설정하지 않으면 명령어는 입력할 수 있지만
결과가 표시되지 않음

df3ea011ce63
컨테이너 ID
/bin/bash
컨테이너의 /bin/bash를 실행

[ 상태 ]

 

[ 접속해보면 vi, ifconfig 등 명령어를 사용할 수 없음 명령어를 사용하기 위해서는 설치해야 함 ]

Container에서 필요한 tool 설치 방법 제공

이유 : 기본적인 bash 쉘만 제공하기 때문

 

( 설치 방법 )

apt-get update

apt-get install vim

참고 : centos 이미지도 apt-get을 사용함

 

[ docker exec 접속 오류 해결법 ]

접속하여 tomcat shutdown.sh 실행하면 container 가 강제 종료됨

오류 발생 
그 후 docker start iksoonTomcatTest로 container 시작하려고 하는데 오류 발생
오류명 
Error response from daemon: driver failed programming external connectivity on endpoint iksoonTomcatTest (9d56432dfc5b0aeeed6dc8d92ecbd84767856f525f807be4413f70819dd7f84c):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8080 -j DNAT --to-destination 172.17.0.2:8080 ! -i docker0: iptables: No chain/target/match by that name.
원인
docker container를 실행한 후 
혹시 몰라서 firewalld를 stop 했는데
ipTables에 Docker Chain설정이 없어져서 발생함.
해결법
firewalld를 다시 실행시키니 해결됨
그 외 해결법으로는
iptables에 docker chain 추가하면 됨

 

 

1.5. tomcat 기본 페이지 접속 404 원인 분석 및 해결법

[ 원인 ]

tomcat home 경로의 webapps 폴더가 가보면 아무것도 없고

webapps.dist 폴더에 기본 페이지 소스가 있음

 

[ 해결법 ]

1.5.1. webapps.dist 디렉터리의 모든 내용을 webapps 디렉터리로 복사

tomcat home기본 경로 : /usr/local/tomcat 

cp -r * ../webapps

 

1.5.2. tomcat 종료

tomcat home/bin/

./shutdown.sh 실행

결과 : docker tocmat 컨테이너가 종료됨

 

1.5.3. 컨테이너 시작

docker ps -a 명령으로 컨테이너 id 확인

docker start da2135bfdd5c 명령으로 컨테이너 시작

 

1.5.4. 확인

 

 

 

 

1.6. tomcat test page를 띄워보기 위해 tomcat 환경 설정

톰켓 root 폴더를 tomcat_home경로의 testHome 디렉터리로 설정

1.6.1. 톰캣 컨테이너 접속

docker exec -it 7bf3f0a8aaac /bin/bash

 

1.6.2. /usr/local/tomcat/경로에 testHome 디렉터리 생성

mkdir testHome

 

1.6.3. /usr/local/tomcat/conf/server.xml 설정 파일 수정

container에 vi 가 설치 안되어 있어서 설치해줘야 함

설치방법 :

  • apt-get update
  • apt-get install vim

<Host> </Host> 구문 안에

<Context path="" docBase="/usr/local/tomcat/testHome" reloadable="true" />

설정을 넣어줌

아래 이미지는 reloadable 설정에 오타가 있음 == 를 = 로 바꿔야 함

아래에서 해당 오타에 관한 오류 해결법 설명함

 

1.6.4. 다음 작업을 위해 컨테이너에서 빠져나옴

빠져나오는 단축키 :  ctrl + p, ctrl +q

 

 

 

1.7. 준비한 test page를 Tomcat 컨테이너로 전송

미리 준비해놓은 test page 코드를 docker tomcat 컨테이너로 전송

[ 명령어 ]

docker cp iksoon_test/ iksoonTomcatTest:/usr/local/tomcat/testHome

cp 명령 시 파일, 디렉터리 구분 없이 복사 

 

 

1.8. container 재시작

[ 명령어 ]

docker restart iksoonTomcatTest

[ 컨테이너가 시작이 안 되는 오류 발생 ]

컨테이너 로그를 확인해야 함

명령어 : docker logs -t da2135bfdd5c

[ 로그 분석 결과 ]

상위 server.xml 설정을 할 때

reloadable="true" 로 설정해야 하는데

오타로 reloadable== 로 ==을 2개 함

파일 수정이 필요

 

[ 해결법 ]

컨테이너에 있는 문제 있는 파일을 로컬로 가져옴.

docker cp da2135bfdd5c:/usr/local/tomcat/conf/server.xml .

수정 후 다시 전송

docker cp server.xml da2135bfdd5c:/usr/local/tomcat/conf/server.xml

컨테이너 시작

docker start da2135bfdd5c

 

1.9. 준비한 Test 페이지 접속 결과 확인

정상

 

1.10. tomcat 실행 중인 container를 images로 변환

[ 명령어 ]

docker commit -m "test v1" -a "iksoon@test.com" "iksoonTomcatTest" test:1.0.0

commit 명령어로 container를 images 파일로 변환

[ 명령 옵션 설명]

-m
커밋에 대한 설명
git의 commit -m과 같다고 보면 됨
-a
커밋한 사용자에 대한 설명을 남김
로그 메시지 설정
"iksoonTomcatTest"
image로 변환할 현재 가동 중이 container 이름 혹은 ID를 넣어줌
test:1.0.0
이미지 Repository 이름 설정과
Tag 설정
위는 
Repository = test
tag = 1.0.0

 

[ 현재 실행 중인 container에서 원본 container와 비교하여 내가 변경한 작업 ]

 

docker diff "컨테이너 이름"

 

 

 

 

 

 

2. docker MySQL test 환경 만들기

2.1. MySQL 5.7 이미지 다운

[ 명령어 ]

docker pull mysql:5.7

 

2.2. docker MySQL 5.7 container 실행

[ 명령어 ]

docker run -d -i -t -e MYSQL_ROOT_PASSWORD=qwer1234 --name iksoonMysqlTest -p 4306:3306 mysql:5.7

 

[ 명령 옵션 설명 ]

-d
백그라운드에서 실행
-i
--interactive=false 옵션과 동일
표준 입출력 stdin을 활성화하며 컨테이너와 연결되어있지 않더라도 표준 입력을 유지함
-t
--tty=false 옵션과 동일
TTY 모드를 사용 bash를 사용하려면 이 옵션을 설정해야 함
이 옵션을 설정하지 않으면 명령어는 입력할 수 있지만
결과가 표시되지 않음
-e
-env=[]:  옵션과 동일
컨테이너에 환경 변수를 설정
보통 설정 값이나 비밀번호를 전달할 때 사용
-e MYSQL_ROOT_PASSWORD=examplepassword
-p
포트 포워딩 설정
docker 가 설치되어 있는 OS에 8081 포트로 들어오면
docker container의 8080 포트로 넘겨줌
--name
컨테이너 이름 설정

 

2.3. MySQL 접속

2.3.1. MYSQL Container 접속

명령어 : docker exec -it 7bf3f0a8aaac /bin/bash

 

2.3.2. MYSQL 접속

명령어 : mysql -u root -p

 

test query 작성
create database dockerdb;
create table test(name varchar(10), testdata varchar(50) );
insert into test values('iksoon', 'docker example test');

 

 

2.4. MySQL 외부접속 설정

만약 외부 접속이 안될 시 사용

외부에서 mysql을 접속이 안됨

접속하기 위해서는 권한 설정과 bind-address 설정을 해야 함

 

2.4.1. MYSQL Container 접속

명령어 : docker exec -it 7bf3f0a8aaac /bin/bash

 

2.4.2. vim 설치

apt-get update

apt-get install vim

 

3. mysqld.cnf 파일 수정

cd /etc/mysql/mysql.conf.d/

vi mysqld.cnf 

에서

bind-address를 0.0.0.0으로 설정해줘야 함

 

4. mysql에서 명령어 실행

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED by 'qwer1234';

FLUSH PRIVILEGES;

 

 

 

2.5. MySQL 외부 접속해보기

HeidiSQL 툴로 접속

완료

 

 

 

3. Tomcat Mysql 연동 페이지 결과

결과 : 정상

 

 

 

 

 


제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!


 

 

 

반응형