Spring boot와 Docker Mysql

  1. centos 6에 docker를 설치해보자
  2. 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에 푸시