Aracılığıyla paylaş


Öğretici: MySQL ve Docker Compose ile çok kapsayıcılı uygulamalar oluşturma

Bu makalede, MySQL ve Docker Composeile çok kapsayıcılı uygulamaların nasıl oluşturulacağı açıklanmaktadır. Birden çok kapsayıcıya sahip bir uygulama, kapsayıcıları özel görevler için ayırmanıza olanak tanır, böylece her kapsayıcı tek bir göreve odaklanabilir. Çok kapsayıcılı uygulamaları kullanmanın birçok avantajı vardır:

  • Ayrı kapsayıcılar, API'leri ve ön uç kaynaklarını veritabanlarından farklı bir şekilde yönetmenizi sağlar.
  • Birden fazla kapsayıcı kullanarak, sürümleri izole bir şekilde versiyona alabilir ve güncelleyebilirsiniz.
  • Yerel veritabanları, üretimdeki veritabanları için kullanılan kapsayıcılarda ve yönetilen hizmetlerde tutulabilir.
  • Çok kapsayıcılı uygulamalar, işlem yöneticisiyle birden çok işlem çalıştırmaktan daha verimlidir ve bu da kapsayıcı başlatma/kapatma işlemine karmaşıklık kazandırır.

Bu öğreticide şunları yapacaksınız:

  • MySQL'i başlatma
  • MySQL ile çoklu konteynerlı uygulamanızı çalıştırın
  • Uygulamanız için Docker Compose dosyası oluşturma
  • Docker Compose ile uygulama yığınını çalıştırma

Önkoşullar

  • Bu makale, öğretici serisinin bir parçasıdır. Prosedürler, Linux kapsayıcıları için Docker Desktop gerektiren yerleşik bir örnek üzerine inşa edilmiştir.

    Önerilen yaklaşım, önkoşulları karşılama da dahil olmak üzere ilk öğretici olan Kapsayıcı uygulaması oluşturma ve ayrıca uygulamanızda verileri kalıcı hale getirme öğreticisini tamamlamaktır. Bu eğitimleri tamamladıktan sonra, bu makalede açıklanan adımlarla devam edin.

  • Bu makaledeki örnekte Docker Composekullanılır.

    Windows için Docker Desktop, Docker Compose'u içerir.

    Docker yüklemenizi doğrulamak için aşağıdaki komutu çalıştırın:

    docker-compose version
    

Visual Studio Code

Bu öğretici serisinde Visual Studio Code (VS Code) yordamları açıklanmaktadır. Bu ortamda çalışmak için aşağıdaki noktaları gözden geçirin:

  • CONTAINER EXPLORER veya EXPLORER (dosya ve klasör) görünümü arasında geçiş yapmak için sol menüyü kullanın:

    Visual Studio Code'da Kapsayıcı Gezgini ve dosya/klasör Gezgini görünümünü gösteren ekran görüntüsü.

  • VS Code'da bir komut satırı penceresi açmak için Terminal>Yeni Terminalseçin. Ctrl+Shift+` (geri onay işareti) klavye kısayolunu da kullanabilirsiniz.

  • Aksi belirtilmediği sürece, bash penceresinde komutları çalıştırın. Bash etiketli komutların çoğu Bash penceresinde veya VS Code komut satırı penceresinde çalıştırılır.

MySQL veritabanı yönetim sistemini başlatma

Varsayılan olarak kapsayıcılar yalıtılarak çalışır. Kapsayıcı, aynı bilgisayardaki diğer işlemlerin veya diğer kapsayıcıların farkında değildir.

Kapsayıcılar arasındaki iletişimi etkinleştirmek için aynı ağa bağlanması gerekir. Aynı ağdaki birden çok kapsayıcı veri paylaşabilir ve birbirleriyle bilgi işleyebilir.

Bir ağa kapsayıcı eklemenin iki yolu vardır. Oluşturma sırasında bir kapsayıcıyı ağa ekleyebilir veya var olan bir kapsayıcıyı daha sonra bir ağa ekleyebilirsiniz.

