Spring boot와 Docker Mysql
- centos 6에 docker를 설치해보자
- Spring boot와 Docker
이번엔 도커에 mysql을 연동해보자.
연동이 되는지 확인해보기 위해 몇개의 클래스를 생성하자
간단하게 만들자
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Account {
@Id
@GeneratedValue
private Long id;
private String username;
private String email;
}
Account 엔티티 클래스다.
@Slf4j
@RestController
public class AccountController {
@Autowired
private AccountRepository repository;
@RequestMapping(value = "/accounts", method = RequestMethod.GET)
public ResponseEntity<?> getAccount() {
List<Account> accounts = repository.findAll();
log.debug("accounts : {} ", accounts);
return new ResponseEntity<>(accounts, HttpStatus.OK);
}
}
controller 클래스도 한개 만들자.
마지막으로 레파지토리도 생성하자.
@Repository
public interface AccountRepository extends JpaRepository<Account, Long> {
}
그리고 메이븐에 mysql connector를 추가해야된다.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
그리고 yml 파일에 아래와 같이 추가하자
spring:
jpa:
hibernate:
ddl-auto: create
database-platform: org.hibernate.dialect.MySQLDialect
datasource:
url: jdbc:mysql://${MYSQL_PORT_3306_TCP_ADDR}:${MYSQL_PORT_3306_TCP_PORT}/${MYSQL_ENV_MYSQL_DATABASE}
username: ${MYSQL_ENV_MYSQL_USER}
password: ${MYSQL_ENV_MYSQL_PASSWORD}
driver-class-name: com.mysql.jdbc.Driver
validation-query: select 1
마지막으로 테스트 데이터를 넣자
Main
클래스에 넣자
@Autowired
private AccountRepository repository;
@Bean
CommandLineRunner runner() {
return args -> Arrays.asList(
new Account(1L,"wonwoo","wonwoo@test.com"),
new Account(2L,"kevin","kevin@test.com")
).forEach(repository::save);
}
일단 설정은 끝났다.
그담 할일은 mysql을 pull 해오자.
docker run -d --name spring-boot-mysql -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=docker -e MYSQL_USER=dbuser -e MYSQL_PASSWORD=dbpassword -d mysql:latest
mysql dockerhub 참고
그리고 이미지가 존재 하는지 확인해보자.
docker images
java 8 31e7de89e3f8 5 days ago 642.3 MB
mysql/mysql-server latest 26d67fdd58d2 4 weeks ago 294.8 MB
hello-world latest 975b84d108f1 4 months ago 960 B
이런식으로 나올거다.
그럼 잘된거다.
그런 다음에 다시 빌드를 하자.
mvn clean package docker:build
이상하게 첨엔 잘안되더니 docker를 재시작하니 또 된다.
이상하다. 리눅스가 클라우드서버라 약간 이상한듯 싶기도 하고 커널 버전도 안올라가 있어서..영 찜찜...아무튼
만약 빌드가 잘 안된다며 이것저것 다 해봐야댄다. 리부팅도 하고 막 암튼..
이제 spring boot를 실행해 보자.
spring이랑 mysql이랑 link를 걸어줘야된다.
docker run --name spring-boot-docker --link spring-boot-mysql:mysql -p 9000:8080 -d wonwoo/spring-boot-docker
요런식의 형태다.아래와 같이 하면 된다.
name은 컨테이너 명 아무거나 넣으면 댄다.
link는 저기 mysql container 명이다.
docker run --name app-container-name --link my-container-name:mysql -d app-that-uses-mysql
근데 필자는
No route to host
이라는 에러가 자꾸 떳다.
찾아보니까
iptables -t filter -A DOCKER -d 172.17.0.0/16 -i docker0 -j ACCEPT
이렇게 하니까 된다.
원래 도커가 iptables을 건드는것도 같은데...아닌가?
아무튼 일단 된다.
필자의 처음으로 만든 dockerhub다
docker pull wonwoo/spring-boot-docker
참고
docker inspect $CONTAINER_ID | grep IPAddress #컨테이너 아이피를 알아내는거다.
docker push $user-name/$app-container-name #도커 hub에 푸시