Gom3rye

Volume 본문

현대 오토에버 클라우드 스쿨

Volume

Gom3rye 2025. 6. 18. 18:15
728x90
반응형

MySQL 영속성 유지

✅ 핵심 개념: 데이터는 컨테이너가 아닌 볼륨에 저장된다.

컨테이너 = 프로그램 실행 환경

볼륨 = 데이터 저장소 (외부 저장 공간)

  • MySQL 컨테이너를 만들어서 데이터를 저장하고 컨테이너를 삭제하고 다시 생성해도 이전 데이터가 유지되도록
  • MySQL 데이터는 /var/lib/mysql 디렉토리에 데이터베이스 별로 저장된다.
    • 이 경로를 호스트의 볼륨이나 디렉토리에 마운트해 놓으면, 컨테이너가 삭제되더라도 데이터는 사라지지 않는다.

볼륨 생성

docker volume create mysql-data-vol

볼륨 확인

docker volume ls

볼륨을 사용하는 MySQL 컨테이너 생성

docker run -dit --name=mysql-vtest -e MYSQL_ROOT_PASSWORD=비밀번호 -e MYSQL_DATABASE=dockertest -v mysql-data-vol:/var/lib/mysql mysql

(Mac 컴퓨터에서 컨테이너가 만들어지지 않는 경우 --platform linux/amd64를 추가하면 된다.)

컨테이너에 접속

docker exec -it mysql-vtest /bin/bash

mysql 로컬에서 접속하기

mysql -uroot -p비밀번호 db이름
mysql -uroot -p비밀번호 dockertest

샘플 데이터 작성

use dockertest
create table mytable(c1 int, c2 char(100));
insert into mytable values(1, 'kyla');
commit

콘솔 종료

exit

컨테이너 삭제

docker stop mysql-vtest
docker rm mysql-vtest # -> 이전까지의 데이타 소멸

컨테이너를 다시 생성해서 데이터 확인

docker run -dit --name=mysql-vtest -e MYSQL_ROOT_PASSWORD=비밀번호 -e MYSQL_DATABASE=dockertest -v mysql-data-vol:/var/lib/mysql mysql
docker exec -it mysql-vtest /bin/bash
mysql -uroot -p비밀번호 dockertest
select * from mytable;

웹 서버의 로그를 현재 컴퓨터에 저장

현재 컴퓨터에 저장하는 것이므로 볼륨 마운트 필요!

  • 로컬 컴퓨터에 마운트할 디렉토리를 생성
mkdir nginx-log
  • 절대 경로 확인
pwd # **/home/kyla/docker/nginx-log**

nginx의 로그 디렉토리는 /var/log/nginx

  • 컨테이너 생성
docker run -dit -p 8011:80 -v 내가만든디렉토리:매핑할디렉토리 nginx
docker run -dit -p 8011:80 -v **/home/kyla/docker/nginx-log**:**/var/log/nginx** nginx
  • 접속
curl localhost:8011
docker ps # 위에서 name 안주고 만들어서 자동으로 만들어진 컨테이너 이름 확인해야 한다.
docker exec -it compassionate_borg /bin/bash # compassionate_borg: 만들어진 이름

→ 로컬에 access.log error.log 파일 생긴 걸 확인할 수 있다.

컨테이너 간 데이터 공유를 위한 데이터 컨테이너 활용

  • 데이터 공유를 위한 컨테이너 생성
docker create -v /data-volume --name=datavol ubuntu

→ run 하지 않는다.

  • 실제 데이터를 공유할 컨테이너 생성
docker run -it --volumes-from datavol ubuntu

→ datavol에서 데이터를 끌고 오는 것

echo 'testing data container' > /data-volume/test-volume.txt
docker run -it --volumes-from datavol ubuntu
echo 'testing data container2' > /data-volume/test-volume2.txt
ls /data-volume

→ 현재 컨테이너에서 생성한 파일 이외에도 test-volume.txt도 존재한다.

파일 시스템 마운트의 한계

  • 컨테이너의 마운트 대상 디렉토리가 이미 존재하고 이미지 레이어에 이 디렉토리의 파일이 포함되어 있는 경우 이미 존재하는 대상 디렉토리에 마운트를 하면 마운트의 원본 디렉토리가 기존 디렉토리를 완전히 대체해서 이미지에 포함되어 있던 원래 파일은 사용할 수 없다.
  • 윈도우와 리눅스에서 다르게 동작
    • 호스트 컴퓨터의 파일 하나를 컨테이너에 존재하는 디렉토리로 마운트 하는 경우 디렉토리의 파일이 합쳐져서 이미지에서 온 파일과 호스트에서 마운트 된 파일이 모두 나타나게 되는데 호스트 컴퓨터가 윈도우인 경우에는 이 기능을 제공하지 않는다. → 왠만하면 리눅스에서 하자!

