1.Docker 로 Mysql DB 구축하기
1. 일단 실행!
1. 설치 및 실행
docker run --name mysql-server -e MYSQL_ROOT_PASSWORD=<암호 지정> -d mysql:8

2. 컨테이너 확인
docker ps

3. 컨테이너 로그 확인
docker logs mysql-server

4. mysql-server 컨테이너 쉘 접속
docker exec -it mysql-server bash

5. 컨테이너 OS 환경 확인
cat /etc/os-release

6. MySQL CLI 접속
msyql -p
exit

2. Docker Volume
1. 볼륨 정보 보기
docker volume ls

2. 볼륨의 역할
컨테이너가 중단, 재시작 할 때
- 컨테이너 라이프 사이클과 관계 없이, 볼륨이 보존되거나 관리되어야 할 때 사용
컨테이너 Root
- 컨테이너 생성 -> Root 생성
- 컨테이너 삭제 -> Root 삭제
3. 볼륨 확인하기
docker inspect mysql-server

mounts
docker inspect --format='{{.Mounts}}' mysql-server

3. MySQL 서버 중단
1. 삭제하기
docker rm -f mysql-server

하지만 볼륨은 남아있음

- 컨테이너를 다시 실행시키면 새로운 볼륨을 사용
- 기존의 볼륨을 재사용 할 수 있는 방법이 필요함
4. 볼륨을 재사용하는 방법
1. 컨테이너에 기존 볼륨 연결하기
docker run -v <볼륨 이름>:/var/lib/mysql --name mysql-server -e MYSQL_ROOT_PASSWORD=<암호 지정> -d mysql:8
- -v: 연결할 볼륨을 지정

2. 이름 있는 볼륨 사용하기
1. 볼륨 생성
docker volume create <볼륨 이름>

만약 NFS에 연결하고 싶다면?
docker volume create
--driver local
--opt type=nfs
--opt o=addr=[ip주소], rw, [NFS 옵션]
--opt device-:[remote 파일 경로]
<볼륨 이름>
2. 생성된 볼륨 이용해 mysql 컨테이너 생성 및 실행
docker run -v mysqldata:/var/lib/mysql --name mysql-server -e MYSQL_ROOT_PASSWORD=ahffk18 -d mysql:8

3. Host에 BIND 하기
docker run -v /data/msyql/data:/var/lib/mysql --name mysql-server -e MYSQL_ROOT_PASSWORD=<암호지정> -d mysql:8
- /data/mysql/data : 호스트의 경로
- /var/lib/mysql : 컨테이너의 경로
2. 네트워크 연결
1. 호스트에서 컨테이너의 네트워크 PORT에 연결
docker run -p [호스트의 포트 번호]:[컨테이너의 포트번호] -v mysqldate:/var/lib/mysql --name mysql-server -e MYSQL_ROOT_PASSWORD=secret -d mysql:8
2. 컨테이너에서 다른 컨테이너의 네트워크 PORT에 연결(컨테이너 간 통신)
1. 가상 NIC(Network Interface Card) 공유
2. 가상 Network 연결
3. Host Bridge를 통한 연결
1. 가상 NIC(Network Interface Card) 공유
1. 가상 NIC 공유 주의 사항
컨테이너들은 하나의 NIC를 공유
- 선행 컨테이너가 제어권을 가짐
- Port Forwarding 등
2. 가상 NIC 공유하는 컨테이너 실행
docker run --name phpmyadmin -e PMA_HOST=localhost -e PMA_PORT=3306 --network container:mysql-server -d phpmyadmin
3. 네트워크 공유상태 확인
docker exec -it phpmyadmin bin/bash
cat /etc/os-release
apt update
apt install net-tools
netstat -natp

- 80 번 포트로 phpmyadmin에 접근 가능
4. 웹 접속을 위해 port 포워딩하기
exit
docker rm -f phpmyadmin
docker run --name phpmyadmin -e PMA_HOST=localhost -e PMA_PORT=3306 --network container:mysql-server -p 8080:80 -d phpmyadmin