Bu örnekte, ağı oluşturur ve başlangıçta MySQL kapsayıcısını eklersiniz.

  1. todo-appadlı bir ağ oluşturun:

    docker network create todo-app
    
  2. todo-mysql-data adlı bir MySQL kapsayıcısı başlatın ve todo-app ağına ekleyin. Komut, MySQL veritabanı mysqliçin ağ takma adı todos oluşturur.

    Komutu çalıştırdığınızda, <your-password> yer tutucusu için MySQL kök parolanızı girin.

    docker run -d --network todo-app --network-alias mysql -v todo-mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=<your-password> -e MYSQL_DATABASE=todos mysql:lts
    

    Bu komut ayrıca MYSQL_ROOT_PASSWORD ve MYSQL_DATABASE ortam değişkenlerini tanımlar. Daha fazla bilgi için MySQL Docker Hub listesine bakın .

    Uyarı

    Bu öğretici, en güvenli yöntem olmayan bir MySQL veritabanıyla kimlik doğrulaması yapmak için parola kimlik bilgilerini gösterir. Daha güvenli kimlik doğrulama yöntemleri hakkında bilgi edinmek için MySQL belgelerine bakın.

  3. Sonraki adımda kullanmak üzere kapsayıcı kimliğinizi alın.

    docker ps
    
  4. mysql ağındaki kapsayıcıya bağlanabildiğinizi onaylayın.

    Komutu çalıştırdığınızda, <mysql-container-id> yer tutucusu için kapsayıcı kimliğinizi girin.

    docker exec -it <mysql-container-id> mysql -p
    

    İstem satırına, todo-mysql-data kapsayıcısını oluştururken sağladığınız parolayı girin.

  5. MySQL kabuğunda veritabanlarını listeleyin ve todos veritabanını gördüğünüzden emin olun.

    SHOW DATABASES;
    

    Aşağıdaki çıkışı görmeniz gerekir:

    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | todos              |
    +--------------------+
    5 rows in set (0.00 sec)
    
  6. Bağlantıyı sonlandırmak ve komut satırı istemine dönmek için çıkışgirin.

Uygulamanızı MySQL ile çalıştırma

todo uygulaması, MySQL bağlantı ayarlarınızı belirtmek için belirli ortam değişkenlerini ayarlamayı destekler. Aşağıdaki tabloda desteklenen değişkenler ve bu bölümde sunulan örnekte kullanılan değerler listelenmektedir.

Değişken adı Örnek değer Açıklama
MYSQL_HOST mysql MySQL sunucusunun ana bilgisayar adı.
MYSQL_USER root Bağlantı için kullanılacak kullanıcı adı.
MYSQL_PASSWORD <your-password> Bağlantı için kullanılacak parola. Bu örnekte, <your-password> yer tutucusu için kök parolanızı değiştirin.
MYSQL_DATABASE todos Bağlantı kurulduktan sonra kullanılacak veritabanının adı.

Uyarı

Bağlantı ayarlarını ayarlamak için ortam değişkenlerini kullanmak geliştirme için kabul edilebilir, ancak bu uygulama üretim ortamında uygulama çalıştırmak için önerilmez. Daha fazla bilgi için bkz. Gizli veriiçin ortam değişkenlerini neden kullanmamalısınız?

Daha güvenli bir mekanizma, kapsayıcı düzenleme çerçeveniz tarafından sağlanan gizli dizi desteğini kullanmaktır. Çoğu durumda, bu sırlar çalışan kapsayıcıya dosya olarak yüklenir.

