docker-compose, docker-cli ile yapmanız gereken bir ton komut yazmak zorunda kalmanızı sağlar.
docker-compose aynı zamanda birden fazla kapsayıcıyı aynı anda başlatmayı ve bunları bir ağ türüyle otomatik olarak birbirine bağlamayı kolaylaştırır.
Docker-compose'un amacı, docker cli olarak işlev görmektir, ancak birden çok komutu çok daha hızlı bir şekilde vermektir.
Docker-compose'den yararlanmak için, daha önce çalıştırdığınız komutları bir docker-compose.yml
dosyaya kodlamanız gerekir .
Sadece onları yaml dosyasına yapıştırmakla kalmayacaksınız, özel bir sözdizimi var.
Oluşturulduktan sonra, docker-compose cli'ye beslemeniz gerekir ve dosyayı ayrıştırmak ve belirttiğimiz doğru yapılandırmayla tüm farklı kapları oluşturmak klibe bağlıdır.
Böylece ayrı kapsayıcılarınız olacak, diyelim ki biri diğeri redis-server
ikincisi node-app
ve Dockerfile
şu anki dizininizdeki kullanılarak yaratılmasını istiyorsunuz .
Ayrıca, bu kapsayıcıyı yaptıktan sonra, içinde çalışan her şeye erişmek için kapsayıcıdan yerel makineye bir bağlantı noktası eşlersiniz.
Yani için docker-compose.yml
dosyanın bunu gibi ilk satırı başlatmak isteyeyim:
version: '3'
Bu, Docker'a docker-compose
kullanmak istediğiniz sürümü söyler . Bundan sonra şunları eklemelisiniz:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
Lütfen girintiye dikkat edin, çok önemli. Ayrıca, bir hizmet için bir resim alıyorum, ancak başka bir hizmet için söylüyorumdocker-compose
için ikinci kapsayıcı için kullanılacak görüntüyü oluşturmak için geçerli dizinin içine bakmak .
Ardından, bu kapsayıcıda açmak istediğiniz tüm farklı bağlantı noktalarını belirtmek istersiniz.
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
-
Lütfen tire işaretini, yaml dosyasındaki tire diziyi nasıl belirlediğimize dikkat edin. Bu örnekte 8081
, yerel makinemde 8081
kapsayıcıya şu şekilde eşleme yapıyorum :
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "8081:8081"
Yani ilk port yerel makineniz, diğeri konteynırdaki porttur, karışıklığı önlemek için ikisi arasında ayrım yapabilirsiniz:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "4001:8081"
docker-compose.yml
Dosyanızı bu şekilde geliştirerek, bu kapsayıcıları esas olarak aynı ağ üzerinde oluşturacak ve birbirleriyle istedikleri şekilde iletişim kurmak ve istedikleri kadar bilgi alışverişinde bulunmak için ücretsiz erişime sahip olacaklar.
İki kap kullanılarak oluşturulduğunda docker-compose
herhangi bir bağlantı noktası bildirimine ihtiyacımız yoktur.
Şimdi örneğimde, Nodejs uygulamasında şuna benzer bir kod yapılandırması yapmamız gerekiyor:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server'
});
Bu örneği, aşağıdakilere ek olarak yapmanız gereken belirli bir yapılandırma olabileceğini bildirmek için kullanıyorum. docker-compose.yml
Projenize özel olabilecek dosyaya .
Şimdi, kendinizi bir Nodejs uygulamasıyla çalışırken bulursanız ve Nodejs'in kullandığı varsayılan bağlantı noktasının farkında olduğunuzdan emin olmak istiyorsanız, bunu ekleyeceğim:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server',
port: 6379
});
Docker, Düğüm uygulamasının aradığını görecek redis-server
ve bu bağlantıyı çalışan kapsayıcıya yeniden yönlendirecektir.
Tüm zaman boyunca, Dockerfile
sadece bunu içerir:
FROM node:alpine
WORKDIR '/app'
COPY /package.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
Bu nedenle, docker run myimage
dosyanın içindeki tüm kapsayıcıların veya hizmetlerin bir örneğini oluşturmak için çalıştırmanız gerekmeden , bunun yerine çalıştırabilirsiniz docker-compose up
ve Docker geçerli çalışma dizinine bakacak ve docker-compose.yml
dosya içinde.
Önce docker-compose.yml
biz iki ayrı komutlarla uğraşmak zorunda kaldı docker build .
ve docker run myimage
ancak içinde docker-compose
dünyada size yazmak resimlerinizi yeniden istiyorsanız docker-compose up --build
. Bu, Docker'a kapları yeniden başlatmasını ancak en son değişiklikleri almak için yeniden oluşturmasını söyler.
Böylece docker-compose
birden fazla kapla çalışmayı kolaylaştırır. Bir dahaki sefere bu kapsayıcı grubunu arka planda başlatmanız gerektiğinde docker-compose up -d
ve bunları durdurmak için yapabilirsiniz docker-compose down
.