logoStephen's 기술블로그

포스트 검색

제목, 태그로 포스트를 검색해보세요

#010 #Docker Compose

#010 #Docker Compose
Docker
성훈 김
2024년 6월 12일
목차

👉 Docker 네트워크 개념 간단정리

notion image
공유기는 두개의 아이피를 갖는다. 
공인 아이피 : 50.20.20.20
사설 아이피:  192.168.0.1
공유기는 두개의 아이피를 갖는다. 공인 아이피 : 50.20.20.20 사설 아이피: 192.168.0.1
notion image
설명
설명
  • 3번의 컴퓨터에서 192.168.0.4 로 요청을 하면, 그 요청은 공유기 까지 갔다가 자신을 찾게 된다.
  • 3번의 컴퓨터에서 50.20.20.20:8003 같은 형식으로 포트포워딩을 한다면 해당 요청은 공유기 바깥 세상을 나가서 다시 되돌온다. → 비효율적
  • Docekr는 3번의 PC에서 설치가 되면 그 OS 내부에서 Docker만의 사설 네트워크를 갖는다.
  • Docker의 사설 네트워크는 보통 172.17.0.1 을 사용하게 된다.
notion image
Docker 세상은 OS안에 있다. 
Docekr 세상의 사설 네트워크는 172.17.0.1 세상으로 돌아간다.
Docker 세상은 OS안에 있다. Docekr 세상의 사설 네트워크는 172.17.0.1 세상으로 돌아간다.
 
notion image
172.17.0.1:8004 로 포트포워딩을 해서 LB를 찾을 수 있다.
또는 172.17.0.4:80으로도 LB를 찾을 수 있다.
172.17.0.1:8004 로 포트포워딩을 해서 LB를 찾을 수 있다. 또는 172.17.0.4:80으로도 LB를 찾을 수 있다.

👉 프록시 패스

notion image
서버는 XSS공격 때문에, 자바스크립트 요청을 허용하지 않는다.
서버는 XSS공격 때문에, 자바스크립트 요청을 허용하지 않는다.
notion image
대신 Lobby 서버로 ajax나 자바스크립트 요청을 할 수 있는데,
실제 서버에서 LB서버의 요청을 허용하는 작업을 CORS설정이다.
대신 Lobby 서버로 ajax나 자바스크립트 요청을 할 수 있는데, 실제 서버에서 LB서버의 요청을 허용하는 작업을 CORS설정이다.
 
Video preview
생활코딩 리버스 프록시 꼭 보기!!
생활코딩 리버스 프록시 꼭 보기!!
 
 

👉 ex07

notion image
폴더 구조
폴더 구조
 

🔹 mySQL 환경변수를 도커파일에 설정하기

notion image

notion image
notion image
page icon
세팅할 때 MySQL은 환경변수를 확인해서 세팅을 해준다.
notion image
MySQL이 세팅이 될 때, 무조건 ENTRYPOINT를 건들게 되는데,
여기다가 초기세팅이 필요한 쿼리를 넣어두면 만들어준다.
MySQL이 세팅이 될 때, 무조건 ENTRYPOINT를 건들게 되는데, 여기다가 초기세팅이 필요한 쿼리를 넣어두면 만들어준다.
notion image
MySQL에서 사용할 수 있는 도커환경변수는 여기에 정리 되어있다.
MySQL에서 사용할 수 있는 도커환경변수는 여기에 정리 되어있다.
 

도커파일 db 세팅

JavaScript
FROM mysql
COPY init.sql /docker-entrypoint-initdb.d/init.sql
ENV MYSQL_USER=ssar
ENV MYSQL_PASSWORD=ssar1234
ENV MYSQL_ROOT_PASSWORD=root1234
ENV MYSQL_DATABASE=blogdb
CMD ["--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"]
EXPOSE 3306

init.sql

