simDev1234
심플하고 차분하게
simDev1234
전체 방문자
오늘
어제
  • 분류 전체보기
    • Computer Science
      • Basic Math
      • Data Structure
      • Algorithm
      • Database
      • OS
    • Language
      • Java
      • Kotlin
      • SQL
    • Framework
      • Spring
      • Orm&Mapper
      • 프로젝트로 스프링 이해하기
      • 스프링 라이브러리
    • Infra
      • Cloud
      • Docker
      • Redis
      • AWS, Azure
      • Device
    • Etc
      • CleanCoding
    • Git,Github

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • controllerTest
  • 자바
  • 404
  • 참조타입
  • 자바프로그래밍
  • 자바메모리구조
  • scanner #next() #nextLine()
  • 자바프로그램
  • null
  • JVM메모리구조
  • 스프링
  • 참조변수
  • 컨트롤러

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
simDev1234
Infra/Docker

[Docker] 호스트OS에 log, config 연결 (+my.cnf)

[Docker] 호스트OS에 log, config 연결 (+my.cnf)
Infra/Docker

[Docker] 호스트OS에 log, config 연결 (+my.cnf)

2023. 12. 29. 21:01

호스트 OS에 log/config를 연결하기 위한 순서

[1] 호스트 OS에서 log,conf 파일 경로를 먼저 생성
[2] mysql 기본 설정 파일(my.cnf)을 호스트 OS의 conf 경로에 저장
     * 주의 ) 이 때, my.cnf 파일의 설정값은 컨테이너를 기준으로 한다.
       예를 들어, basedir=/var/lib/mysql 로 설정한다면, 이는 컨테이너의 /var/lib/mysql 경로를 의미한다. 
[3] 컨테이너를 재생성하며 -v 옵션을 통해 호스트 OS의 log/conf 경로와 컨테이너 log/conf 경로를 연결
     * my.cnf 에서 설정했던 log 경로가 곧 컨테이너 log 경로이다. 
       컨테이너 conf 경로는 my.cnf이 저장되는 아무 경로로 설정하면 된다.

 

호스트 OS에 log/conf 파일 경로 생성

기존 컨테이너는 삭제하고, 새로 data, log, config 를 저장할 경로를 생성한뒤 각 경로에 권한을 777로 설정했다.

# 경로 생성
mkdir db/db001/data db/db001/log db/db001/conf

# 권한 설정 
chmod 777 db/db001/data db/db001/log db/db001/conf

 

 

호스트 OS의 config 경로에 MySQL 기본 설정 파일 생성 - my.~~

MySQL에서는 기본 설정값을 my로 시작하는 파일에 담아 둔다. 

- 유닉스 계열 : my.cnf

- 윈도우 : my.ini

Docker 컨테이너에서 아래의 명령어를 치고 디폴트로 잡힌 my.cnf 파일 경로를 확인했다. 

docker exec db001 mysql --help

/etc/my.cnf부터 /etc/mysql/my.cnf, /usr/etc/mysql... 경로들 중에서 어딘가에 my.cnf이 있다는 거다.

(내 컨테이너 안에서는 확인해보니 /etc/my.cnf 경로에 my.cnf 파일이 담겨 있었다.)

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf

docker container 또한 앞서 말했듯 일종의 게스트 OS로 자신만의 분할 공간을 가지고 있기에,
docker container 내의 파일을 열어보기 위해서는 docker container의 쉘을 열어줘야 한다.
Unix 계열의 OS의 경우, sh/bash/zbash 의 쉘 종류들이 존재하는데, 그 중 bash를 사용하면 된다.
docker를 exec로 실행할 때, /bin/bash를 붙이면 해당 Container의 bash쉘을 실행시키겠다는 뜻이다.

[root@sideproject opc]# docker exec -it -uroot db001 /bin/bash


(mysql container의 mysql를 다이렉트로 실행하기 위해서는 docker exec -it {컨테이너명} mysql -uroot -p를 쓴다)

사이드로 빠진 얘기는 차치하고, 다시 /etc/my.cnf의 my.cnf 파일을 확인해보면 아래와 같다.