Aşağıdaki örnekte, uygulamanızı başlatır ve uygulama kapsayıcınızı MySQL kapsayıcınıza bağlarsınız.

  1. Aşağıdaki docker komutunu çalıştırın. Komutun daha önce açıklanan ortam değişkenlerini nasıl belirttiğine dikkat edin.

    Komutu çalıştırdığınızda, <your-password> yer tutucusu için MySQL kök parolanızı girmeyi unutmayın.

    docker run -dp 3000:3000 -w /app -v ${PWD}:/app --network todo-app -e MYSQL_HOST=mysql -e MYSQL_USER=root -e MYSQL_PASSWORD=<your-password> -e MYSQL_DB=todos node:lts-alpine sh -c "yarn install && yarn run dev"
    
  2. VS Code düzenleyicisinde Kapsayıcı Gezgini'ni açın, uygulama kapsayıcınıza sağ tıklayın ve Günlükleri Görüntüle'yi seçin.

    docker logs komutunu kullanarak günlükleri komut satırından da görüntüleyebilirsiniz.

  3. Log çıkışını gözden geçirin. Uygulamanın MySQL veritabanına bağlı olduğunu gösteren satıra dikkat edin: Connected to mysql db at host mysql.

    # Previous log messages omitted
    $ nodemon src/index.js
    [nodemon] 1.19.2
    [nodemon] to restart at any time, enter `rs`
    [nodemon] watching dir(s): *.*
    [nodemon] starting `node src/index.js`
    Connected to mysql db at host mysql
    Listening on port 3000
    
  4. İnternet tarayıcınızda çalışan uygulamanıza gidin: http://localhost:3000.

  5. Çalışan uygulamanızda yapılacaklar listenize bazı öğeler ekleyin.

  6. Veritabanını denetleyebilmek için mysql ağındaki MySQL kapsayıcı veritabanına bağlanın.

    Komutu çalıştırdığınızda, <mysql-container-id> yer tutucusu için kapsayıcı kimliğinizi girin.

    docker exec -ti <mysql-container-id> mysql -p todos
    

    İstem satırına, todo-mysql-data kapsayıcısını oluştururken sağladığınız parolayı girin.

  7. MySQL kabuğunda, eklediğiniz todo_items'ın todos veritabanına yazıldığını doğrulayın.

    use todos;
    select * from todo_items;
    

    Aşağıdaki örneğe benzer bir çıktı görmeniz gerekir:

    +--------------------------------------+--------------------+-----------+
    | id                                   | name               | completed |
    +--------------------------------------+--------------------+-----------+
    | c906ff08-60e6-44e6-8f49-ed56a0853e85 | Do amazing things! |         0 |
    | 2912a79e-8486-4bc3-a4c5-460793a575ab | Be awesome!        |         0 |
    +--------------------------------------+--------------------+-----------+
    

Artık verileri ayrı bir kapsayıcıda çalışan bir dış veritabanında depolayan bir uygulamanız var. Bu yordam, ağ kullanarak kapsayıcılar arasında iletişimi nasıl etkinleştirebileceğinizi gösterir.

Docker Compose dosyası oluşturma

Docker Compose, çok kapsayıcılı uygulamaları tanımlamanıza ve paylaşmanıza yardımcı olur. Docker Compose dosyası tüm gerekli hizmetlerinizi belirtebilir, böylece tüm ilgili işlemleri tek bir komutla başlatabilir veya sonlandırabilirsiniz. Uygulama yığınınızı proje deponuzun kökündeki bir Docker Compose dosyasında tanımlayabilir ve yapılandırmanızı sürüm denetimi altında tutabilirsiniz. Bu yaklaşım, başkalarının deponuzu kopyaladıklarında projenize katkıda bulunmalarını sağlar.

