오늘의하루

Docker 공부하면서 Linux 공부하기 본문

Linux

Docker 공부하면서 Linux 공부하기

오늘의하루_master 2024. 4. 5. 15:51

사용자를 특정 그룹에 추가

그룹에 사용자를 추가하는 명령은 시스템 관리자 혹은 root 권한을 가진 사용자만 가능하다.

$ sudo usermod -aG docker jangto
  • usermod : 사용자 계정을 수정하는데 사용되는 명령어로 사용자 계정의 특성을 변경하거나 그룹에서 추가 또는 삭제 하는 등 작업을 할 수 있습니다.
  • -aG : 이 옵션은 사용자를 그룹에 추가할때 사용되며, a는 append를 의미하고 G는 추가할 그룹을 지정해줍니다.
  • docker : 이 자리에는 그룹의 이름이 들어갑니다.
  • jangto : 이 자리에는 그룹에 추가될 사용자 이름이 들어갑니다.

Window에서 docker로 파일 복사

만약 파일이 C드라이브나 D드라이브에 있다면 /mnt/c/ 혹은 /mnt/d/를 붙여서 복사 할 수 있습니다.

컨테이너에서 복사한 파일을 담고 싶은 폴더가 있다면 미리 만들어야 합니다.

// Ubuntu 환경
$ docker exec -it ubuntu /bin/bash
$ mkdir test
$ exit

// Docker 환경
$ docker cp /mnt/c/test/test.txt ubuntu:/test

Docker에서 DB열고 로컬에서 연결

우선 DB의 이미지를 Docker에서 받은 후 컨테이너를 실행합니다.

$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=test-d -p 3306:3306 mysql:latest

 

Mysql을 사용할 수 있습니다.

$ docker exec -it mysql mysql -uroot -pPASSWORD-d
  • -uroot -pPASSWORD-d를 통해서 Mysql을 사용할 수 있다.

DataBase을 만들어줍니다.

CREATE DATABASE test_db;

 

계정을 만들고 권한을 부여하고 저장합니다.

CREATE USER 'jangto'@'%' IDENTIFIED BY 'jangto_password';
GRANT ALL PRIVILEGES ON test_db.* TO 'jangto'@'%';
FLUSH PRIVILEGES;

 

이제 로컬에서 Spring Boot를 실행 한 후 Mysql 의존성 주입을 한 후 application.properties에 아래와 같이 작성합니다.

spring.datasource.url=jdbc:mysql://localhost:3306/test_db
spring.datasource.username=jangto
spring.datasource.password=jangto_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  • 3306 포트로 접근하는 것은 Docker로 접근하는것이며 위에서 컨테이너 실행시 3306 포트로 접근하게 되면 내부에서 3306 포트로 Mysql로 연결해주기 때문에 최종적으로 Mysql에 접근이 가능한것이다.

만약 Docker안에서 Mysql 컨테이너에 접근할때는 아래와 같이 작성할 수 있습니다.

spring.datasource.url=jdbc:mysql://mysql:3306/test_db

로컬과 배포시 URL이 다른걸 해결하는 방법

이 방법은 properties를 local과 Real로 추가하여 실행 시 원하는 DB를 연결할 수 있습니다.

// application.properties
spring.profiles.active=local // 기본값

// application-local.properties
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=test
spring.datasource.password=test
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver


// application-real.properties
spring.datasource.url=jdbc:mysql://mysql:3306/test
spring.datasource.username=test
spring.datasource.password=test
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

 

그냥 실행하는 경우는 local을 기본적으로 찾기 때문에 별도의 옵션을 줄 필요 없지만 real을 실행하기 위해서는 아래와 같이 jar파일을 실행시켜주면 된다.

java -jar your-application.jar --spring.profiles.active=real

컨테이너 끼리 접근하는 방법

만약 Docker안에서 Mysql 컨테이너와 ubuntu 컨테이너가 있다고 가정하고 ubuntu에서 서버 실행을 하고 이때 Mysql 컨테이너에 접근하려고 할때는 네트워크를 연결해줘야 합니다.

$ docker network create network-name
  • 네트워크를 만들어줍니다.
$ docker network ls
  • 네트워크 목록을 볼 수 있습니다.
$ docker run -d --name ubuntu --network network-name ubuntu:latest

$ docker run -d --name mysql --network network-name -e MYSQL_ROOT_PASSWORD=password mysql:latest
  • 컨테이너를 실행할때 네트워크에 넣어줍니다.
$ docker network connect network-name ubuntu

$ docker network connect network-name mysql
  • 이미 실행 중인 컨테이너를 네트워크에 넣어 줍니다.
$ docker network inspect network-name
  • 해당 네트워크에 속한 컨테이너들을 볼 수 있습니다.
  • 속한 컨테이너들끼리는 이름으로 접근이 가능해집니다.

이렇게 두개의 컨테이너를 같은 네트워크 묶었다면 아래와 같이 컨테이들끼리 접근이 가능해집니다.

Docker 안에 있는 Mysql컨테이너와 Ubuntu컨테이너 간에 접근이 가능하기 때문에 mysql이라는 이름으로 찾을 수 있습니다.

spring.datasource.url=jdbc:mysql://mysql:3306/test?serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.username=test
spring.datasource.password=test
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

당연히 ubuntu 컨테이너에 포트포워딩을 해줘야 합니다.

Comments