ERROR 발생
- 네트워크 제어권은 첫번째 컨테이너에 있기 때문
2. 가상 Network에 연결하기
1. 컨테이너 Link를 통해 ad-hoc 하게 구성 (비추천)
2. 독립 네트워크 구성 후 연결하기
1. 컨테이너 Link로 구성하기 (비추천)
1. 컨테이너 link로 구성된 phpmyadmin run
docker run --name phpmyadmin -e PMA_HOST=mysql -e PMA_HOST-3306 --link mysql-server:mysql -p 8080:80 -d phpmyadmin
2. phpmyadmin 접속
ip 주소 확인

3. 192.188.95.147:8080

- 사용자명: root
- 암호: mysql-server에 지정된 암호
4. phpmyadmin 관리 화면

5. 컨테이너 Link로 네트워크 연결의 문제점
- 독립된 네트워크를 사용하지 않음
- 기존의 네트워크를 사용해서 새로운 컨테이너의 /etc/hosts에 호스트 이름을 등록해줌
- 추천되지 않음
2. 독립 네트워크 구성 후 연결
1. 기존 phpmyadmin 컨테이너 제거
docker rm -f phpmyadmin
2. mysql-server 컨테이너 종료
docker rm -f mysql-server
3. 새로운 네트워크 생성하기
docker network create database
4. 생성된 네트워크 확인
docker network list

docker network inspect bridge

docker network inspect database

5. 생성된 네트워크에 mysql컨테이너 연결
docker run -v <볼륨지정>:/var/lib/mysql --network <네트워크 지정> --name mysql-server -e MYSQL_ROOT_PASSWORD=<암호지정> -d mysql:8

- 172.18.0.0 으로 잘 연결 된 것을 확인할 수 있음
6. 생성된 네트워크에 phpmyadmin컨테이너 연결
docker run --name phpmyadmin -e PMA_HOST=mysql-server -e PMA_PORT:3306 --network database -p 8080:80 -d phpmyadmin

- 172.18.0.0 으로 잘 연결 된 것을 확인할 수 있음
3. Docker Stack Compose
1. Stack
하나의 서비스를 위한 컨테이너들을 Stack이라고 함(또는 Pod, Compose)
2. Docker Compose 플러그인
1. 단독 머신
docker compose [옵션]
2. 클러스터(SWARM)
docker stack deploy [옵션]
3. 예시
1. docker-compose.yml
version: "3.1"
services:
mysql-server:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: <암호 지정>
networks:
- <네트워크 지정>
volumes:
- <볼륨 지정>:/var/lib/mysql
phpmyadmin:
image: phpmyadmin
environment:
PMA_HOST: mysql-server
PMA_PORT: "3306"
networks:
- <네트워크 지정>
depends_on:
- mysql-server
ports:
- "8080:80"
volumes:
mysqldata:
networks:
database:
2. 실행
docker compose up -d


docker compose ps

4. 컨테이너의 쉘에 접근하기
1. docker compose 로 접근
docker compose exec -it mysql-server /bin/bash

2. docker 로 접근
docker exec -it vagrant-mysql-server-1 /bin/bash

- 앞에 호스트명을 붙이고 뒤에 번호를 붙여야 접근 가능
5. compose로 컨테이너 종료
docker compose down

6. docker compose 사용시 주의할 점
- docker compose 명령은 docker-compose.yml파일이 있는 위치에서 실행
- docker-compose.yml 파일이 다른 위치에 있는 경우 -f 옵션으로 파일을 명시해야함
docker compose -f <docker-compose.yml 파일 경로> <서브 명령>
4. Docker를 GUI로 관리하기
1. PORTAINER.IO
1. Volume 관리
docker volume create portainerdata
2. PORTAINER 실행하기
docker run --name docker-gui -v /var/run/docker.sock:/var/run/docker.sock -v portainerdata:/data --restart always -p 9000:9000 -d portainer/portainer
3. PORTAINER 확인
docker logs docker-gui

[VM의 IP주소]:9000