[root@db001 /]# cat /etc/my.cnf
#
# The Percona Server 5.7 configuration file.
#
#
# * IMPORTANT: Additional settings that can override those from this file!
#   The files must end with '.cnf', otherwise they'll be ignored.
#   Please make any edits and changes to the appropriate sectional files
#   included below.
#
!includedir /etc/my.cnf.d/
!includedir /etc/percona-server.conf.d/

해석하면, 

* 중요 : 이 파일을 통해 추가적인 세팅들을 덮어쓸 수 있다!
  파일들은 항상 .cnf 확장자로 끝나야 하며, 그렇지 않으면 무시된다.
  아래 경로들에 있는 부분 섹션 파일들과 같이 적절한 방식으로 작성해두어라.
!includedir /etc/my.cnf.d/
!includedir /etc/percona-server.conf.d/

하라는 대로 하기 위해서, 제시된 경로들을 확인해보니 파일이 딱 하나 있었다.

mysql 또한 하나의 소프트웨어 프로그램이기 때문에 client와 server가 존재하며,

my.cnf에 쓰는 mysql이 client 프로그램이고, mysqld가 server(=데몬) 프로그램을 의미했다.

아래의 mysqld는 그 중 서버 프로그램(이자 데몬 프로그램)을 말한다. 

# /etc/my.cnf.d/docker.cnf 파일 
# mysql의 background 설정
[mysqld]
skip-host-cache
skip-name-resolve

 

my.cnf 파일 구성하기

 

[ 시작 전에 - mysql의 동작 방식에 대해 간단히 살펴보기 ] 

mysql은 내부적으로 클라이언트 프로그램(mysql), 서버 프로그램(mysqld)를 두며,
socket을 통해 클라이언트-서버 간 양방향 통신을 한다.
이 때, socker 통신 방식으로 크게 두 가지의 방식을 사용한다. 
1) TCP/IP 통신 : 서버-클라이언트가 다른 컴퓨터에 있을 때 사용 
2) Unix Domain Socker 통신 : 서버-클라이언트가 같은 컴퓨터에 있을 때 mysql.sock 파일을 통해 통신
mysql를 로컬 컴퓨터에서 docker로 생성해줬기 때문에 지금 내 경우 mysql은 2)과 같이 socket 통신을 한다.
이 때 mysql.socket이 위치한 경로는 디폴트로 /var/lib/mysql/mysql.sock 이다.

mysql의 Replication(복제방식)은 여러가지가 있으며, 그 중 Async Replication은 Binary Log를 활용해 Replica를 형성한다.
Slave에서는 상위(ex.Master)로부터 로그를 받아 relay log에 저장하는데, 만약 log_slave_updates 파라미터가 활성화(ON)되어 있다면 이 로그를 자신의 binlog에도 함께 기록한다.

출처:https://hoing.io/archives/3111

정말 아름답게도 my.cnf 파일의 모든 옵션을 정리해준 블로그글이 있었다(갓),
그 중에 당장 필요한 것만 뽑았는데 세밀한 옵션 설정이 필요하다면 나중에 또 이분의 글을 참고하면 도움이 될 것 같다.

https://youngsam.net/entry/mysql-mycnf-%EB%82%B4%EC%9A%A9-%EC%84%A4%EB%AA%85-%EC%A0%95%EB%A6%AC

 

영삼넷 :: mysql my.cnf 내용 설명 정리

my.cnf : The file has system variables for DB environment. location of MariaDB SW in this docoment : /engn001/mysvc01/mariadb-10.0.26 location of my.cnf in this document: /engn001/mysvc01/MARIASVC/my.cnf my.cnf sample $ vi /engn001/mysvc01/MARIASVC/my.cnf

youngsam.net

# Mysql 서버 옵션
[mysqld]
server-id=1                        # 서버 id값/master,slave들이 서로 달라야함
report_host=db001                  # 호스트명
basedir=/var/lib/mysql             # 기본 경로 
datadir=/var/lib/mysql             # 데이터 저장 위치
socket=/var/lib/mysql/mysql.sock   # 소켓 파일 경로 
log_bin=mysql-bin                  # binlog(서버 내 모든 변경 내역) mysql-bin.0001 형식으로 저장
binlog_format=ROW                  # binlog 저장 방식 - statement/row/mixed 
                                # row : binary / statement : sql query / mixed : statement+row
