Ruby on Rails'inizi bir React ön uç uygulamasıyla Docker'lamak, geliştirme iş akışınızı ve dağıtım sürecinizi önemli ölçüde iyileştirebilir. Uygulamanız için standartlaştırılmış bir ortam oluşturarak farklı geliştirme, test, üretim aşamalarında ve hatta farklı sistemlerde tutarlı davranış sağlarsınız. Aslında sistem farklılıklarıyla ilgili sorunları en aza indirmek için tasarlanmıştır. Bu kılavuz, Rails ve React uygulamanızın Docker konteynerlerinde sorunsuz çalışmasını sağlamak için gerekli adımlarda size yol gösterecektir.
Uygulamanızı kurup oluşturduğunuzda belirli ortam yapılandırmaları gereklidir. Örneğin, sisteminizde Ruby ortamı kurulu olmadan bir Rails uygulamasını çalıştıramazsınız. Benzer şekilde, Node.js
olmadan bir React uygulamasını çalıştıramazsınız ve npm
veya Yarn
vb. gibi bir Node paket yöneticisi olmadan React paketlerini kuramazsınız.
Şimdi devam edelim ve Rails uygulamasını dockerize edelim. Bunu yapmak için Rails uygulamamızda üç dosyaya ihtiyacımız olacak: Dockerfile
, docker-compose.yml
ve bin/docker-entrypoint
. Bu dosyaların her birini ayrıntılı olarak inceleyelim.
Not:
Dockerfile
Docker kapsayıcısı oluşturmaya yönelik bir plandır. Docker'ın bir görüntü oluşturmak için kullandığı ve daha sonra kapsayıcıları çalıştırmak için kullanılabilecek bir dizi talimat içerir. Ruby on Rails ve React uygulaması için Dockerfile
parçalara ayıralım:
ARG RUBY_VERSION=3.1.4 FROM ruby:$RUBY_VERSION
ARG RUBY_VERSION=3.1.4
: Varsayılan değeri 3.1.4
olan RUBY_VERSION
adlı bir yapı bağımsız değişkenini tanımlar. Bu, derleme sırasında geçersiz kılınabilir.
FROM ruby:$RUBY_VERSION
: RUBY_VERSION
tarafından belirtilen sürüme sahip ruby
temel görüntüsünü kullanır. Bu, kabı Ruby çalışma zamanı ile ayarlar. Daha önce de belirttiğim gibi Rails uygulamasını çalıştırmak için Ruby'nin kurulu olması gerekir. RUN apt-get update -qq && \ apt-get install -y build-essential libvips bash bash-completion libffi-dev tzdata postgresql curl && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /usr/share/doc /usr/share/man
apt-get update -qq
: Depolardaki paket listesini, sessiz çıktı için -qq
ile günceller.
apt-get install -y
... : Çeşitli paketleri yükler: build-essential
: Yazılım oluşturmak için gerekli paketler (GCC gibi).
libvips
: Görüntü işleme için kütüphane.
bash
, bash-completion
: Bash kabuğu ve otomatik tamamlaması.
libffi-dev
: Yabancı İşlev Arayüzü kitaplığı.
tzdata
: Saat dilimi verileri.
postgresql
: PostgreSQL veritabanı istemcisi.
curl
: URL'lerden veri aktarma aracı.
apt-get clean
: Alınan paket dosyalarının yerel deposunu temizler.
rm -rf /var/lib/apt/lists/ /usr/share/doc /usr/share/man
: Görüntü boyutunu küçültmek için paket listelerini ve belgeleri kaldırır. RUN curl -fsSL //deb.nodesource.com/setup_current.x | bash - && \ apt-get install -y nodejs && \ curl -sS //dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb //dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update && \ apt-get install -y yarn
curl -fsSL //deb.nodesource.com/setup_current.x | bash -
: Node.js'yi yüklemek için NodeSource kurulum komut dosyasını indirir ve çalıştırır.
apt-get install -y nodejs
: Node.js'yi yükler.
curl -sS //dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
: Paketlerini doğrulamak için Yarn GPG anahtarını ekler.
echo "deb //dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
: Yarn'ın deposunu kaynaklar listesine ekler.
apt-get update && apt-get install -y yarn
: Paket listesini günceller ve Yarn'ı yükler. ENV NODE_OPTIONS=--openssl-legacy-provider
ENV NODE_OPTIONS=--openssl-legacy-provider
: Node.js için eski OpenSSL desteğini etkinleştirmek üzere bir ortam değişkeni ayarlar. WORKDIR /rails
WORKDIR /rails
: Sonraki talimatlar için çalışma dizinini /rails
olarak ayarlar. ARG RAILS_ENV ENV RAILS_ENV=$RAILS_ENV
ARG RAILS_ENV
: Rails ortamını ( development
, test
, production
gibi) belirtmek için RAILS_ENV
adlı bir yapı bağımsız değişkenini tanımlar.
ENV RAILS_ENV=$RAILS_ENV
: RAILS_ENV
ortam değişkenini yapı bağımsız değişkeninin değerine ayarlar. COPY Gemfile Gemfile.lock ./ RUN bundle install
COPY Gemfile Gemfile.lock ./
: Gemfile
ve Gemfile.lock
çalışma dizinine kopyalar.
RUN bundle install
: Gemfile
belirtilen Ruby gem'lerini yükler. COPY package.json yarn.lock ./ RUN yarn install --frozen-lockfile
COPY package.json yarn.lock ./
: package.json
ve yarn.lock
çalışma dizinine kopyalar.
RUN yarn install --frozen-lockfile
: Yarn kullanarak ön uç bağımlılıklarını yükler ve yarn.lock
tam sürümleri kullanmasını sağlar. COPY . .
COPY . .
: Tüm uygulama kodunu çalışma dizinine kopyalar. RUN bundle exec bootsnap precompile --gemfile app/ lib/
RUN bundle exec bootsnap precompile --gemfile app/ lib/
: Daha hızlı Rails uygulaması önyükleme süreleri için Bootsnap önbelleğini önceden derler. Bootsnap, pahalı hesaplamaları önbelleğe alarak Ruby ve Rails'in önyükleme sürelerini hızlandıran bir mücevherdir. RUN if [ "$RAILS_ENV" = "production" ]; then \ SECRET_KEY_BASE=1 bin/rails assets:precompile; \ fi
RUN if [ "$RAILS_ENV" = "production" ]; then
... : Yalnızca RAILS_ENV
production
olarak ayarlandığında koşullu olarak varlık ön derlemesini çalıştırır. Bu adım, varlıkları üretim ortamına hazırlamak için çok önemlidir. COPY bin/docker-entrypoint /rails/bin/ RUN chmod +x /rails/bin/docker-entrypoint
COPY bin/docker-entrypoint /rails/bin/
: Özel bir giriş noktası komut dosyasını konteynere kopyalar.
RUN chmod +x /rails/bin/docker-entrypoint
: Giriş noktası betiğini çalıştırılabilir hale getirir. ENTRYPOINT ["/rails/bin/docker-entrypoint"] EXPOSE 5000 // you can use any port of your choice CMD ["./bin/rails", "server"]
ENTRYPOINT ["/rails/bin/docker-entrypoint"]
: Konteyner başlatıldığında çalışacak giriş noktası komut dosyasını ayarlar. Bu komut dosyası genellikle ortamı ayarlar, veritabanını hazırlar ve uygulamayı başlatır.
EXPOSE 5000
: Kabın 5000 numaralı bağlantı noktasını dinlediğini belirtir. Bu bir belgeleme özelliğidir ve bağlantı noktasını yayınlamaz.
CMD ["./bin/rails", "server"]
: Container başlatıldığında çalıştırılacak varsayılan komutu belirtir; bu, Rails sunucusunu başlatır. docker-compose.yml
dosyası, çok kapsayıcılı Docker uygulamalarını tanımlamak ve çalıştırmak için kullanılır. Uygulamanızın hizmetlerini, ağlarını ve birimlerini tek bir dosyada yapılandırmanıza olanak tanır. Bu durumda iki servis kullanacağız. Rails uygulaması için docker-compose.yml
dosyası:
db
) codedb: image: postgres:14.2-alpine container_name: demo-postgres-14.2 volumes: - postgres_data:/var/lib/postgresql/data command: "postgres -c 'max_connections=500'" environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} ports: - "5432:5432"
image: postgres:14.2-alpine
: Bu hizmet için kullanılacak Docker görüntüsünü belirtir. Bu durumda, Alpine Linux dağıtımını temel alan PostgreSQL 14.2 görüntüsüdür. Alp görüntüleri, genel görüntü boyutunun küçük tutulmasına yardımcı olabilecek küçük boyutlarıyla bilinir.
container_name: demo-postgres-14.2
: Container'ı demo-postgres-14.2
adlandırır. Bu ad, komutlarda ve günlüklerde kapsayıcıya başvuruda bulunmak için kullanılır.
volumes
: postgres_data:/var/lib/postgresql/data:
Kabın içindeki postgres_data
adlı bir birimi /var/lib/postgresql/data
bağlar. Bu dizin, PostgreSQL'in verilerini depoladığı yerdir ve konteyner yeniden başlatmaları arasında veritabanı verilerinin korunmasını sağlar.
command: "postgres -c 'max_connections=500'"
: PostgreSQL görüntüsünün varsayılan komutunu geçersiz kılar. Maksimum bağlantı sayısını 500'e çıkarmak için PostgreSQL'i bir yapılandırma seçeneğiyle başlatır.
environment
: POSTGRES_DB: ${POSTGRES_DB}
: POSTGRES_DB
ortam değişkenini kullanarak oluşturulacak varsayılan veritabanının adını ayarlar.
POSTGRES_USER: ${POSTGRES_USER}
: POSTGRES_USER
ortam değişkenini kullanarak PostgreSQL veritabanına erişim için varsayılan kullanıcı adını ayarlar.
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
: POSTGRES_PASSWORD
ortam değişkenini kullanarak varsayılan kullanıcı için parolayı ayarlar.
ports
:"5432:5432"
: Ana bilgisayardaki 5432 numaralı bağlantı noktasını kapsayıcıdaki 5432 numaralı bağlantı noktasıyla eşler. Bu, ana makinedeki PostgreSQL'e 5432 numaralı bağlantı noktası aracılığıyla erişime izin verir.demo-web
) codedemo-web: build: context: . args: - RAILS_ENV=${RAILS_ENV} command: "./bin/rails server -b 0.0.0.0" environment: - RAILS_ENV=${RAILS_ENV} - POSTGRES_HOST=${POSTGRES_HOST} - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - RAILS_MASTER_KEY=${RAILS_MASTER_KEY} volumes: - .:/rails - app-storage:/rails/storage depends_on: - db ports: - "3000:3000"
build:
context: .
: Docker görüntüsünün derleme bağlamını belirtir. Bu durumda, .
geçerli dizini ifade eder. Bu, Docker'ın görüntüyü oluşturmak için geçerli dizindeki Docker dosyasını kullanacağı anlamına gelir.args
: RAILS_ENV=${RAILS_ENV}
: RAILS_ENV
derleme bağımsız değişkenini Docker derleme sürecine ileterek Rails ortamını ( development
, test
veya production
gibi) belirtmenize olanak tanır.
command: "./bin/rails server -b 0.0.0.0"
: Docker görüntüsünün varsayılan komutunu geçersiz kılar. Rails sunucusunu başlatır ve hizmetin konteynerin dışından erişilebilir olması için gerekli olan tüm ağ arayüzlerine ( 0.0.0.0
) bağlar.
environment:
RAILS_ENV=${RAILS_ENV}
: RAILS_ENV
ortam değişkenini kullanarak konteynerin içindeki Rails ortamını ayarlar.
POSTGRES_HOST=${POSTGRES_HOST}
: PostgreSQL ana bilgisayar adresini ayarlar.
POSTGRES_DB=${POSTGRES_DB}
: Veritabanı adını ayarlar.
POSTGRES_USER=${POSTGRES_USER}
: PostgreSQL kullanıcısını ayarlar.
POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
: PostgreSQL kullanıcı şifresini ayarlar.
RAILS_MASTER_KEY=${RAILS_MASTER_KEY}
: Kimlik bilgilerini ve diğer sırları şifrelemek için kullanılan Rails ana anahtarını ayarlar.
volumes
:
.:/rails
: Geçerli dizini ( docker-compose.yml
dosyasının bulunduğu yer) konteynerin içindeki /rails
dizinine bağlar. Bu, ana makinenizdeki dosyaları düzenlemenize ve bu değişikliklerin kapsayıcının içine yansıtılmasına olanak tanır.
app-storage:/rails/storage
: Adlandırılmış bir birim app-storage
alanını konteynerin içindeki /rails/storage
bağlar. Bu genellikle günlükler, yüklemeler ve önbelleğe alınmış dosyalar gibi Rails'e özgü dosyaları depolamak için kullanılır.
depends_on
:
db
: demo-web
hizmetinin başlamadan önce db
hizmetinin hazır olmasını beklemesini sağlar. Docker Compose, hizmetlerin başlatılması sırasını bu ayara göre yönetir. ports:
"3000:3000"
: Ana bilgisayardaki 3000 numaralı bağlantı noktasını kapsayıcıdaki 3000 numaralı bağlantı noktasıyla eşler. Bu, ana makinedeki Rails uygulamasına 3000 numaralı bağlantı noktası üzerinden erişmenizi sağlar. codevolumes: postgres_data: app-storage:
postgres_data
: PostgreSQL verilerini sürdürmek için db
hizmeti tarafından kullanılan postgres_data
adlı adlandırılmış birimi tanımlar.app-storage
: Yüklemeler ve günlükler gibi uygulamaya özel verileri sürdürmek için demo-web
hizmeti tarafından kullanılan adlandırılmış birim app-storage
tanımlar. bin/docker-entrypoint
betiği, Docker kurulumunun çok önemli bir parçasıdır. Kap başlatıldığında yürütülür ve genellikle ortam kurulumunu, veritabanı hazırlığını ve ana uygulamayı başlatmadan önce gereken diğer başlatma görevlerini yerine getirir. Aşağıda örnek bir bin/docker-entrypoint
betiği ve her parçanın ayrıntılı bir açıklaması verilmiştir:
bashCopy code#!/bin/bash set -e
#!/bin/bash
: Bu satır, betiğin Bash kabuğu kullanılarak çalıştırılması gerektiğini belirtir.
set -e
: Bu, herhangi bir komutun sıfırdan farklı bir çıkış kodu döndürmesi durumunda komut dosyasına hemen çıkması talimatını verir. Bu, herhangi bir adımın başarısız olması durumunda komut dosyasının yürütmeyi durdurmasını sağlamaya yardımcı olur ve bu da sonraki adımların geçersiz bir durumda çalışmasını önleyebilir.
Koşullu Veritabanı Oluşturma veya Taşıma
# If running the rails server then create or migrate existing database if [ "${*}" == "./bin/rails server" ]; then ./bin/rails db:create ./bin/rails db:prepare fi
"${*}"
) iletilen komutun ./bin/rails server
olup olmadığını kontrol eder. *
betiğe iletilen tüm konumsal parametreleri tutan özel bir parametredir.
./bin/Rails db
: Koşul karşılanırsa bu komut veritabanını oluşturmaya çalışacaktır. Veritabanını, veritabanı yapılandırma dosyasında ( config/database.yml
) tanımlandığı şekilde ayarlayan rails db:create
çalıştırmaya eşdeğerdir.
./bin/Rails db
: Bu komut, veritabanının kurulmasını ve taşınmasını sağlayan rails db:prepare
komutunu çalıştıracaktır. Eğer mevcut değilse veritabanını oluşturacak ve veritabanı zaten oluşturulmuşsa geçişleri çalıştıracaktır. Bu rails db:create
ve rails db:migrate
öğelerinin birleşimidir.
bashCopy codeexec "${@}"
exec "${@}"
: Bu, mevcut kabuk işlemini, betiğe argüman olarak iletilen komutla değiştirir. @
sembolü, betiğe aktarılan tüm konumsal parametreleri tutar. Örneğin, komut dosyası ./bin/rails server
ile çağrılırsa, bu satır, konteynerin ana işlemi olarak ./bin/rails server
etkili bir şekilde çalıştırır. İyi hazırlanmış bir Dockerfile
Ruby on Rails ve React uygulamanız için güvenilir ve tutarlı bir ortam oluşturmak açısından çok önemlidir. Temel görüntüyü tanımlayarak, ortam değişkenlerini ayarlayarak ve bağımlılıkları yükleyerek uygulamanızın çeşitli ortamlarda sorunsuz çalışmasını sağlarsınız.
Dockerfile
, docker-compose.yml
ve bin/docker-entrypoint
için Tam Komut Dosyası ARG RUBY_VERSION=3.1.4 FROM ruby:$RUBY_VERSION # Install dependencies RUN apt-get update -qq && \ apt-get install -y build-essential libvips bash bash-completion libffi-dev tzdata postgresql curl && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /usr/share/doc /usr/share/man # Install Node.js and Yarn RUN curl -fsSL //deb.nodesource.com/setup_current.x | bash - && \ apt-get install -y nodejs && \ curl -sS //dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb //dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update && \ apt-get install -y yarn # Set environment variable to enable legacy OpenSSL support ENV NODE_OPTIONS=--openssl-legacy-provider # Rails app lives here WORKDIR /rails # Set environment variable for the build ARG RAILS_ENV ENV RAILS_ENV=$RAILS_ENV # Install application gems COPY Gemfile Gemfile.lock ./ RUN bundle install # Install frontend dependencies COPY package.json yarn.lock ./ RUN yarn install --frozen-lockfile # Copy application code COPY . . # Precompile bootsnap code for faster boot times RUN bundle exec bootsnap precompile --gemfile app/ lib/ # Precompiling assets for production without requiring secret RAILS_MASTER_KEY RUN if [ "$RAILS_ENV" = "production" ]; then \ SECRET_KEY_BASE=1 bin/rails assets:precompile; \ fi # Entrypoint prepares the database. COPY bin/docker-entrypoint /rails/bin/ RUN chmod +x /rails/bin/docker-entrypoint # Use an absolute path for the entry point script ENTRYPOINT ["/rails/bin/docker-entrypoint"] # Start the server by default, this can be overwritten at runtime EXPOSE 5000 CMD ["./bin/rails", "server"]
services: db: image: postgres:14.2-alpine container_name: demo-postgres-14.2 volumes: - postgres_data:/var/lib/postgresql/data command: "postgres -c 'max_connections=500'" environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} ports: - "5432:5432" demo-web: build: context: . args: - RAILS_ENV=${RAILS_ENV} command: "./bin/rails server -b 0.0.0.0" environment: - RAILS_ENV=${RAILS_ENV} - POSTGRES_HOST=${POSTGRES_HOST} - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - RAILS_MASTER_KEY=${RAILS_MASTER_KEY} volumes: - .:/rails - app-storage:/rails/storage depends_on: - db ports: - "3000:3000" volumes: postgres_data: app-storage:
#!/bin/bash set -e # If running the rails server then create or migrate existing database if [ "${*}" == "./bin/rails server" ]; then ./bin/rails db:create ./bin/rails db:prepare fi exec "${@}"