카테고리 없음

Spring boot와 Docker Mysql

머룽 2023. 4. 18. 12:31

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에 푸시