log-error=/var/log/mysql/mysql.log # 에러 로그 경로                  
gtid_mode=ON                       # 트랜잭션 고유 식별자 ON
enforce-gtid-consistency=true      # gtid on할 때 DDL명령어 안되는 것 강제 해제
log_slave_updates                  # Slave라면 ON으로 자신의 binlog에 로그 저장
symbolic-links=0 # Disabling symbolic-links is recommended to prevent assorted security risks
pid-file=/var/run/mysqld/mysqld.pid # 프로세스 id 파일 경로 설정 (꼭 mysqld_safe에도 넣어야함)

# Mysqld_safe : mysqld를 감시하는 데몬으로, mysqld_safe가 mysqld를 실행한다.
[mysqld_safe]
socket=/var/lib/mysql/mysql.sock
pid-file=/var/run/mysqld/mysqld.pid
nice=0

conf 디렉토리에 my.cnf파일을 vi로 넣어두었다.  또 권한을 644(rw-r-r) 로 두었다. 

vi my.cnf

// rw-r-r 로 권한 설정
chmod 644 my.cnf

이제, 컨테이너를 재생성 해준다. 

 

컨테이너 재생성 및 실행 

# 컨테이너 생성
docker run -i -t --name db001 -h db001 -p 3306:3306 \ 
-v /home/opc/db/db001/data:/var/lib/mysql \ 
-v /home/opc/db/db001/log:/var/log/mysql \ 
-v /home/opc/db/db001/conf:/etc/percona-server.conf.d \       <--- 설정 파일 
-e MYSQL_ROOT_PASSWORD="root" -d percona:5.7.30

# 참고) 오라이클 클라우드를 쓰면 /home/opc/ 를 입력해줘야 처음 사용자 접속 경로에서 내려간다.

 

이 상태에서, /db/db001/log 로 가면, 아래와 같이 mysql.log가 잘 들어간 걸 볼 수 있었다.

[root@sideproject log]# ll
total 8
-rw-r-----. 1 polkitd input 4133 Dec 29 11:57 mysql.log

 

[참고]

인프런 > 따라하며 배우는 MySQL on Docker 를 듣고 정리한 내용

https://hoing.io/archives/3111

https://kihyun-log.tistory.com/entry/MySQL-binlog-format
https://antamis.tistory.com/9

https://velog.io/@inhwa1025/MySQL-%EC%84%A4%EC%A0%95-%ED%8C%8C%EC%9D%BC-my.cnf-%EC%98%B5%EC%85%98-%EC%A2%85%EB%A5%98

'Infra > Docker' 카테고리의 다른 글

[Docker] Proxy Layer 구성하기  (2) 2024.01.08
[Docker] Orchestra를 통해 High Availability(HA) 구축하기  (1) 2024.01.08
[Docker] 브리지를 통해 컨테이너 통신  (1) 2024.01.08
[Docker] Master-Slave Replication 구성  (0) 2023.12.31
[Docker] Docker란? Docker로 Mysql 설치해보기  (1) 2023.12.28
  • 호스트 OS에 log/config를 연결하기 위한 순서
  •  
  • 호스트 OS에 log/conf 파일 경로 생성
  • 호스트 OS의 config 경로에 MySQL 기본 설정 파일 생성 - my.~~
  •  
  • my.cnf 파일 구성하기
  • conf 디렉토리에 my.cnf파일을 vi로 넣어두었다.  또 권한을 644(rw-r-r) 로 두었다. 
  • 컨테이너 재생성 및 실행 
'Infra/Docker' 카테고리의 다른 글
  • [Docker] Orchestra를 통해 High Availability(HA) 구축하기
  • [Docker] 브리지를 통해 컨테이너 통신
  • [Docker] Master-Slave Replication 구성
  • [Docker] Docker란? Docker로 Mysql 설치해보기
simDev1234
simDev1234
TIL용 블로그. * 저작권 이슈가 있는 부분이 있다면 댓글 부탁드립니다.

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.