# Vagrant
- VirtualBox나 VMware와 같은 가상머신에 시스템 환경을 편리하게 구축, 관리하기 위한 도구
- 쿠버네티스상에서는 가상머신을 노드라고 부른다. 노드들을 자동으로 한 번에 배포하기 위한 프로그램이 Vagrant
# Vagrant을 왜 사용할까?
가상머신 설치시에는 위와 같이 준비해야 할 것들이 굉장히 많습니다.(iso파일, ip주소, user 생성 등)
만약 생성해야할 가상머신이 1개가 아니라 100대, 1000대라면 어떨까요? 이러한 다양한 설정을 하나씩 해주고, 설치도 하나하나씩 한다고 상상하면 생각만으로 끔찍합니다.
그런데 Vagrant를 사용하면, 가상사용자는 Vagrantfile이라는 YAML 설정 파일을 만들어서 원하는 설정의 가상머신을 아주 많은 수라도 자동으로 설치할 수 있습니다. 그렇기 때문에 Vagrant 를 사용하게 됩니다. 그런데, 듣고보니 Vagrant 와 도커가 비슷하지 않나요?
https://kgw7401.tistory.com/44
# Vagrant 와 Docker의 차이?
Vagrant 와 Docker의 근본적인 차이는 Vagrant 는 운영체제를 가지고 설치한다. 더 무겁다. 기본사용 용량도 필요하고, 자원(cpu, ram)등 필요해서 무겁다. (box) - 동일한 운영체제일 경우 효과적(언어는 루비)
Docker는 자원이 필요없다. 그냥 이미지로만 설치하기 때문에 훨씬 가볍다.(컨테이너). 도커가 더 상위 개념이다. - 운영체제의 구분없이 가능.(도커는 파이썬)
하나의 서비스에 하나의 이미지만 구축가능하기 때문에 컨테이너가 많이 필요.
---
Vagrant 와 Docker는 애플리케이션 개발과 배포를 자동화하고 효율화하며 도움을 준다는 면, 환경 일관성을 유지한다는 면에서는 매우 비슷합니다. 하지만, 이 둘은 기본적인 접근 방식과 사용 사례에서 차이점을 보입니다.
-
차이점
- 기본 기술: Docker는 컨테이너화 기술을 사용하여 애플리케이션과 그 종속성을 컨테이너 내에서 실행합니다. 반면, Vagrant는 가상 머신을 생성하고 관리하는 데 초점을 맞춥니다. 6
- 자원 효율성: Docker는 하나의 운영 체제 내에서 여러 컨테이너를 실행할 수 있어 자원을 효율적으로 사용합니다. Vagrant는 각 가상 머신에 별도의 운영 체제가 필요하기 때문에 더 많은 자원을 소모합니다. 6
- 플랫폼 지원: Docker는 리눅스 컨테이너 기술에 더 초점을 맞추고 있지만, Vagrant는 다양한 운영 체제를 지원하는 가상 머신을 제공합니다. 8
Vagrant와 Docker는 각각의 장단점을 가지고 있으며, 프로젝트의 요구 사항과 개발 환경에 따라 적합한 도구를 선택하는 것이 중요합니다. Docker는 컨테이너화를 통해 빠르고 경량화된 환경을 제공하는 반면, Vagrant는 다양한 운영 체제와의 호환성 및 가상 머신을 통한 환경 구성에 더 적합할 수 있습니다.
# 설치
1. virtual box + 확장팩 다운로드
https://www.virtualbox.org/wiki/Downloads
2. vagrant 다운로드
https://developer.hashicorp.com/vagrant/install
# 실습
# 1. 가상머신 구성을 위한 Vagrantfile(script 파일) 작성
: 메모장에 아래 코드 붙여넣고 Vagrantfile 이름으로 '바탕화면'에 저장(.txt 확장자 부분 삭제)
# -*- mode: ruby -*- # 루비 언어로 작성
# vi: set ft=ruby :
Vagrant.configure("2") do |config| # "2"의 의미 : 구성 파일의 버전(호환성)
config.vm.define "WP-WEB01" do |config|
config.vm.box = "rockylinux/9" # box : 이미지를 저장하는 곳(도커의 컨테이너와 유사)
config.vm.network "private_network", ip: "192.168.57.11" # 가상IP(HOST-ONLY)
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.provider "virtualbox" do |vb|
vb.memory = "2048"
vb.cpus = 2
vb.name = "WP-WEB01"
end
config.vm.hostname = "WP-WEB01" # 가상머신 내 호스트이름
end
end
# 2. vagrant로 가상머신 생성(powershell)
# powershell 프로그램 실행 후에
./com/desktop #경로 이동
ls # 해당경로(바탕화면)에 Vagrantfile 있는지 확인
vagrant up # vagrant 실행
vagrant up이 끝나면 virtual box에 Vagrant script로 작성한 WP-WEB01 서버가 올라온 것을 확인할 수 있습니다.
# 3. WP-WEB01 서버 IP설정 수정(virtual box)
: 파일 > 도구 > 네트워크 관리자 > 192.168.56.1 클릭 > DHCP 서버 활성화 클릭 해제 > 적용
192.168.56.1/24 는 자동으로 할당해주는 IP 이고, 192.168.57.1/24는 위에서 Vagrantfile 로 지정해준 IP 입니다.
# 만약 구성이 안된다면 네트워크 문제일 수 있다. 가상머신을 삭제하고 다시 깔아보자.
# vagrant destroy
# 4. WP-WEB01 서버 접속 및 패키지 설치(powershell)
vagrant ssh WP-WEB01 # WP-WEB01에 접속
[vagrant@WP-WEB01 ~]$ sudo dnf -y install httpd php php-mysqlnd mysql-server # 모든 패키지 설치
[vagrant@WP-WEB01 ~]$ sudo systemctl enable httpd --now # http 실행
[vagrant@WP-WEB01 ~]$ sudo systemctl enable firewalld --now # 방화벽 실행
[vagrant@WP-WEB01 ~]$ sudo firewall-cmd --permanent --add-service=http # 방화벽 서비스 포트 추가
#sudo su 로 권한 바꿔줘도 됨
[vagrant@WP-WEB01 ~]$ sudo curl -o wordpress.tar.gz https://wordpress.org/wordpress-6.3.2.tar.gz # wordpress 다운
# curl -o / wget 비슷한 역할. but wget는 전체 url을 다 써줘야하고,
# curl -o 는 축약 url을 써줘도 되고, 다운로드시 파일 명도 원하는대로 지정 가능하다.
[vagrant@WP-WEB01 ~]$ sudo tar xzf wordpress.tar.gz -C /var/www/html/
# -C 옵션을 쓰면 위치를 직접 지정해서 추출 가능! # /var/www/html/ 에 압축파일을 풀어라~
# 5. wordpress 권한 변경 및 설정 파일 변경 (powershell)
## wordpress 권한 변경(httpd와의 원활한 연동을 위해)
[vagrant@WP-WEB01 ~]$ sudo chmod -R 775 /var/www/html/wordpress/ # 권한 변경
[vagrant@WP-WEB01 ~]$ sudo chown -R apache.apache /var/www/html/wordpress/ # 아파치의 소유권으로 변경
# apache 관리자가 관리하는 것이 root 사용자가 관리하는 것보다 더 효율적이다.
# httpd 랑 wordpress를 연결해야하니까, httpd의 관리자인 apache 관리자로 변경해주는 것이 일이 수월?하다.
[vagrant@WP-WEB01 ~]$ sudo ls -ld /var/www/html/wordpress/
[vagrant@WP-WEB01 ~]$ sudo ls /var/www/html/wordpress/
[vagrant@WP-WEB01 ~]$ sudo cp /var/www/html/wordpress/wp-config-sample.php /var/www/html/wordpress/wp-config.php
## wordpress 설정 파일 변경 - 데이터베이스 정보 입력
[vagrant@WP-WEB01 ~]$ sudo sed -i "s/define( 'DB_NAME', '.*' );/define( 'DB_NAME', 'wp' );/" /var/www/html/wordpress/wp-config.php
# sed -i : 치환 명령어, / 기준으로 앞의 내용을 뒤에 내용으로 바꿔줌, 맨끝엔 출처(위치및파일명)
# s/ : 문자열이니까, '.*' : 뭐라고 써있던지 간에
# 이걸로 DB_USER, DB_PASSWORD, DB_HOST 모두 변경해주기
# 6. Apache 웹 서버의 설정 파일 옵션 수정 (powershell)
# * 설정 디렉토리 활용 : 분리해서 깔끔하게 정리
# conf/httpd.conf 가 아닌, conf.d 폴더의 wordpress.conf 설정파일에서 경로 수정
tee /etc/httpd/conf.d/wordpress.conf << EOF
# EOF : EOF란 단어가 나올 때까지 입력하겠다는 의미
# 아래 텍스트 입력 후 EOF 입력, enter!
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/html/wordpress
<Directory "/var/www/html/wordpress">
AllowOverride All
</Directory>
</VirtualHost>
EOF
# selinux 설정
[vagrant@WP-WEB01 ~]$ sudo setsebool -P httpd_can_network_connect_db 1
# SELinux(Security-Enhanced Linux) 정책을 설정하는 것
# http가 데이터베이스로 접근할 수 있는 selinux 설정
# setsebool: SELinux 부울린 변수의 값을 설정하는 명령어
# -P: 이 옵션은 변경 사항을 현재와 영구적으로 저장을 같이하는 것. 시스템 재부팅 후에도 적용
# httpd_can_network_connect_db: 이 SELinux 부울린 변수는 Apache HTTP 서버가 데이터베이스에 네트워크로 연결할 수 있도록 허용하는 것을 의미
# 1: 이 값은 true를 의미
! 여기서 잠깐 ! 설정파일의 우선순위는?
# 설정파일의 우선순위
: 설정파일이 겹친다면, 범위가 낮은것부터 큰것으로 갈수록 우선순위가 높아진다.
: 현재 작업 디렉토리 > 사용자 홈디렉토리 > 설정 디렉토리(/etc/*conf.d) > 설정파일
(ex. /home/user/test/ 경로가 있을 때 : test 폴더 안에 있는게 1번, user 폴더에 있는게 2번, home 폴더에 있는게 3번의 우선권을 갖는다.
ex. /etc/httpd/conf.d/**.conf > 즉 conf.d(설정 디렉토리) 내 설정파일이 4번의 우선권, /etc/httpd/conf/httpd.conf 경로가 있을 때 가 5번의 우선권을 갖는다.)
# 7. 데이터베이스 활성화 및 방화벽 허용 (powershell)
# 서비스 실행
[vagrant@WP-WEB01 ~]$ systemctl enable mysqld.service --now
# 방화벽 세팅
[vagrant@WP-WEB01 ~]$ firewall-cmd --permanent --add-service=mysql
[vagrant@WP-WEB01 ~]$ firewall-cmd --reload # 재시작
# 8. Root 비밀번호 설정 및 익명사용자, 외부 접근자 제거 (powershell)
# root 사용자 비밀번호 설정
[vagrant@WP-WEB01 ~]$ mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'P@ssw0rd';"
# = mysql_secure_installation : 전문가 모드로 변경해서 설정
# -e : 다음에 오는 문자열을 MySQL 명령어로 실행하라
# 익명 사용자 제거(이름이 없는 사용자)
# : 사용자 칸에 빈칸으로 하면, 이름 없는 사용자도 로그인이 가능하다. > 그걸 제한해줄거임
[vagrant@WP-WEB01 ~]$ mysql -u root -pP@ssw0rd -e "DELETE FROM mysql.user WHERE User='';"
# -pP@ssw0rd : -p 다음에 띄어쓰기 없이 비번 입력
# 외부에서 접근 가능한 root 사용자 제거(원격 사용자 제한, 로컬에서만 접근 가능)
[vagrant@WP-WEB01 ~]$ mysql -u root -pP@ssw0rd -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');"
# 여기 적은 root 사용자들 빼고는 다 지울거야, root로는 다 못들어오게 할거야. 라는 뜻.
# '127.0.0.1' : IPV4의 루프백(자기자신)
# '::1' : IPV6의 루프백(자기자신)
=> root 는 원격제한해도 되는 이유, 일반 사용자한테 모든 권한을 넘겼기에 일반사용자로 원격접속하면 됨!
# 9. MySQL 데이터베이스와 사용자 생성 (powershell)
## 데이터베이스 생성
[vagrant@WP-WEB01 ~]$ mysql -u root -pP@ssw0rd -e "CREATE DATABASE wp;"
## wp-user 유저 생성 및 비번 설정
[vagrant@WP-WEB01 ~]$ mysql -u root -pP@ssw0rd -e "CREATE USER 'wp-user'@'192.168.57.0/24' identified by 'P@ssw0rd';"
# 'root' 사용자로 MySQL에 접속하여, '192.168.57.0/24' 네트워크 대역에서 접속 가능한 'wp-user'라는 새로운 사용자를 생성하라
# identified by : 사용자 생성시 사용자의 비밀번호를 설정
## wp-user 유저에게 모든 권한부여
# : DB에서 SELECT, DELETE 등 사용 가능하도록 권한 부여
[vagrant@WP-WEB01 ~]$ mysql -u root -pP@ssw0rd -e "GRANT ALL PRIVILEGES ON wp.* TO 'wp-user'@'192.168.57.0/24' WITH GRANT OPTION;"
# PRIVILEGES ON : 자동 갱신
# GRANT ~ TO / REVOKE ~ FROM
자 이렇게 오늘은 Vagrant를 활용해서 자동으로 서버 생성을 해보았습니다. 다음 시간에는 Vagrant를 활용해서 더 심도있는 서버구축을 진행해보겠습니다. 감사합니다.
'Vagrant' 카테고리의 다른 글
[Vagrant] 02. Vagrant를 활용해서 자동으로 서버 생성 심화 - HAProxy서버, 서버 이중화, DB서버 분리 (1) | 2024.05.09 |
---|