![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
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.
Docker, uygulamanın nerede konuşlandırıldığına (bir geliştiricinin makinesinde, bir test ortamında veya bir üretim sunucusunda) bakılmaksızın aynı şekilde çalışmasını sağlar. Bu tutarlılık, tüm bağımlılıkların ve konfigürasyonların kapsayıcı hale getirilmesiyle elde edilir.
Docker kapsayıcıları, uygulamanın çalışması için gerekli tüm bağımlılıkları içerir. Bu, sistem kitaplıklarındaki değişikliklerin veya farklı sistemlerdeki eksik bağımlılıkların uygulamanın işlevselliğini etkilemediği anlamına gelir.
Docker konteynerleri birbirlerinden ve ana sistemden yalıtılmış olarak çalışır. Bu izolasyon, farklı uygulamalar arasındaki çakışmaları ve bunların aynı sisteme bağımlılıklarını önler.
Not: Docker sözdizimi bilgisi gereklidir
Dockerizasyon iki temel kavramı içerir: görüntüler ve kapsayıcılar. Görüntüler, bağımlılıklar ve dağıtım yapılandırmaları da dahil olmak üzere bir kapsayıcı oluşturmak için gerekli tüm bilgileri içeren kapsayıcılar için plan görevi görür. Konteyner, görüntünün kendisinden, yürütme ortamından ve çalışma zamanı talimatlarından oluşan bir görüntünün çalışma zamanı örneğidir. Docker genel olarak nakliye yazılımı için bir standart oluşturur.
Docker'ı basit bir benzetmeyle açıklamak gerekirse; konteynerleri bir avludaki nakliye konteynerleri, görselleri bu konteynerlerin içine yerleştirilen öğeler ve nakliye gemisini ise konteynerlerin üzerinde çalıştığı sistem olarak düşünün.
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.
Container, kullanıcının sisteminden izole olarak çalıştığı için, tüm bu paketleri tıpkı doğrudan sistemimiz üzerine kurduğumuzda yaptığımız gibi, Container'ımızda kullanılabilir hale getireceğiz, böylece Container, onun üzerinde bir sistem gibi hareket edecek. sanal bir makine gibi kendinize ait. Docker ve sanal makine arasında farklar vardır ancak bu örnek sadece daha fazla açıklama amaçlıdır.
Ş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: Docker sözdizimi bilgisi gereklidir
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 https://deb.nodesource.com/setup_current.x | bash - && \ apt-get install -y nodejs && \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update && \ apt-get install -y yarn
curl -fsSL https://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 https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
: Paketlerini doğrulamak için Yarn GPG anahtarını ekler.
echo "deb https://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.
Docker yalnızca geliştirme sürecinizi kolaylaştırmakla kalmaz, aynı zamanda üretimdeki uygulamanızın güvenilirliğini de artırır. Optimizasyon alanları mevcut ancak bu, Rails uygulamasının nasıl dockerize edileceğine dair genel bir bakış.
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 https://deb.nodesource.com/setup_current.x | bash - && \ apt-get install -y nodejs && \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://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 "${@}"