Docker Container'ları Nasıl Bağlanır?

Sep 23 2020

"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

1 K8sN0v1c3 Sep 23 2020 at 10:01

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.