nfs ( 네트워그 파일 공유 ) 는 다른 리눅스 클라이언트와 디렉토리 및 파일을 공유할 수 있는 프로토콜이다.
도커를 공부하면서 도커 스웜 클러스터를 사용하면서 nfs 를 연결하는 과정을 기록하였다.
스원클러스터를 사용할 시 하나의 서버가 다운 될 경우가 생기게 되면 해당 db 에 관한 내용이 없어지게 된다.
물론 서버는 클러스터이기 때문에 다른 곳에서 서버가 켜져 있지만 데이터는 존재하지 않는다. 이러한 현상이 일어나는 것을 막기 위해 nfs 를 연결시켜 사용한다.
NFS 서버 설치 및 구성
서버
1. 작업을 수행하기 전에 apt 명령을 사용하여 패키지를 업데이트 한다.
apt update
2. nfs server 설치
apt install nfs-kernel-server
3. 클라이언트 시스템간에 공유할 수 있는 디렉토리 생성, ( 내보내기 디렉토리 생성 )
sudo mkdir -p {공유할 폴더 경로}
sudo mkdir -p /nfs/sharedfolder
4. 모든 클라이언트 머신이 공유 디렉토리에 엑세스하기 위해 디렉토리 권한 제한을 제거
sudo chown nobody:nogroup /nfs/sharedfolder
sudo chmod 777 /nfs/sharedfolder
5. nfs 서버에 엑세스하기 위한 권한은 /etc/exports 파일에 정의되어 있다.
단일 클라이언트, 여러 클라이언트에 대한 엑세스를 제공하거나 전체 서브넷을 지정할 수 있다.
udo vi /etc/exports
// vi 창
/mnt/공유할폴더명 클라이언트IP(rw,sync,no_subtree_check)
/nfs/sharefolder 192.168.8.52(rw,sync,no_subtree_check)
연결하고자 하는 ip를 적는다. 엑세스 권한 부여를 한다.
/nfs/sharefolder 192.168.8.0(rw,sync,no_root_squash,no_subtree_check)
/nfs/sharefolder 192.168.8.52(rw,sync,no_root_squash,no_subtree_check)
/nfs/sharefolder 192.168.8.60(rw,sync,no_root_squash,no_subtree_check)
/nfs/sharefolder 192.168.8.61(rw,sync,no_root_squash,no_subtree_check)
6. nfs 공유 디렉토리를 내보내고 nfs 커널 서버를 다시 시작하여 변경사항 적용
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
7. 클라이언트가 nfs 공유에 엑세스하려면 방화벽을 통한 엑세스를 허용해야 한다.
ufw allow from [ip주소] to any port nfs
방화벽이 꺼져 있는 경우 다시 로드하거나 활성화하고 방화벽 상태를 확인
ufw enable
ufw status
클라이언트
클라이언트 시스템에 nfs 클라이언트 설치
서버에 nfs 서비스 설치 및 구성 완료를 하였다. 클라이언트 시스템에 nfs 를 설치한다.
1. 시스템 패키지와 저장소를 업데이트 한다.
apt update
2. nfs-common 패키지 설치
apt install nfs-common
3. nfs 서버에서 공유할 마운트 지점을 만들어야 한다.
mkdir -p /nfs/sharedfolder_client
4. nfs 서버에 아이피를 확인한 후 클라이언트쪽에 해당 ip와 만든 공유 파일 경로를 적은 뒤에 자신의 파일경로를 적는다.
5. master, worker1, worker2 서버에 각 각 마운트 걸어준다.
# vi /etc/fstab 경로에 들어가서 마운트를 걸어준다
/sharefolder_client auto.nofail.noatime.nolock.intr.tcp.actimeo=1800 0 0
192.168.8.55:/nfs/sharefolder /nfs/sharefolder_client nfs defaults 0 0
5. nfs 설정이 작동하는지 확인하기 위해 서버에 있는 nfs 공유 디렉토리 파일을 생성
version: '3.6'
services:
nginx:
image: nginx:1.19.10
ports:
- 3000:80
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
deploy:
mode: replicated
replicas: 3
networks:
- testnetwork
logging:
driver: "json-file"
options:
max-file: "5"
max-size: "100m"
mysql:
image: mysql:5.7.34
ports:
- "3306:3306"
environment:
- MYSQL_DATABASE=testdb
- MYSQL_USER=mysqluser
- MYSQL_PASSWORD=mysqluserpassword
- MYSQL_ROOT_PASSWORD=mysqlrootpass
- TZ=Asia/Seoul
command: >-
--user=mysql
--port=3306
--pid-file=/data/dbfiles/mysql.pid
--datadir=/data/dbfiles
--tmpdir=/data/dbfiles
--explicit_defaults_for_timestamp
--long_query_time=1
--lc-messages=en_US
--event_scheduler=1
--default_password_lifetime=0
volumes:
- /nfs/sharefolder_client:/nfs/sharefolder_client
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
guacamolei:
image: guacamole/guacamole:1.4.0
ports:
- 8282:8080
depends_on:
- mysql
environment:
GUACD_HOSTNAME: guacd
MYSQL_HOSTNAME: mysql
MYSQL_DATABASE: guacamoledb?verifyServerCertificate=false&useSSL=false&requireSSL=false
MYSQL_USER: mysqluser
MYSQL_PASSWORD: mysqluserpassword
deploy:
mode: replicated
replicas: 1
networks:
- testnetwork
logging:
driver: "json-file"
options:
max-file: "5"
max-size: "100m"
# minio-data-volume:
# driver: local
# driver_opts:
# type: "nfs"
# o: "addr=192.169.8.55,nolock,soft,rw,sync"
#device:
networks:
testnetwork:
attachable: true
nfs 서버에서 생성한 파일을 클라이언트 서버에서 확인한다.
ls -l /nfs/sharefolder_client
마지막으로 서버를 껏다 켜서 확인해보자
docker stack deploy -c /yml/test.yml shintest
삭제하고 다시 올리는 방법
docker stack rm shintest
docker stack deploy -c /yml/test.yml shintest
https://meongj-devlog.tistory.com/96#NFS%--%EA%B-%--%EB%A-%A-%--%EB%AA%--%EB%A-%B-%EC%--%B-
'Docker' 카테고리의 다른 글
[Docker] [1] 도커 스웜총정리 (0) | 2022.12.02 |
---|---|
[Docker] swarm 클러스터링 (0) | 2022.11.21 |
[docker] mysql (0) | 2022.10.23 |
[Docker] swarm - nignx, mysql 올리기 (0) | 2022.10.23 |
도커 설치 (0) | 2022.10.15 |