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

공유기는 두개의 아이피를 갖는다. 
공인 아이피 : 50.20.20.20
사설 아이피:  192.168.0.1

설명
- 3번의 컴퓨터에서 192.168.0.4 로 요청을 하면, 그 요청은 공유기 까지 갔다가 자신을 찾게 된다.
- 3번의 컴퓨터에서 50.20.20.20:8003 같은 형식으로 포트포워딩을 한다면 해당 요청은 공유기 바깥 세상을 나가서 다시 되돌온다. → 비효율적
- Docekr는 3번의 PC에서 설치가 되면 그 OS 내부에서 Docker만의 사설 네트워크를 갖는다.
- Docker의 사설 네트워크는 보통 172.17.0.1 을 사용하게 된다.

Docker 세상은 OS안에 있다. 
Docekr 세상의 사설 네트워크는 172.17.0.1 세상으로 돌아간다.

172.17.0.1:8004 로 포트포워딩을 해서 LB를 찾을 수 있다.
또는 172.17.0.4:80으로도 LB를 찾을 수 있다.👉 프록시 패스

서버는 XSS공격 때문에, 자바스크립트 요청을 허용하지 않는다. 

대신 Lobby 서버로 ajax나 자바스크립트 요청을 할 수 있는데,
실제 서버에서 LB서버의 요청을 허용하는 작업을 CORS설정이다.

생활코딩 리버스 프록시 꼭 보기!!
👉 ex07

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



세팅할 때 MySQL은 환경변수를 확인해서 세팅을 해준다. 

MySQL이 세팅이 될 때, 무조건 ENTRYPOINT를 건들게 되는데,
여기다가 초기세팅이 필요한 쿼리를 넣어두면 만들어준다. 

MySQL에서 사용할 수 있는 도커환경변수는 여기에 정리 되어있다.
도커파일 db 세팅
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
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;
db로 빌드 해보자. 

docker images로 확인
docker run -dit db bash로 해당 이미지 실행
docker exec -it ac56 bash해당 이미지 접속
mysql version도 확인이 가능하다.

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

이거 넣고 다시 빌드 하자. 컨테이너 이미지 다삭제하고 다시 해보자.

db안의 도커파일을 굽는다. 
여기서 CMD랑 ENTRYPOINT는 여기서 실행되는 것이 아니라. 
RUN할 때 실행 되는 것.

이미지 실행
아마 엔트리 포인트 

🔹 mySQL로 들어가보자.

아이피는 로컬 호스트 : 127.0.0.1
포트 : 3308
아이디랑 패스워드는 도커파일에서 확인 

DB접속해보면 생성이 된 것이 확인이 가능하다.

이미 다른 터미널이 돌고 있으니까, 
같은 ps를 bash로 접근 해보자. 
🔹 터미널에서도 mysql로 접근이 가능하다.

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

show databases;
데이터 베이스 목록을 볼 수 있다. 
use blogdb; 
명령어로 database를 활성화한다. 
show tables;


describe 테이블을 설명해라 이뜻
👉서버 도커파일

🔹 Dockerfile 작성
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 작성
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

환경변수 세팅해야된다. docker-compose에 세팅 해야됨
🔹 docker-compse 작성

keep 파일옆에 파일을 생성 해보자. 

여기가 도커 이미지 태그명이라고 생각하면 된다. 

이건 server 이미지 태그라고 생각하면 된다.

스크립트가 통신으로 일어나니까, db/server중 어느 것이 먼저 끝날지 알수가 없다. 
하지만 depends_on 이라는 명령어를 사용하면 server는 db가 다 빌드가 되어야지 server가 run하게 된다. 

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

도커파일에서 해당 환경변수 설정이 안된다. compose에 지정해야되는거 잊지말자
docker-compose.yml 전체 코드  
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
docker-compose up  명령어로
전체를 다 빌드하고 연결하고 오만거 쌔만거 다하는 거다. 겁나 편함.
컴포즈 성공!!!!


도커파일에 환경변수가 실행되는 시점이랑 도커컴포즈의 환경변수가 실행되는 시점이 다르다. 
변수는 보통 jar파일을 구울 때 실행이 되므로, 해당 서버가 jar파일로 구워질 때 DNS서버로 부터 환경변수를 가져와서 빌드하게 된다. 

그래서 오케스트라 서버로 관리해주는 것이 필요하다.
그게 쿠버네티스
도커 레디스 설치 (레디스는 해쉬맵 서버) 
요청 - 응답 (JSON)
메모리 데이터 서버 (커밋없음)
- 채팅 기록
- 레디스/ 스프링 / 로그인 / 세션기반
- 레디스 라이브러리로 세션저장
- 세션을 레디스랑 연결 할 수 있음

- 세션을 레디스 서버에 저장하고 가져오라는 말이신듯.


redis서버로 세션을 관리하면 스케일 아웃을 할 수 있다는 것이지

