Rails6+Nginx+MySQL의 Docker 개발 환경을 자동으로 구축하는 셸 스크립트를 만들어 보았습니다.

15193 단어 DockerRails

입문


제목과 같이 Rails6는 Docker의 컨테이너에서 실행됩니다.
나는 개발 환경을 자동으로 구축할 수 있는 케이스 스크립트를 만들어 보았다.
폴더 및 Docker 파일도 스크립트에서 생성
Docker와 docker-compose를 가져오면 어떤 환경에서도 명령으로 구축할 수 있다고 생각합니다.
(대략...)
내 자신의 환경은 다음과 같다.
OS
환경
Windows 10 Home 64bit
Ubuntu 18.04(WSL2)

구축할 환경


다음 설정은docker에서 실행되며, 목표는 로컬에서 초기 화면을 볼 수 있는 것입니다.
항목
활용단어참조
버전
언어
ruby
2.6.6
프레임 구조
rails
6.0.2
데이터베이스
MySQL
8.0
네트워크 서버
Nginx
1.17.10
AP 서버
puma
4.3.5
용기 구조는 다음과 같다.
앱 컨테이너
ruby
rails
puma
db 용기
MySQL
웹 용기
Nginx

할 수 있는 일


나는 먼저 실제로 할 수 있는 일을 제시한 후에 내용을 기재하고 싶다.

케이스 내용


