환경
- Windows 10 Pro
- docker window
- CentOS 7.5
- Java 11
- Tomcat
순서
1. Docker 란?
2. Docker window 설치
3. 컨테이너 생성
4. SFTP 사용해보기
5. JAVA 설치
6. TOMCAT 설치
7. GIT 프로젝트 받기
8. MySql 컨테이너 설치, network 사용
9. 프로젝트 실행하기
10. docker compose, dockerFile 사용하기
7. GIT 프로젝트 받기
(윈도우 cmd)
docker start ApiTest
docker exec -it ApiTest bash
(ApiTest 내부)
yum install git
git clone https://github.com/spring-petclinic/spring-framework-petclinic.git
yum install maven
mvn -version
프로젝트에서 pom.xml 수정
MySQL 의 db 주소를 외부 컨테이너로 설정한다
<jdbc.url>jdbc:mysql://mysql-petclinic:3306/petclinic?useUnicode=true</jdbc.url>
maven 빌드로 war 파일 생성
mvn clean package -Dmaven.test.skip=true -P MySQL
target 디렉토리 아래 petclinic.war 파일 생성된다. tomcat > webapps 로 옮겨주자
기존 ROOT를 삭제하고 petclinic.war 파일의 이름을 ROOT.war 로 변경하자
./startup.sh 해보면 mysql 연결이 안되어서 오류가 발생한다. mysql 연결이 안되어있기 때문이다.
java.net.UnknownHostException: mysql-petclinic
8. MySql 컨테이너 설치, network 사용
컨테이너를 생성하면 기본적으로 docker0 브리지를 통해 외부와 통신할 수 있는 환경을 사용할 수 있지만 사용자의 선택에 따라 여러 네트워크 드라이버를 쓸 수 도 있다.
네트워크 목록확인
docker network ls
사용자 생성 브리지 네트워크 생성 (윈도우 cmd)
docker network create --driver bridge testnetwork
네트워크 연결을 위해 ApiTest2 서버생성
(사실 network는 실행중인 컨테이너에 바로 연결할 수 있다. 이미지,컨테이너 생성 복습이다)
- 기존 ApiTest로 이미지 생성
docker stop ApiTest
docker commit ApiTest testimg2
- 새로 생성된 이미지로 네트워크 연결한 컨테이너 생성
docker run --privileged -d -i -t -p 8022:22 -p 8081:8080 --name ApiTest2 --network testnetwork testimg2 init
참고
https://velog.io/@hyeseong-dev/docker-docker-container-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC
MySQL 컨테이너 생성
docker run --network testnetwork --name mysql-petclinic -e MYSQL_USER=petclinic -e MYSQL_PASSWORD=petclinic -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=petclinic -p 3306:3306 -d mysql:5.7.8 --character-set-server=utf8 --collation-server=utf8_unicode_ci
만약 3306 포트가 이미 사용중이라고 나오면 포트를 변경하던가 아니면 윈도우에서 사용중인 포트를 닫으면 된다.
관리자 모드로 cmd를 실행하고
netstat -ano | find "3306" 으로 PID 를 찾아서
taskkill taskkill /f /pid pid번호 로 port 사용을 중지한다.
이렇게 하고 다시 mysql docker 컨테이너를 실행하면된다.
MySQL 컨테이너 사용법
mysql -u root -p
비밀번호는 아까 -e 옵션으로 설정했던 값이다.
9. 프로젝트 실행하기
네트워크 연결확인 (윈도우 cmd)
docker network inspect testnetwork
testnetwork에 연결된 "Name": "ApiTest2", "Name": "mysql-petclinic" 과 "IPv4Address": 을 확인할 수 있다.
이제 다시 ApiTest2로 돌아가 tomcat을 실행해본다.
여전히 안된다!!
원인은 network 테스트로 ping 172.18.0.2 로 mysql-petclinic의 IPv4Address 을 했을때 연결이 되지만
ping mysql-petclinic 이름으로 하면 안된다.
ping: mysql-petclinic: Name or service not known ... ㅠ
Docker Network 에는 3종류가 있다
Default Bridge Network : 도커에서 제공하는 network. 실제 운영에서는 적합하다고 볼수없음. 컨테이너명으로 못찾아온다. 주로 개발환경에서 테스트를 위해 사용함.
User-Defined Bridge Networks : 같은 Docker Host 내에서 실행중인 Container 간 연결할 수 있는 사용자 정의 브릿지 네트워크. 실제 운영환경에 적합함. 컨테이너명으로 찾아올 수 있음
Overlay Networks : Docker swarm 에서 사용됨.
지금 사용한건 User-Defined Bridge Networks 이다. 그럼 컨테이너 명으로 찾아와야 하는데??
원인은 나중에 찾아봐야겠다...
일단 ping 172.18.0.2 로는 연결되니 petclinic의 pom.xml의 mysql 주소를 수정한다.
(프젝에서는 당연히 컨테이너명으로 연결해야한다)
<jdbc.url>jdbc:mysql://172.18.0.2:3306/petclinic?useUnicode=true</jdbc.url>
만약 ip로도 연결이 안되고, curl로 테스트했을때
curl <<컨테이너명>>:<<port>>
curl: (7) Failed connect to <<컨테이너명>>:<port>; Connection refused
에러가 나타났다면 Docker Desktop for Window에서 브릿지 네트워크가 연결이 안되는 문제이다.
그럼 Window host를 거쳐서 연결한다. 컨테이너 이름 대신 host.docker.internal 를 사용한다.
ex). curl http://host.docker.internal:8000
참고
https://docs.docker.com/docker-for-windows/networking/
다시 빌드해서 톰캣 실행 한 결과 성공이다!
10. docker compose, dockerFile 사용하기
지금까지의 과정을 docker compose 와 dockerfile 로 다시 만들어 본다.
dockerFile : 완성된 이미지 생성 build 작업을 기록한 파일
docker Compose : 개발환경 구성 (다중 컨테이너빌드, network설정 등) run !!!
기타
도커 스웜이란?
하나의 호스트 머신에서 도커 엔진을 구동하다가 cpu나 메모리, 디스크 용량과 같은 자원이 부족할때
이를 해결하기 위해 보통 여러대의 서버를 클러스터로 만들어 자원을 병렬로 확장한다.
여러대의 서버를 하나의 자원 풀로 만드는데에는 스케줄러와 로드밸런서 문제, 클러스터내의 서버가 다운됐을때 고가용성을 어떻게 보장할 건지에 대한 문제가 있는데 이를 해결하는 오픈소스 솔루션이 도커에서 제공하는 도커 스웜과 스웜모드이다.
쿠버네티스란?
쿠버네티스는 컨테이너화된 애플리케이션의 자동 디플로이, 스케일링 등을 제공하는 관리시스템으로, 오픈 소스 기반이다
'개발자 > TIL' 카테고리의 다른 글
[SOCKET] SOCKET 연결 (0) | 2021.03.24 |
---|---|
Gradle 과 Maven 둘 다 사용하고 느낀점 (0) | 2020.12.16 |
[JPA] @Transactional로 DB 커밋 분리하기 (0) | 2020.12.04 |
이펙티브 자바 - 하 (0) | 2020.07.15 |
[Docker] Window 도커로 프로젝트 실행하기 1 (0) | 2020.06.27 |