Aşağıdaki örnekte, todoçok kapsayıcılı uygulamanız için bir Docker Compose dosyası yapılandıracaksınız.

  1. todo uygulama projenizin kökünde docker-compose.ymladlı bir Docker Compose dosyası oluşturun.

    Not

    Varsayılan olarak, YAML şema sürümü en son sürüme ayarlanır. Uygulamanızı çalıştırdığınızda şema sürümünüz eskiyse bir uyarı iletisi alırsınız. Geçerli şema sürümlerini ve uyumluluk matrislerini gözden geçirmek için bkz. Genel Bakış (Dosya oluşturma).

  2. docker-compose.yml dosyasına aşağıdaki öğeleri ekleyin. Uygulamanızın name belirtin ve uygulamanızın parçası olarak çalıştırmak istediğiniz services (veya kapsayıcılar) listesini başlatın.

    name: todo
    
    services:
    

    Hizmet listesi uygulamanız için benzersizdir. Örnek olarak app, web, db, proxyvb. verilebilir. sonraki bir adımda services öğesinin tanımını genişletirsiniz.

    İpucu

    girintileme, .yml dosyalarda önemlidir. VS Code'da düzenliyorsanız, IntelliSense biçim veya söz dizimindeki hataları gösterir.

  3. services dosyasındaki tanımına dönün. Kapsayıcının görüntüsünü içeren app hizmet öğesini tanımlamak için bir giriş ekleyerek tanımı genişletin.

    services:
      app:
        image: node:lts-alpine
    

    Hizmet için herhangi bir ad seçebilirsiniz. Ad otomatik olarak bir ağ diğer adı haline gelir ve bu, MySQL hizmetini tanımladığınızda kullanışlıdır.

  4. Yürütülecek bir app belirtmek için command öğe tanımını genişletin.

      app:
        image: node:lts-alpine
        command: sh -c "yarn install && yarn run dev"
    
  5. ports hizmetiyle kullanılacak app'ı tanımla. Bu bağlantı noktaları, uygulamayı MySQL ile çalıştırmak için kullanılan komutun -p 3000:3000 bağımsız değişkenine karşılık gelirler.

      app:
        image: node:lts-alpine
        command: sh -c "yarn install && yarn run dev"
        ports:
          - 3000:3000
    
  6. working_dir hizmeti için çalışma dizini app'ı ve ayrıca eşlenen volumes'yi belirleyin.

      app:
        image: node:lts-alpine
        command: sh -c "yarn install && yarn run dev"
        ports:
          - 3000:3000
        working_dir: /app
        volumes:
          - ./:/app
    

    Docker Compose birimlerini tanımlarken, geçerli dizine göre göreli yolları kullanabilirsiniz.

  7. environment hizmeti için komut yürütürken kullanılacak app değişken tanımlarını belirtin.

      app:
        image: node:lts-alpine
        command: sh -c "yarn install && yarn run dev"
        ports:
          - 3000:3000
        working_dir: /app
        volumes:
          - ./:/app
        environment:
          MYSQL_HOST: mysql
          MYSQL_USER: root
          MYSQL_PASSWORD: <your-password>
          MYSQL_DB: todos
    

    <your-password> yer tutucusu için MySQL kök parolanızı girmeyi unutmayın.

  8. mysql hizmet tanımından sonra MySQL hizmeti app tanımını ekleyin. Öğe adlarını ve değerlerini gösterildiği gibi ve aynı girintiyle belirtin.

    services:
      app:
        ...
      mysql:
        image: mysql:lts
    

    mysql hizmet tanımı, mySQL başlatmakiçin daha önce kullandığınız komuta karşılık gelir. Hizmeti tanımladığınızda, otomatik olarak ağ takma adını alır.

  9. volumes hizmeti için mysql eşleşmesini tanımlayın.

    services:
      app:
        ...
      mysql:
        image: mysql:lts
        volumes:
          - todo-mysql-data:/var/lib/mysql
    
  10. environment hizmeti için komut yürütürken kullanılacak mysql değişken tanımlarını belirtin.

    services:
      app:
        ...
      mysql:
        image: mysql:lts
        volumes:
          - todo-mysql-data:/var/lib/mysql
        environment: 
          MYSQL_ROOT_PASSWORD: <your-password>
          MYSQL_DATABASE: todos
    

    <your-password> yer tutucusu için MySQL kök parolanızı girmeyi unutmayın.

  11. Uygulamanın tamamı için hacim eşlemesi tanımlayın. volumes: bölümünden sonra ve aynı girintiyle bir services: bölümü ekleyin.

    services:
       ...
    
    volumes:
      todo-mysql-data:
    
  12. Tamamlanmış docker-compose.yml dosyanızın aşağıdaki örneğe benzediğini onaylayın. <your-password> yer tutucusu için MySQL kök parolanızı görmeniz gerekir.

    name: todo
    
    services:
      app:
        image: node:lts-alpine
        command: sh -c "yarn install && yarn run dev"
        ports:
          - 3000:3000
        working_dir: /app
        volumes:
          - ./:/app
        environment:
          MYSQL_HOST: mysql
          MYSQL_USER: root
          MYSQL_PASSWORD: <your-password>
          MYSQL_DB: todos
    
      mysql:
        image: mysql:lts
        volumes:
          - todo-mysql-data:/var/lib/mysql
        environment: 
          MYSQL_ROOT_PASSWORD: <your-password>
          MYSQL_DATABASE: todos
    
    volumes:
      todo-mysql-data:
    

