ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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에 푸시
    

    댓글

Designed by Tistory.