집 >데이터 베이스 >MySQL 튜토리얼 >Docker 및 MySQL을 사용하여 새로운 Rails 애플리케이션 설정
저는 중견 기술 및 데이터 회사의 수석 소프트웨어 엔지니어입니다. 역사적으로 저는 많은 역할을 해왔습니다. 고객 확보 흐름 구축, 데이터베이스 관리 수행, 복잡한 React 작업, 내부 사용을 위한 모든 기능을 갖춘 CMS 제작, 처음부터 공개용 Golang API 마이크로서비스 구축, API 인증 시스템 제작, 다양한 B2B 및 B2C 제품을 제공하고 여러 팀의 기술 리드(동시에) 등을 역임했습니다. 나는 또한 새로운 Rails 애플리케이션을 처음부터 구축하는 데 있어서 현재 거의 경험이 없습니다. 그래서 한번 시도해 봐야겠다고 생각했습니다!
이것은 매우 기본적인 튜토리얼이지만 이에 대한 실용적인 가이드가 부족하다는 것을 알았습니다. 즉, 저는 이 글을 작성하기 위해 많이 빌려온 두 가지 튜토리얼을 소개하고 싶습니다. 이 튜토리얼은 해당 게시물과 제가 개인적으로 선호하는 몇 가지를 종합한 것입니다: Tallan Groberg와 Nícolas Iensen. 본론으로 들어가기 위해 많은 세부 사항을 생략하겠습니다. 저는 새로운 M4 Macbook Pro를 사용하여 이 글을 쓰고 있지만 기본 사항은 대부분의 Mac 또는 Linux 환경에도 적용되어야 합니다.
우리는 Rails를 기본 프레임워크로 사용하고 데이터베이스용 MySQL(부분적으로는 기능을 위해, 부분적으로는 이 게시물에서 목표로 하는 내용의 복잡성을 추가하기 위해) 및 Docker를 사용하는 간단한 Ruby 애플리케이션을 구축할 것입니다. 가상화 및 플랫폼 간 호환성을 위해. 이 튜토리얼에서는 모델이나 컨트롤러를 구축하지 않습니다. 모든 것은 설정에 관한 것입니다. 튜토리얼이 끝나면 꽤 고전적인 Hello World 앱을 갖게 될 것입니다. 이 기본 개념을 이해하고 구축 중인 모든 애플리케이션에 적용할 수 있어야 합니다.
우선 터미널과 Unix 기반 컴퓨터에 어느 정도 익숙하다고 가정합니다. 어느 정도 이해가 된다면 Docker와 Homebrew를 설치해야 합니다(Mac을 사용한다고 가정). zsh를 기본 셸로 실행하는 경우(요즘 대부분의 Mac은 기본 셸임) Brew 명령을 실행하려면 ~/.zshrc 파일에 다음을 추가해야 할 수도 있습니다.
path+=/opt/homebrew/bin
파일을 저장한 후 source ~/.zshrc를 실행하면 됩니다!
작은 참고 사항: $ 접두사가 붙은 명령은 로컬 셸(zsh 또는 bash 등)에서 실행되는 명령을 나타내고 # 접두사가 붙은 명령은 Docker 컨테이너 내에서 실행됩니다. 모든 경우에 접두사는 복사되어서는 안 되며 단지 새 줄 프롬프트를 시각적으로 표시하는 것일 뿐입니다.
많은 개발자가 모든 코딩 프로젝트를 단일 디렉토리에 넣습니다(저는 다운로드 및 문서 디렉토리의 형제로 살고 있으며 저는 이를 창의적으로 코드라고 부릅니다). 터미널에서 해당 디렉터리로 이동하여 다음 명령을 입력합니다.
$ mkdir my-app $ cd my-app
이 새 디렉토리에는 몇 가지 새 파일이 필요합니다. 다음 명령을 사용하여 생성하세요.
path+=/opt/homebrew/bin
첫 번째로 Dockerfile.dev는 기본 Docker 이미지를 생성하여 이 프로젝트에 사용할 Ruby 버전(이 글을 쓰는 시점의 최신 버전인 3.3.6)을 설치하는 기존 이미지를 기반으로 구축하고 설정합니다. 해당 이미지가 어떻게 작동해야 하는지에 대한 몇 가지 사소한 세부정보입니다. 파일 이름의 .dev 부분은 이 Dockerfile이 프로덕션 환경이 아닌 로컬에서만 사용된다는 것을 나타냅니다. 튜토리얼의 뒷부분에서 실행하는 명령은 실제로 보다 강력한 프로덕션 준비 Dockerfile을 구축하며 두 가지를 구별할 수 있기를 원합니다. 이 튜토리얼의 범위를 고려하면 그러한 세부 사항에 대해서는 걱정하지 않습니다. 해당 파일에 다음 줄을 추가합니다:
$ mkdir my-app $ cd my-app
다음은 docker-compose.yml 파일입니다. 이 파일의 목적은 다수의 Docker 컨테이너를 함께 조정하여 우리가 구축 중인 웹 애플리케이션의 모든 구성 요소(웹 서버, 데이터베이스, 잠재적으로)가 서로 연결되도록 하는 것입니다. Redis 서버, 아마도 Elasticsearch 서버 등. 이러한 모든 다양한 요소는 자체 "가상 컴퓨터"에 상주하며 프로덕션 환경을 모방하는 방식으로 서로 통신하도록 연결되어야 합니다. 이론적인 내용은 충분하고, 중요한 점은 docker-compose.yml 파일에 일부 구성 코드를 추가해야 한다는 것입니다.
$ touch Dockerfile.dev $ touch docker-compose.yml $ touch Gemfile
자세한 내용은 걱정하지 마세요. 기본적으로 "이것을 실행하면 'web'이라는 애플리케이션을 실행하게 되며 'Dockerfile.dev'라는 dockerfile을 사용하여 기본 애플리케이션을 빌드하려고 시도하게 됩니다. ' 그리고 도커 시스템 네트워크의 내부 포트 3000을 실행 중인 로컬 컴퓨터의 포트 3000에 매핑합니다. 또한 데이터베이스를 가동하여 서로 통신할 수 있도록 합니다." 아니면 그런 것. 이미 포트 3000에서 애플리케이션을 실행하고 있다면 왼쪽 포트 번호를 원하는 대로 자유롭게 변경하세요.
알겠습니다! 이제 이미지를 빌드할 파일과 해당 이미지를 사용하여 컨테이너를 실행하고 회전하는 작은 네트워크에 팝업하는 또 다른 파일이 있습니다. 멋진! 그런데...어떻게 그럴 수 있나요?
장난을 시작하려면 우리가 만들고 있는 컨테이너에 실제로 들어가서 몇 가지 작업을 수행해야 합니다. 다음을 실행하면 됩니다.
FROM ruby:3.3.6 WORKDIR /usr/src/app COPY . . RUN bundle install
이제 우리는 컴퓨터 안에있습니다. 이제 사용 중인 컴퓨터에 특정 소프트웨어를 설치할 필요 없이 컨테이너 환경 내에서 명령을 실행할 수 있다는 아이디어입니다. 예를 들어 Rails는 컴퓨터에서 실행되는 Docker 컨테이너에서 실행하기 위해 컴퓨터의 어느 곳에도 존재할 필요가 없습니다. 꽤 멋지네요.
자, 이제 Rails를 설치해 보겠습니다.
services: db: image: mysql:5.7 restart: always environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: app MYSQL_USER: user MYSQL_PASSWORD: password ports: - "3307:3306" web: build: context: . dockerfile: Dockerfile.dev command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - ".:/usr/src/app" ports: - "3000:3000" depends_on: - db links: - db environment: DB_USER: root DB_NAME: app DB_PASSWORD: password DB_HOST: db
이제 애플리케이션을 만들어 보겠습니다. 우리는 MySQL을 사용하여 이 애플리케이션을 구축하고 싶었으므로 다음 명령의 사양을 참고하세요.
path+=/opt/homebrew/bin
이 작업에는 몇 초 정도 걸립니다. Gemfile을 덮어쓸지 묻는 메시지가 표시됩니다. 확인하려면 y를 누르세요. 이 명령으로 생성된 다른 파일에 대해서도 동일한 질문이 표시됩니다. 그에 따라 y/n 키를 사용하여 새 버전을 건너뛰거나 수락하세요.
만세! 애플리케이션의 골격이 완성되었습니다! 그러나 실제로는 끝나지 않았습니다. 데이터베이스를 준비하려면 한 가지 중요한 부분을 해결해야 합니다. 그런 다음 이상적으로는 중요한 보안 세부 사항을 다루어야 합니다.
이 섹션의 첫 번째 부분은 로컬에서 작업만 하고 아무것도 배포할 계획이 없다면 그다지 필요하지 않을 수도 있습니다. 게다가 여기에서는 고려해야 할 사항이 더 많으므로 DB 구성 및 기본 리포지토리 보안 중 일부를 자세히 알아보기 위해 별도의 튜토리얼을 볼 가치가 있다고 생각합니다. 특히 리포지토리가 공개된 경우(공개된 경우라면 걱정하지 마세요. 조심하세요!) .
이전 명령을 사용하면 수많은 새 파일과 디렉터리가 생겼습니다. 그 중 하나가 config/database.yml입니다. 저에게는 12번째 줄에 다음과 같은 블록이 있습니다:
$ mkdir my-app $ cd my-app
기술적으로는 위의 내용이 작동합니다. 거기에는 "잘못"이 없습니다. 하지만 우리는 더 잘할 수 있습니다. 가장 큰 문제는 우리 DB에 비밀번호가 없다는 점이다. 다음 문제는 DB에 이름이 없다는 것입니다. 마지막으로 사용자 이름은 일반 텍스트로 표시됩니다. 내가 가장 좋아하는 것은 아닙니다. 모든 것을 다음으로 변경해 보겠습니다. 다음 중 첫 번째 필드는 새 필드이고 두 번째 두 필드는 기존 값을 대체해야 합니다.
$ touch Dockerfile.dev $ touch docker-compose.yml $ touch Gemfile
ENV.fetch("VARIABLE_NAME") { "fallback_value" } 스타일을 사용할 수도 있습니다. ENV["VARIABLE_NAME"]과 ENV.fetch("VARIABLE_NAME")의 차이점은 전자는 지정된 이름을 가진 환경 변수를 찾을 수 없는 경우 nil을 반환하는 반면 후자는 일부 경고나 오류를 발생시킬 수 있다는 것입니다(이 항목 참조). ENV.fetch에 대한 자세한 내용은 여기를 참조하세요.
이 모든 것을 고려하고 셸을 종료하지 않았다고 가정하면(다시 로그인하려면 docker-compose run --service-ports web bash를 사용할 수 있음) 새 데이터베이스를 만들어야 합니다. 다음 명령을 사용하여 수행하세요.
FROM ruby:3.3.6 WORKDIR /usr/src/app COPY . . RUN bundle install
Docker 셸을 종료하고 로컬 터미널 환경에서 다음 명령을 실행합니다.
services: db: image: mysql:5.7 restart: always environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: app MYSQL_USER: user MYSQL_PASSWORD: password ports: - "3307:3306" web: build: context: . dockerfile: Dockerfile.dev command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - ".:/usr/src/app" ports: - "3000:3000" depends_on: - db links: - db environment: DB_USER: root DB_NAME: app DB_PASSWORD: password DB_HOST: db
그렇습니다! 브라우저(또는 Postman과 같은 API 클라이언트)를 localhost:3000으로 지정하면 다음 클래식 Rails 시작 페이지가 표시됩니다:
작동 중인 애플리케이션이 있습니다! 그리고 프로덕션 작업에 사용할 준비가 된 멋진 데이터베이스도 함께 제공됩니다(Rails가 제공하는 기본 데이터베이스인 SQLite는 기본 아이디어를 함께 해킹하는 데는 좋지만 프로덕션 작업에는 적합하지 않으며 제작자는 이상한 사람입니다)! 그러나 보다 강력한 데이터베이스에는 몇 가지 추가 책임이 따릅니다.
이 튜토리얼의 앞부분에서 살펴본 것처럼 우리는 데이터베이스 이름, 사용자 이름, 해당 사용자의 비밀번호라는 세 가지 중요한 값을 제공해야 했습니다. 현재로서는 1개의 추상화 계층이 있습니다. 원시 문자열 값을 단순히 Database.yml에 전달하는 대신 Rails 환경에서 해당 값을 가져옵니다. 그렇다면 Rails 환경은 어디에서 이러한 값을 얻습니까? docker-compose.yml 파일에서!
그러나 여전히 해결해야 할 중요한 문제가 남아 있습니다. 프로덕션에서 이 코드를 사용할 것이라고 가정하면 시스템 관리자 외에는 누구도 액세스할 수 없는 정보를 코드 자체에 포함시켰습니다. 별로 좋지 않습니다. 이론적으로 구성된 특정 가치 있는 정보에 대한 직접적인 참조를 제거하는 추가적인 추상화 계층이 있어야 합니다.
이제 Ruby 환경이 처음 실행될 때 환경 변수를 실제로 GET해야 합니다. 이 작업은 두 단계로 진행되지만 편안하다면 한 단계로 수행해도 됩니다. 먼저 Rails 프로젝트에서 DB 비밀을 직접 참조하는 것을 중단해야 합니다. 우리는 그렇게 하고 있습니다. 다음으로 Docker에서 Rails로 파이프해야 합니다. 마지막으로 잠재적인 실수로부터 이 정보를 더 잘 모호하게 하기 위해 Git에서 숨기고 있는 파일의 비밀 값을 추가하여 이를 더욱 추상화할 것입니다.
몇 가지 옵션이 있지만 저는 이러한 값이 저장되는 환경 파일을 만드는 것입니다. 팀과 함께 작업하는 경우 이 정보를 공용 인터넷에 공개할 위험 없이 보다 은밀한 조치(GPG 암호화가 일반적임)를 통해 이 파일을 공유할 수 있습니다. 얼마 전 Rails new를 실행할 때 생성되었을 가능성이 있는 .gitignore 파일을 살펴보면 프로젝트 루트에 .env로 시작하는 모든 파일에 대한 줄 항목이 있음을 알 수 있습니다. 이것이 바로 우리가 원하는 것입니다. git 추적에 추가되지 않지만 중요한 일급 비밀 정보를 일반 텍스트로 저장할 수 있는 비밀 파일입니다. 해보자:
path+=/opt/homebrew/bin
개발, 프로덕션 및 테스트 환경에 대해 서로 다른 환경 파일이 필요할 경우를 대비해 .dev 접미사를 추가했습니다. 새로 생성된 파일에 몇 가지 값을 추가해 보겠습니다.
$ mkdir my-app $ cd my-app
새 환경 파일을 실제로 사용하려면 docker-compose.yml 파일도 업데이트해야 합니다. 웹 서비스 아래에 다음을 추가합니다.
$ touch Dockerfile.dev $ touch docker-compose.yml $ touch Gemfile
그게 바로 그거예요! docker compose up으로 애플리케이션을 다시 시작하고 localhost:3000으로 이동하여 모든 것이 정상인지 확인하세요.
위 내용은 Docker 및 MySQL을 사용하여 새로운 Rails 애플리케이션 설정의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!