Notice
Recent Posts
Recent Comments
Link
Gom3rye
Volume 본문
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 |