Docker Container'ları Nasıl Bağlanır?
"Kapsayıcı nedir?" dockerdocs aşağıdaki göstermek şık bir görüntü:
Senaryom için yalnızca Uygulama A ve Uygulama B'ye sahibim; onlara Alice ve Bob'u atayalım. Alice ve Bob genel olarak ve özellikle nasıl iletişim kurar? Somut olarak kullanıyorum, KISS prensibi kullanarak MySQLve BaseXliman işçilerinin göbekten.
Ana xquerybilgisayarda bulunan ve daha sonra BaseXçalıştırılmak üzere konteynere gönderilen bir dosya kavramı . Bu spesifik sorgu aslında SQL, bu nedenle MySQLsonuç için konteynerin sorgulanması gerekecektir.
Bu, bağlantı noktası yönlendirme veya diğer ağ oluşturma yaklaşımlarını gerektiriyor mu? Ciltler? Bu , sırasıyla ve öğelerinden oluşan ek bir oluşturma dosyası gerektiriyor mu ?MySQLBaseX
Şüphesiz pek çok olası yaklaşım vardır. Öğrenme perspektifinden bakıldığında en pragmatik olan nedir? Kademeli bir öğrenme eğrisi ile kavramsal olarak hafif.
Bir yaklaşım , köprü ağını kullanıyor gibi görünüyor:
Kapların birbirini görebilmesinden yararlanarak .
Bu benim görünmüyor ilgili hiç RESTful web hizmetleri.
İlgili sorulara bakıldığında, bu ters bir proxy'ye dokunabilir.
Yanıtlar
Ben de Docker oyununda oldukça yeniyim, ancak tam olarak sizin sorduğunuz şeyi yaptığım birkaç küçük projem var. Deneme ve yanılma konusundaki kendi deneyimime dayanarak (çoğunlukla hata ...) ağınız statik dahili IP'lere ayarlanmış bir docker-compose.yml kullanmanızı öneririm, böylece her bir konteyner öngörülebilir, tekrarlanabilir sonuçlar ve konteynerlerinizi yapılandırabileceğiniz IP'lere sahip olur. iletişim kurmak için.
Aşina değilim, BaseXancak version: "3.7"burada docker-compose kullanarak birden fazla uygulamayı kolayca çalıştırabilen ve / veya varsayımınıza uyacak şekilde eklenebilen veya yeniden tasarlanabilen örnek bir durumum var .
Bu örnek docker-compose aşağıdaki özelliklere sahiptir:
app-volumeHacmi halka açık bir GitHub deposunun içeriğiyle doldurmak için ayrı bir kap .~ / Dockerbuild dizinindeki bir Dockerfile'dan oluşturulan "seçici arka uç" için etkinleştirilmiş PHP-FPM'ye sahip bir Apache Web Sunucusu kapsayıcısı.
PHP'nin Apache'ye geçirilmesi için her şeyin ters proxy'si olarak kullanılan bir nginx web sunucusu konteyneri (ancak hemen hemen her şeyi hizmet eder ve önbelleğe alır).
Uygulama oluşturulduktan sonra bir mysqldump dosyasıyla doldurduğum uygulama DB'si için karışımdaki bir MariaDB kapsayıcısı.
Bu, docker-compose.yml uygulamamın inceltilmiş bir sürümüdür, bu nedenle ihtiyaçlarınıza uygun healthcheck:ve command:buna benzer çeşitli şeyler ekleyebileceğinizi unutmayın .
Sen ile yürütmek docker-compose up -d --buildhem yapı ve tek bir komut uygulamanızı başlatmak (ama muhtemelen o önemli rötuşları için çok sonradan çalıştırması kendi ba (.sh) dosyası oluşturmak istersiniz).
Dikkat edin static-network. Örnekte adlandırılmış ciltleri kullanırken, bu sadece benim tercihim.
version: "3.7"
services:
github_repo_clone:
image: debian:latest
container_name: github_repo_clone
networks:
static-network:
ipv4_address: 172.20.0.254
command: bash -c "
apt-get update &&
apt-get install git -y &&
rm -rf examplerepo &&
git clone https://github.com/exampleuser/examplerepo.git &&
rm -rf /var/www/vhosts/exampleuser/examplerepo &&
mkdir -p /var/www/vhosts/exampleuser/examplerepo &&
cp -rapv examplerepo/* /var/www/vhosts/exampleuser/examplerepo &&
rm -rf examplerepo &&
tail -f /dev/null
"
volumes:
- app-volume:/var/www/vhosts
apache_php-fpm_backend:
container_name: debian-build-demo0
build: ~/dockerbuild
ports:
- "8080:8080"
networks:
static-network:
ipv4_address: 172.20.0.2
volumes:
- app-volume:/var/www/vhosts
nginx_rp:
image: nginx:latest
container_name: nginx-build-demo0
ports:
- "80:80"
- "443:443"
networks:
static-network:
ipv4_address: 172.20.0.3
volumes:
- app-volume:/var/www/vhosts
mariadb:
restart: always
image: mariadb:latest
container_name: mariadb-build-demo0
ports:
- "3306:3306"
networks:
static-network:
ipv4_address: 172.20.0.10
environment:
- MYSQL_ROOT_PASSWORD=4007p@$$w04d - MYSQL_USER=dbusernamegoeshere - MYSQL_PASSWORD=@p@$$w04d
- MYSQL_DATABASE=dbnamegoeshere
volumes:
- app-volume:/var/www/vhosts
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
timeout: 10s
retries: 5
volumes:
app-volume:
# external: true
networks:
static-network:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.20.0.0/16
Uygulamayı kaldırdığımda temizle komutum biraz çirkin, ancak okumak çok zor değil ve şöyle bir şey oluyor: docker-compose down -v ; docker rmi -f dockerbuild_apache_php-fpm_backend:latest mariadb:latest nginx:latest debian:latest ; docker rmi -f $(docker images -q --filter "dangling=true") ; docker rmi -f $(docker images -q --filter label=stage=intermediate) ; docker volume prune -f;
Bence her "bağımsız uygulama" kendi docker-compose ve / veya Dockerfiles'a sahip olabilir (ve muhtemelen olmalıdır), ancak kullanılacak özel command:talimatlar (git_repo_clone örneği gibi) oluşturabileceğiniz belirli Dockerfiles ile sinerjiler bulabilirsiniz & birden çok "uygulama" arasında paylaşılır.