이번에 제작된 케이스 각본은 다음과 같다.
길기 때문에 GitHub를 드리는 게 좋을 것 같은데 여기 많이 적어놨어요(^^;
docker_rails_template.sh
#!/bin/bash

####################################################
# 以下環境をdockerで構築するためのシェルスクリプト     #
# プログラミング言語:Ruby / Ruby on rails           #
# データベース      :mysql                          #
# webサーバ         :Nginx                         #
####################################################

RUBY_VERSION="2.6.6"
RAILS_VERSION="6.0.2"
MYSQL_VERSION="8.0"
NGINX_VERSION="1.17.10"
APP_ADDLESS="app"

if [ $# != 1 ]; then
  echo "引数の指定が間違っています。"
  echo "ex: $0 sample"
  exit 1
fi

APP_NAME=$1
APP_DIR=`pwd`/${APP_NAME}

# 作業フォルダを作成
echo "----- Make working directories -----"
echo "mkdir -p ${APP_DIR}"
mkdir -p ${APP_DIR}
cd ${APP_DIR}
echo ""

# Dockerfile 配置用のフォルダを作成
echo "----- Make docker directories -----"
echo "mkdir -p docker/app"
mkdir -p docker/app
echo "mkdir -p docker/web"
mkdir -p docker/web
echo ""

# ソースコード配置用のフォルダを作成
echo "----- Make source directories -----"
echo "mkdir -p src/tmp/sockets"
mkdir -p src/tmp/sockets
echo ""

# 各種ファイル作成
echo "----- Make source directories -----"
# app用のDockerfile 作成
echo "make app Dockerfile"
cat << EOF > docker/app/Dockerfile
FROM ruby:${RUBY_VERSION}
RUN apt-get update -y && apt-get install -y default-mysql-client nodejs npm && \
    npm install -g -y yarn
RUN mkdir /myapp
WORKDIR /myapp
COPY ./src/Gemfile Gemfile
COPY ./src/Gemfile.lock Gemfile.lock
RUN bundle install
COPY ./src /myapp
EOF

# web用のDockerfile 作成
echo "make web Dockerfile"
cat << EOF > docker/web/Dockerfile
FROM nginx:${NGINX_VERSION}
RUN rm -f /etc/nginx/conf.d/*
COPY ./docker/web/${APP_NAME}.conf /etc/nginx/conf.d/${APP_NAME}.conf
CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
EOF

# Gemfile 作成
echo "make Gemfile"
cat << EOF > src/Gemfile
source 'https://rubygems.org'
gem 'rails', '${RAILS_VERSION}'
EOF

# Gemfile.lock 作成
echo "make Gemfile"
touch ${APP_DIR}/src/Gemfile.lock

# nginx.conf 作成
echo "make ${APP_NAME}.conf"
cat << EOF > docker/web/${APP_NAME}.conf
upstream ${APP_NAME} {
  server unix:///myapp/tmp/sockets/puma.sock;
}

server {
  listen 80;

  server_name ${APP_ADDLESS};

  access_log /var/log/nginx/access.log;
  error_log  /var/log/nginx/error.log;

  root /myapp/public;

  client_max_body_size 100m;
  error_page 404             /404.html;
  error_page 505 502 503 504 /500.html;
  try_files  \$uri/index.html \$uri @${APP_NAME};
  keepalive_timeout 5;

  location @${APP_NAME} {
    proxy_set_header X-Real-IP \$remote_addr;
    proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
    proxy_set_header Host \$http_host;
    proxy_pass http://${APP_NAME};
  }
}
EOF

# docker-compose.yml 作成
echo "make docker-compose.yml"
cat << EOF > docker-compose.yml
version: '3'

volumes:
  db_data:

services:
  db:
    image: mysql:${MYSQL_VERSION}
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - db_data:/var/lib/mysql
    ports:
      - 3306:3306

  app:
    build:
      context: .
      dockerfile: ./docker/app/Dockerfile
    command: bundle exec puma -C config/puma.rb
    volumes:
      - ./src:/myapp
    depends_on:
      - db

  web:
    build:
      context: .
      dockerfile: ./docker/web/Dockerfile
    volumes:
      - ./src/public:/myapp/public
      - ./src/tmp:/myapp/tmp
    ports:
      - 80:80
    depends_on:
      - app

EOF

echo ""

# rails new 実行
echo "----- Set application -----"
echo "docker-compose run app rails new . --force --database=mysql"
docker-compose run app rails new . --force --database=mysql

# database.yml を編集
echo "edit database.yml"
cat src/config/database.yml | sed 's/password:$/password: password/' | sed 's/host: localhost/host: db/' > __tmpfile__
cat __tmpfile__ > src/config/database.yml
rm __tmpfile__

# puba.rb を編集
cat << EOF > src/config/puma.rb
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i
threads threads_count, threads_count
port        ENV.fetch("PORT") { 3000 }
environment ENV.fetch("RAILS_ENV") { "development" }
plugin :tmp_restart

app_root = File.expand_path("../..", __FILE__)
bind "unix://#{app_root}/tmp/sockets/puma.sock"

stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true
EOF

echo ""

echo "----- container start -----"
# イメージをビルド
echo "docker-compose build"
docker-compose build

# 初回マイグレーション
echo "docker-compose run app rails db:create"
docker-compose run app rails db:create

# 一度コンテナをリセット
echo "docker-compose down"
docker-compose down

# コンテナ起動
 echo "docker-compose up"
 docker-compose up

실행 결과


적절한 위치에서 다음 명령을 수행합니다.
매개 변수로 전달sample은 만들고 싶은 응용 프로그램의 이름입니다.
sudo ./docker_rails_template_ver1.0.sh sample
완성하는데 10분 정도 걸립니다.
다음 상태일 때 완료합니다.
app_1  | * Listening on tcp://0.0.0.0:3000
app_1  | * Listening on unix:///myapp/tmp/sockets/puma.sock
app_1  | Use Ctrl-C to stop
브라우저에서localhost에 접근해 보십시오.
그냥 rails라면 ポート3000 방문이 많아요.
이번에는 웹 서버(Nginx), ポート80를 통해 받아들여지기 때문에 포트를 지정하지 않고 접근할 수 있습니다.

잘 나오면 완성이야.
다만, 버전을 조금만 만지면 어디서 넘어질 수 있으니 주의하세요.
이런 상황에서는 성실하게 일할 수밖에 없다...(^^;

셸 내용 정보


셸 스크립트에 댓글을 달았지만 내부에서 진행된 일을 보충하고 싶습니다.
보충할 수 없는 부분과 상세한 처리 내용을 신경 쓰는 사람은 최하부에 열거한 참고 보도를 참조하세요.

폴더 계층


호스트 측 폴더 계층은 다음과 같습니다.
루트 디렉토리에 배치된 docker-compose.yml 에서 dockerフォルダ 에 속하는 Dockerfile을 찾아 컨테이너 생성 등을 수행합니다.
이 밖에 rails의 원본 코드는 src에 저장되어 있다.
src 폴더는 앱 컨테이너와의 공유 볼륨으로 사용됩니다.
sample
├── docker
│   ├── app
│   │   └── Dockerfile
│   └── web
│       └── Dockerfile
├── docker-compose.yml
└── src

src 폴더 생성 정보

# ソースコード配置用のフォルダを作成
echo "----- Make source directories -----"
echo "mkdir -p src/tmp/sockets"
mkdir -p src/tmp/sockets
echo ""
src 폴더 생성 중 src/tmp/sockets까지 폴더를 만드는 이유를 추가합니다.
응용 서버는 puma 를 사용하지만,puma가 시작될 때 src/tmp/sockets/puma.sock 파일을 자동으로 생성합니다.
하지만 자동으로 생성될 때 폴더 차원이 생성되지 않기 때문에 미리 만들었습니다.

응용 프로그램 Docker 파일 정보

ruby + rails6 + puma의 컨테이너용 Docker 파일입니다.rails6 반드시 설치webpacker해야 하며, 이와 동시에 yarn가 필요합니다. 주의하십시오.

nginx.conf 생성 정보


Nginx용 설정 파일이 됩니다.
upstrem에서 찍은 사진///myapp/tmp/sockets/puma.sock은 앱 용기 내의puma와 합작한 부분이다.
웹 용기ポート80에서 요청을 받아 앱 용기에 연결합니다.

docker-compose.yml 생성 정보


docker-compose에서 데이터베이스 용기, 앱 용기, 웹 용기를 조작하는 데 사용되는 파일입니다.
db 용기/var/lib/mysql에서docker의local 볼륨db_data을 영구 볼륨으로 마운트합니다.
비밀번호가 번거롭기 때문에 "password"로 고정합니다.
앱 컨테이너/myapp 마운트 호스트 측면src.
시작할 때마다 다음 명령으로 웹 용기를 받아들이기 시작합니다.
bundle exec puma -C config/puma.rb
동시에db용기depends_on와 관련됩니다.
웹 용기src 내 폴더를 불러옵니다. 기본 디스플레이용 html와 콘센트 통신용puma입니다.앱 용기와 sock을 공유합니다.
포트 수락 80.

후속 처리 정보


이후 실행rails new, 생성된 파일을 편집한 후 이미지 구축 → 용기 실행.(잡다)src 호스트 측에서 응용 프로그램의 원본을 편집할 수 있기 때문에 매번 이미지 구축을 할 필요가 없고 개발 환경에 사용할 수 있다.
위에서 말한 바와 같이 참고할 만한 것이 있으면 좋겠다.

참고문


아래의 보도를 참고하도록 허락해 주십시오.감사합니다 m(__)m
지나치게 신중한 Docker-compose를 사용하여 rails5+MySQL on Docker 환경(Docker for Mac)을 구축합니다.
Rails+PostgreSQL+Docker+AWS에서 생성된 포트폴리오 정보
docker-compose 명령 요약

좋은 웹페이지 즐겨찾기