Docker Compose ile uygulama yığınını çalıştırma

Artık docker-compose.yml dosyanızı çalıştırmayı deneyebilirsiniz.

  1. Uygulamanızın ve veritabanınızın çalışan örneklerini durdurun.

    VS Code'da şu adımları izleyin:

    1. CONTAINER EXPLORER'ı (Kapsayıcı Araçları uzantısı) açın.

    2. Her çalışan kapsayıcı için, kapsayıcıya sağ tıklayın ve Kaldırseçin.

  2. Çok kapsayıcılı uygulamanızı ve tüm hizmetleri başlatın.

    VS Code'da şu adımları izleyin:

    1. EXPLORER (dosya ve klasör) görünümünü açın.

    2. docker-compose.yml dosyasına sağ tıklayın ve Compose Upseçeneğini seçin.

    Aşağıdaki örneğe benzer bir çıktı görmeniz gerekir:

    [+] Building 0.0s (0/0)
    [+] Running 2/2
    ✔ Container app-app-1    Started  0.9s 
    ✔ Container app-mysql-1  Running
    

    Bu işlem, uygulama ve ağ için eşlenmiş birimi oluşturur. Varsayılan olarak Docker Compose, uygulama yığını için özel olarak bir ağ oluşturur.

  3. Çalışan kapsayıcının günlüklerini gözden geçirin.

    VS Code'da şu adımları izleyin:

    1. CONTAINER EXPLORER'ı (Kapsayıcı Araçları uzantısı) açın.

    2. Uygulama kapsayıcısını sağ tıklatın ve günlükleri görüntüleseçin.

    Aşağıdaki örneğe benzer bir çıktı görmeniz gerekir:

    mysql_1  | 2019-10-03T03:07:16.083639Z 0 [Note] mysqld: ready for connections.
    mysql_1  | Version: '5.7.27'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
    app_1    | Connected to mysql db at host mysql
    app_1    | Listening on port 3000
    

    Günlükler, her satırın başındaki app_1 gibi hizmet adını ve örnek numarasını gösterir. Bu biçim, iletileri hizmete ve örneğe göre ayırt etmeye yardımcı olur. Her hizmetten gelen günlükler tek bir akışa eklenir. Bu yaklaşım zamanlamayla ilgili sorunları izlemenizi sağlar.

  4. Artık İnternet tarayıcınızda çalışan uygulamanıza gidebilirsiniz: http://localhost:3000.

Docker Compose ve çalışan kapsayıcıları durdurma

Uygulama ve kapsayıcılarla işiniz bittiğinde bunları kaldırabilirsiniz.

VS Code'da şu adımları izleyin:

  1. EXPLORER (dosya ve klasör) görünümünü açın.

  2. docker-compose.yml dosyasına sağ tıklayın ve Aşağı Alseçeneğini seçin.

Bu işlem, tüm çalışan kapsayıcıları durdurur ve ağı kaldırır.

Varsayılan olarak, oluşturma dosyanızdaki adlandırılmış birimler kaldırılmaz. Bu birimleri kaldırmak istiyorsanız docker-compose down --volumes komutunu kullanabilirsiniz.

Kaynakları temizleme

Bu öğretici serisindeki Önkoşulları bileşenlerini yüklemenize uyguladıysanız, gelecekteki Docker geliştirmesi için yapılandırmayı yeniden kullanabilirsiniz. Herhangi bir bileşeni silmek veya kaldırmak gerekli değildir.