네트워크

  • 도커 컨테이너 및 서비스는 도커 네트워크를 통해 격리된 컨테이너 간의 네트워크 연결 뿐만 아니라 도커 외의 다른 애플리케이션 워크로드와 연결할 수 있다.
  • 도커 네트워크 하위 시스템 연결을 위해 도커 네트워크 드라이버를 사용하여 상호 간 통신을 수행한다.
  • 도커 레퍼런스(https://docs.docker.com/engine.network/)의 도커 네트워크의 정의: 도커 설치 시 기본적으로 제공되는 docker( )는 소프트웨어적으로 구현된 가상 이더넷 브릿지 네트워크이고 이것을 통해 격리된 컨테이너들의 상호간 통신을 지원한다.
  • 별도의 브릿지 네트워크를 생성해 연결값으로 설정하지 않는 한 실행되는 모든 컨테이너는 docker( ) 브릿지에 연결되어 172.17.0.0/16의 CIDR 범위로 IP 주소가 할당된다.
docker inspect webserver

IPPrefixLen: subnet mask

docker inspect apa000ex20

-> 자동으로 ip 할당되어 있는 것을 볼 수 있다.

docker inspect mysql-vtest

  • ifconfig(linux)나 ipconfig(windows) 명령으로 네트워크 인터페이스 카드를 확인해보면 원래는 enp0s3, lo만 있었는데 지금은 veth~~로 시작하는게 여러 개 생겨난 것을 확인할 수 있다.
    • enp0s3(ens33일 수도 있음): Ubuntu 네트워크 카드
    • lo: Ubuntu에서 자기 자신을 위한 네트워크
    • docker0: 도커 설치 시 기본적으로 제공되는 브릿지 네트워크, 소프트웨어적인 스위치 방식으로 동작하고 일반적인 스위치와는 다르게 DHCP로 연결된 컨테이너에 사전에 정의된 IP 풀을 할당한다.
      • 스위치는 2계층 장비로 IP를 할당하는 기능이 없다.
      • IP자동으로 세팅하고 싶으면 DHCP 서버를 만들던가 3계층 장비가 있던가(IP 공유기(7계층))
    • vethXXXXXXX: OSI 7계층 서비스 모델의 2계층 서비스로 컨테이너 내부에 제공되는 네트워크 인터페이스 eth0와 한 쌍으로 제공되어 docker0와 가상의 터널링 네트워크를 제공한다.

모든 컨테이너 종료하고 이미지 삭제하고 네트워크 인터페이스 카드 확인해보기

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker rmi $(docker images)

→ veth~~ 들이 다 지워진 것을 확인할 수 있다.

네트워크 확인해보기

docker network ls

기본 브릿지 네트워크 모드

  • 도커 네트워크 드라이버 방식 조회: docker network ls
  • 컨테이너 생성
docker run -dit --name container1 ubuntu
docker run -dit --name container2 ubuntu

웹 서비스를 제공하는 nginx 컨테이너가 브릿지 모드의 네트워크와 연결되는 과정

  • nginx 컨테이너의 80번 포트를 외부에 공개
docker run -d --name=nginx -p 8080:80 nginx
  • 포트포워딩 확인
curl localhost:8080
  • 접근 과정
    • http://IP:포트번호 입력을 통해서 접속
    • 호스트 운영체제에 8080포트가 열려있는지 확인하고 이 포트에 연결된 컨테이너를 찾는다. (똑같은 포트를 두 번 사용하면 안된다.)
    • 해당 컨테이너가 연결된 브릿지 네트워크의 Private IP와 포트 번호로 사용자가 입력한 외부 IP와 포트 번호가 변환된다.
      • 이때 사용되는 서비스가 PAT
      • NAT는 IP변환이고 PAT는 IP+포트까지 변환 (NAT: 보안, PAT: 보안+IP주소 확장)

  • 워드프레스
    • 블로그 또는 웹 사이트를 만들어주기 위한 소프트웨어
    • 워드프레스는 워드프레스 프로그램 이외에도 아파치나 데이터베이스, PHP 런타임 등을 필요로 한다. (단독으로 쓸 수 없다.)
    • 워드프레스는 MySQL 또는 Maria DB를 지원한다.
    • 워드프레스는 프로그램 본체와 아파치 웹 서버 그리고 PHP 런타임을 자체적으로 제공한다.
    • 데이터베이스는 제공해주지 않기 때문에 별도로 설치해서 연결해야 한다.
    • 데이터베이스는 컨테이너가 아니라 외부에 두어도 된다.

Docker 네트워크 생성 및 삭제

  • 네트워크 생성 명령
docker network create 네트워크이름
  • 네트워크 삭제 명령
docker network rm 네트워크이름
  • 목록 출력
docker network ls
  • 상세 정보 출력
docker network inspect 네트워크이름
  • 네트워크에 컨테이너 추가
docker network connect 네트워크이름
  • 네트워크에 컨테이너 제거
docker network disconnect 네트워크이름
  • 사용되지 않는 네트워크 삭제
docker network prune

MySQL 컨테이너 생성

docker run --name 컨테이너이름 -dit --net=네트워크이름 -e MYSQL_ROOT_PASSWORD=root비밀번호 -e MYSQL_DATABASE=생성할데이터베이스 -e MYSQL_USER=유저이름 -e MYSQL_PASSWORD=유저비밀번호 -p 외부포트번호:3306 이미지이름 --characterset-set-server=문자인코딩 --collation-server=정렬순서 --default-authentication-plugin
  • 문자 인코딩은 대부분의 경우 utf8mb4를 설정
  • 정렬 순서는 utf8mb4_unicode_ci를 설정하는데 utf8 순서에 따르는 설정
  • 인증 방식은 예전 방식으로 한다면 mysql_native_password
  • 8.0으로 넘어오면서 인증방식이 변경되었는데 아직 8.0 방식의 인증을 지원하지 않는 소프트웨어가 있다.
    • 워드프레스와 phpMyAdmin이 대표적

워드프레스 컨테이너 실행 시 필요한 옵션과 인자

docker run --name 컨테이너이름 -dit --net=네트워크이름 -p 포트설정 -e WORDPRESS_DB_HOST=데이터베이스컨테이너이름 -e WORDPRESS_DB_NAME=데이터베이스이름 -e WORDPRESS_DB_USER=데이터베이스사용자이름 -e WORDPRESS_DB_PASSWORD=데이터베이스사용자비밀번호 wordpress

기본 포트는 80

WordPress 컨테이너 생성

  • 네트워크 생성
docker network create wordpress000net1

  • MySQL 컨테이너 생성
docker run --name mysql000ex11 -dit --net=wordpress000net1 -e MYSQL_ROOT_PASSWORD=아무거나 -e MYSQL_DATABASE=wordpress000db -e MYSQL_USER=kyla -e MYSQL_PASSWORD=아무거나 -p 3306:3306 mysql
  • 워드프레스 컨테이너 생성
docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80 -e WORDPRESS_DB_HOST=mysql000ex11 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=kyla -e WORDPRESS_DB_PASSWORD=아무거나 wordpress

  • 확인
curl localhost:8085
  • 외부 포트로 포트포워딩 해서 브라우저에서 확인 ⇒ Virtual Box 도구 > NAT네트워크 > 포트포워딩 > rule 추가

192.168.56.1:8085

정리

docker stop wordpress000ex12
docker stop mysql000ex11
docker rm wordpress000ex12
docker rm mysql000ex11
docker network rm wordpress000net1

✅ 컨테이너 → 이미지 → 네트워크 순으로 지워야 한다.

 

 

MySQL

  • 컨테이너 생성
docker run --name mysql-container -dit -e MYSQL_ROOT_PASSWORD=아무거나 -p 3306:3306 mysql
  • 컨테이너에 접속
docker exec -it mysql-container bash
  • mysql 접속
mysql -u root -p # 후에 비밀번호 쳐주기
  • 사용할 데이터베이스 설정
use mysql;
  • 데이터베이스 생성
create database user00;
  • 사용자 생성 및 비밀번호 설정
create user 'user00'@'%' identified by 'user00';
  • 권한 부여
grant all privileges on *.* TO 'user00'@'%';
  • 외부 접속 허용
alterr user 'user00'@'%' identified with mysql_native_password by 'user00';
  • 잘 만들어졌는지 확인
exit
mysql -uuser00 -puser00 user00;
select database();

Redmine 과 MySQL DB 연결

Redmine

  • 오픈 소스 프로그램으로 웹 기반의 프로젝트 관리와 버그 추적 기능을 제공하는 도구
  • 화면 기반의 프로젝트 관리에 도움이 되도록 달력과 간트 차트를 제공하고 일정 관리 기능을 제공한다.
  • 최근에는 Jira를 많이 사용한다.

네트워크 생성

docker network create redmine000net2

MySQL 컨테이너 생성

docker run --name mysql000ex12 -dit --net=redmine000net2 -e MYSQL_ROOT_PASSWORD=아무거나 -e MYSQL_DATABASE=redmine000db -e MYSQL_USER=kyla -e MYSQL_PASSWORD=아무거나 -p 3306:3306 mysql

redmine 컨테이너 생성: 3000번 포트를 외부로 노출

docker run --name redmine000ex12 -dit --net=redmine000net2 -p 8086:3000 -e REDMINE_DB_MYSQL=mysql000ex12 -e REDMINE_DB_DATABASE=redmine000db -e REDMINE_DB_USERNAME=kyla -e REDMINE_DB_PASSWORD=아무거나 redmine

포트포워딩 후 localhost:8086으로 접속해서 확인

Maria DB 컨테이너 생성

docker run --name 컨테이너이름 -dit -e MYSQL_ROOT_PASSWORD=관리자비밀번호 -p 외부접속포트번호:3306 mariadb
docker run --name mariadb -dit -e MYSQL_ROOT_PASSWORD=아무거나 -p 3306:3306 mariadb

컨테이너로 접속

docker exec -it mariadb bash

 

728x90
반응형

'현대 오토에버 클라우드 스쿨' 카테고리의 다른 글

Dockerfile (앱 빌드, Private Registry)  (0) 2025.06.20
Dockerfile  (1) 2025.06.19
Docker 명령어  (0) 2025.06.17
현대 오토에버 클라우드 교육 참여 소감  (0) 2025.06.17
Docker 명령어  (0) 2025.06.16