리눅스데브코스 [16주차 - 1]<리눅스 컨테이너와 Docker (3) 실시간>

심우열·2023년 7월 25일
0

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
# os 정보 확인
cat /etc/os-release
# netstat 을 사용하기 위해 net-tools 설치
apt update
apt install net-tools
# 사용중인 port 확인
netstat -natp

  • 80 번 포트로 phpmyadmin에 접근 가능

4. 웹 접속을 위해 port 포워딩하기

# 기존 phpmyadmin 컨테이너 삭제
exit
docker rm -f phpmyadmin
# 8080포트를 80번 포트로 포워딩 하기
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 주소 확인

  • 192.188.95.147

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)

  • ex) MySQL + PHPMyAdmin

2. Docker Compose 플러그인

1. 단독 머신

docker compose [옵션]

2. 클러스터(SWARM)

docker stack deploy [옵션]

3. 예시

1. docker-compose.yml

version: "3.1"
services:
  # mysql 컨테이너 생성
  mysql-server:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: <암호 지정>
    networks:
      - <네트워크 지정> 
    volumes:
      - <볼륨 지정>:/var/lib/mysql
      
  # phpmyadmin 컨테이너 생성
  phpmyadmin:
    image: phpmyadmin 
    environment:
      PMA_HOST: mysql-server
      PMA_PORT: "3306" 
    networks:
      - <네트워크 지정>
    # 선행될 컨테이너 지정  
    depends_on:
      - mysql-server
    ports:
      - "8080:80"
      
# 볼륨 생성      
volumes:
  # mysqldata 볼륨 생성
  mysqldata: 

# 네트워크 생성
networks:
  # database 네트워크 생성
  database:
    # 이미 만들어진 네트워크 사용
    # external: true

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

profile
Dev Ops, "Git, Linux, Docker, Kubernetes, ansible, " .

0개의 댓글