JavaScript
use blogdb;
CREATE TABLE IF NOT EXISTS user_tb (
    id integer auto_increment,
    created_at timestamp,
    email varchar(20) not null,
    password varchar(60) not null,
    username varchar(20) not null unique,
    profile varchar(100),
    primary key (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE IF NOT EXISTS board_tb (
    id integer auto_increment,
    content varchar(10000),
    created_at timestamp,
    title varchar(100) not null,
    user_id integer,
    primary key (id),
    constraint fk_board_user_id foreign key (user_id) references user_tb (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE IF NOT EXISTS reply_tb (
    id integer auto_increment,
    comment varchar(100) not null,
    created_at timestamp,
    board_id integer,
    user_id integer,
    primary key (id),
    constraint fk_reply_board_id foreign key (board_id) references board_tb (id),
    constraint fk_reply_user_id foreign key (user_id) references user_tb (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
FLUSH PRIVILEGES;
 
notion image
db로 빌드 해보자.
db로 빌드 해보자.
notion image
docker images로 확인
docker images로 확인
notion image
docker run -dit db bash로 해당 이미지 실행
docker run -dit db bash로 해당 이미지 실행
notion image
docker exec -it ac56 bash해당 이미지 접속
docker exec -it ac56 bash해당 이미지 접속
notion image
mysql version도 확인이 가능하다.
mysql version도 확인이 가능하다.
notion image
mySQL 이렇게 접속이 가능하다.

—→ 접속 안됨 다시 지우고 다시 해보자.
mySQL 이렇게 접속이 가능하다. —→ 접속 안됨 다시 지우고 다시 해보자.
 

🔹 다 지우고 새로 빌드 해보자.

notion image
이거 넣고 다시 빌드 하자. 컨테이너 이미지 다삭제하고 다시 해보자.
이거 넣고 다시 빌드 하자. 컨테이너 이미지 다삭제하고 다시 해보자.
 
notion image
db안의 도커파일을 굽는다. 
여기서 CMD랑 ENTRYPOINT는 여기서 실행되는 것이 아니라. 
RUN할 때 실행 되는 것.
db안의 도커파일을 굽는다. 여기서 CMD랑 ENTRYPOINT는 여기서 실행되는 것이 아니라. RUN할 때 실행 되는 것.
 
notion image
이미지 실행
아마 엔트리 포인트
이미지 실행 아마 엔트리 포인트
notion image
 

🔹 mySQL로 들어가보자.

notion image
아이피는 로컬 호스트 : 127.0.0.1
포트 : 3308
아이디랑 패스워드는 도커파일에서 확인
아이피는 로컬 호스트 : 127.0.0.1 포트 : 3308 아이디랑 패스워드는 도커파일에서 확인
notion image
DB접속해보면 생성이 된 것이 확인이 가능하다.
DB접속해보면 생성이 된 것이 확인이 가능하다.
 
notion image
이미 다른 터미널이 돌고 있으니까, 
같은 ps를 bash로 접근 해보자.
이미 다른 터미널이 돌고 있으니까, 같은 ps를 bash로 접근 해보자.
 

🔹 터미널에서도 mysql로 접근이 가능하다.

notion image
bash로도 mysql 접근이 가능하다.
mysql -u root -p
여기서 enter password에서 아무반응이 없는 것 처럼 보이는데, 비밀번호 입력이 되고 있으니 정확하게 타이핑해서 넣자.

여기선 root1234
bash로도 mysql 접근이 가능하다. mysql -u root -p 여기서 enter password에서 아무반응이 없는 것 처럼 보이는데, 비밀번호 입력이 되고 있으니 정확하게 타이핑해서 넣자. 여기선 root1234
notion image
비밀번호가 맞으면 격한 환영해준다.
비밀번호가 맞으면 격한 환영해준다.
 

🔹 mysql bash 명령어 테스트

notion image
show databases;
데이터 베이스 목록을 볼 수 있다.
show databases; 데이터 베이스 목록을 볼 수 있다.
notion image
use blogdb; 
명령어로 database를 활성화한다.
use blogdb; 명령어로 database를 활성화한다.
 
notion image
show tables;
show tables;
notion image
notion image
describe 테이블을 설명해라 이뜻
describe 테이블을 설명해라 이뜻
 
 

👉서버 도커파일

notion image

🔹 Dockerfile 작성

JavaScript
FROM openjdk:11-jdk-slim

RUN apt-get update
RUN apt-get install -y git

WORKDIR /app

COPY ./entrypoint.sh ./entrypoint.sh

RUN ["chmod", "+x", "entrypoint.sh"]
ENTRYPOINT ["/bin/bash", "./entrypoint.sh"]
도커 파일 설정을 위와 같이 해준다.
도커 파일 설정을 위와 같이 해준다.
 

🔹 entrypoint 작성

JavaScript
git clone https://github.com/busanuv/blog-last.git
cd blog-last
chmod +x gradlew
./gradlew build
chmod +x build/libs/*.jar
java -jar -Dspring.profiles.active=docker build/libs/*.jar
notion image
환경변수 세팅해야된다. docker-compose에 세팅 해야됨
환경변수 세팅해야된다. docker-compose에 세팅 해야됨
 

🔹 docker-compse 작성

notion image
keep 파일옆에 파일을 생성 해보자.
keep 파일옆에 파일을 생성 해보자.
 
notion image
여기가 도커 이미지 태그명이라고 생각하면 된다.
여기가 도커 이미지 태그명이라고 생각하면 된다.
notion image
이건 server 이미지 태그라고 생각하면 된다.
이건 server 이미지 태그라고 생각하면 된다.
 
notion image
스크립트가 통신으로 일어나니까, db/server중 어느 것이 먼저 끝날지 알수가 없다. 
하지만 depends_on 이라는 명령어를 사용하면 server는 db가 다 빌드가 되어야지 server가 run하게 된다.
스크립트가 통신으로 일어나니까, db/server중 어느 것이 먼저 끝날지 알수가 없다. 하지만 depends_on 이라는 명령어를 사용하면 server는 db가 다 빌드가 되어야지 server가 run하게 된다.
 
notion image
환경변수를 만들 때, RDS_HOSTNAME 에는 아이피를 미리 알 수 가 없기 때문에 곤란해질 수 있지만, compose에서는 서버명 (태그명)으로 변수를 지정할 수 있게 지원한다.

그래서 db를 적어놓으면, compose는 해당 서비스명을 inspect해서 IP주소를 찾아서 할당한다.
환경변수를 만들 때, RDS_HOSTNAME 에는 아이피를 미리 알 수 가 없기 때문에 곤란해질 수 있지만, compose에서는 서버명 (태그명)으로 변수를 지정할 수 있게 지원한다. 그래서 db를 적어놓으면, compose는 해당 서비스명을 inspect해서 IP주소를 찾아서 할당한다.
notion image
도커파일에서 해당 환경변수 설정이 안된다. compose에 지정해야되는거 잊지말자
도커파일에서 해당 환경변수 설정이 안된다. compose에 지정해야되는거 잊지말자
 

docker-compose.yml 전체 코드

JavaScript
version: '3'
services:
  db:
    build:
      context: ./db
    ports:
      - 3306:3306
    restart: always
  server:
    build:
      context: ./server
    ports:
      - 8080:8080
    restart: always
    depends_on:
      - db
    environment:
      RDS_HOSTNAME: db
      RDS_PORT: 3306
      RDS_USERNAME: ssar
      RDS_PASSWORD: ssar1234
      RDS_DB_NAME: blogdb
 
notion image
docker-compose up  명령어로
전체를 다 빌드하고 연결하고 오만거 쌔만거 다하는 거다. 겁나 편함.
docker-compose up 명령어로 전체를 다 빌드하고 연결하고 오만거 쌔만거 다하는 거다. 겁나 편함.
notion image
컴포즈 성공!!!!
컴포즈 성공!!!!
 
notion image
notion image
도커파일에 환경변수가 실행되는 시점이랑 도커컴포즈의 환경변수가 실행되는 시점이 다르다. 

변수는 보통 jar파일을 구울 때 실행이 되므로, 해당 서버가 jar파일로 구워질 때 DNS서버로 부터 환경변수를 가져와서 빌드하게 된다.
도커파일에 환경변수가 실행되는 시점이랑 도커컴포즈의 환경변수가 실행되는 시점이 다르다. 변수는 보통 jar파일을 구울 때 실행이 되므로, 해당 서버가 jar파일로 구워질 때 DNS서버로 부터 환경변수를 가져와서 빌드하게 된다.
notion image
그래서 오케스트라 서버로 관리해주는 것이 필요하다.
그게 쿠버네티스
그래서 오케스트라 서버로 관리해주는 것이 필요하다. 그게 쿠버네티스
 
 
도커 레디스 설치 (레디스는 해쉬맵 서버)
요청 - 응답 (JSON)
메모리 데이터 서버 (커밋없음)
  • 채팅 기록
  • 레디스/ 스프링 / 로그인 / 세션기반
  • 레디스 라이브러리로 세션저장
  • 세션을 레디스랑 연결 할 수 있음
notion image
  • 세션을 레디스 서버에 저장하고 가져오라는 말이신듯.
notion image
notion image
redis서버로 세션을 관리하면 스케일 아웃을 할 수 있다는 것이지
redis서버로 세션을 관리하면 스케일 아웃을 할 수 있다는 것이지