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.ymldosyaya 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-serverikincisi node-appve 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.ymldosyanın bunu gibi ilk satırı başlatmak isteyeyim:
version: '3'
Bu, Docker'a docker-composekullanmak 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 8081kapsayı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.ymlDosyanı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-composeherhangi 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.ymlProjenize ö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-serverve bu bağlantıyı çalışan kapsayıcıya yeniden yönlendirecektir.
Tüm zaman boyunca, Dockerfilesadece bunu içerir:
FROM node:alpine
WORKDIR '/app'
COPY /package.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
Bu nedenle, docker run myimagedosyanı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 upve Docker geçerli çalışma dizinine bakacak ve docker-compose.ymldosya içinde.
Önce docker-compose.ymlbiz iki ayrı komutlarla uğraşmak zorunda kaldı docker build .ve docker run myimageancak içinde docker-composedü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-composebirden 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 -dve bunları durdurmak için yapabilirsiniz docker-compose down.