18 Kasım 2021 Perşembe

Docker Compose ve MySQL

Giriş
Bu yazıda "Docker Compose" kullanarak MySQL veri tabanını çalıştırma örnekleri var. Sadece "Docker" için Docker ve MySQL yazısına bakabilirsiniz.

Docker ile MySQL'i çalıştırmak için belirtilen parametreler şöyle
MYSQL_ROOT_PASSWORD
MYSQL_DATABASE
MYSQL_USER
MYSQL_PASSWORD
Çalıştırılacak SQL "docker-entrypoint-initdb.d" dizini altına kopyalanır. 

Benim Kullandıklarım
Örnek
Şöyle yaparız
version: '3.9'
services:
  mysql:
    # environment variables are not a list
    environment:
       MYSQL_ROOT_PASSWORD: root
       MYSQL_DATABASE: db
       # root can log in from every host
       MYSQL_ROOT_HOST: '%'
    container_name: mysql
    ports:
      - '3306:3306'
    # For volumes, it will execute files with extensions .sh, .sql and .sql.gz that are found in
    # /docker-entrypoint-initdb.d. Files will be executed in alphabetical order.
    volumes:
      - './schema.sql:/docker-entrypoint-initdb.d/schema.sql/'
    image: 'mysql:8.0'
  
# run with
# docker-compose up

# login with
# mysql -uroot -proot
Örnek - Storing MySQL Data on Host - Yani Bind mount
Şöyle yaparız. Bu sefer verinin D:/mysqlvolume dizininde saklanmasını istiyoruz
version: '3.1'
services:
  db:
    image: mysql:8.0.27
    container_name : mysql-8
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: advuser
      MYSQL_PASS: advuser
      MYSQL_DATABASE: adv
    volumes:
      - D:/mysqlvolume:/var/lib/mysql
    ports:
      - "3307:3306"
Tekrar tablo yaratıp dolduralım. SELECT yapalım ve tablonun dolu olduğunu görelim. Sonra şöyle yaparız. Yani MySQL'i durduralım ve bu container'a ait volume'ları da sil diyelim. Ancak bu sefer docker volume kullanmadığımız için diskteki verinin kaybolmadığını görürüz.
docker-compose down -v
Tekrar başlatalım
docker-compose up
Select yaparsak verinin aynen kaldığını görebiliriz.

Örnek
Şöyle yaparız
mysql:
    image: mysql:latest
    container_name: mysql
    restart: always
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=dashboard
      - MYSQL_USER=dashboard
      - MYSQL_PASSWORD=123456
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/init:/docker-entrypoint-initdb.d


Örnek - Storing MySQL Data on Named Volume
Şöyle yaparız
version: '3.1'
services: db: image: mysql:8.0.27 container_name : mysql-8 restart: always environment: MYSQL_ROOT_PASSWORD: root MYSQL_USER: advuser MYSQL_PASS: advuser MYSQL_DATABASE: adv volumes: - my-datavolume:/D:/mysqlvolume ports: - "3307:3306" volumes: my-datavolume:
Bu örneği şöyle de denedim. Yani 
- my-datavolume:/D:/mysqlvolume yerine 
- my-datavolume:/var/lib/mysql
kullandım aralarında bir fark yok. Her ikisi de aynı çalıştı
version: '3.1'
services:
  db:
    image: mysql:8.0.27
    container_name : mysql-8
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: advuser
      MYSQL_PASS: advuser
      MYSQL_DATABASE: adv
    volumes:
      - my-datavolume:/var/lib/mysql
    ports:
      - "3307:3306"
volumes:
  my-datavolume:        
Çalıştırmak için şöyle yaparız. Bu terminal beklemeye başlar. Veri tabanını kapatmak için Ctrl + C yapılır
docker compose up
Bash açmak için başka bir terminalden şöyle yaparız.
docker exec -it mysql-8 bash
Docker içinden mysql açmak için şöyle yaparız. Kullanıcı adı ve şifresi root
mysql -uroot -proot
Docker dışından mysql açmak için şöyle yaparız.
mysql -h 127.0.0.1 -uroot -proot -P 3307
Veri tabanlarına bakarız
show databases;
adv veri tabanına geçeriz
use adv;
Daha sonra bir tablo yaratırız.
CREATE TABLE product (sku VARBINARY(128),description VARBINARY(128),
  price BIGINT,PRIMARY KEY(sku));
Tabloya kayıt ekleyelim
INSERT INTO product(sku,description,price) VALUES (1,2,3);
Tablo için select denemesi yapalım
SELECT * FROM product;
Veri tabanını durduralım
docker compose stop
Tekrar başlatınca verinin kaybolmadığını görürüz. Volume docker tarafından bir yerlerde saklanıyor. Yerini bilmiyorum. Şöyle yapalım. Bu sefer hem MySQL'i durdurur hem de volume'un silinmesini istiyoruz. 
docker-compose down -v
Her şeyi tekrar başlatalım
docker compose up
Yine select yapalım
SELECT * FROM product;
Bu sefer şu hatayı alırız
Table 'adv.product' doesn't exist


command
Örnek - docker-entrypoint-initdb.d
Şöyle yaparız
- Burada init.sql çalıştırılıyor. 
- MySQL verisi Anonymous Volume üzerinde. 
version: '3'
services:
  ...
  mysql:
    image: mysql:8.0
    command: ["mysqld", "--init-file=/docker-entrypoint-initdb.d/init.sql"]
    volumes:
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: mydatabase
    ports:
      - "3306:3306"
Örnek
Şöyle yaparız
mysql:
  image: mysql:latest
  container_name: mysql
  command:
    --server-id=12345
    --log-bin=mysql-bin
    --binlog-format=ROW
    --binlog-row-image=full
  networks:
    - tutorial
  environment:
    MYSQL_USER: foo
    MYSQL_PASSWORD: bar
    MYSQL_ROOT_PASSWORD: foobar
  volumes:
    - db_data:/var/lib/mysql
environment
Genellikle şunlar tanımlanıyor
MYSQL_DATABASE
MYSQL_USER
MYSQL_PASSWORD
MYSQL_ROOT_PASSWORD

Örnek
Şöyle yaparız Burada volume olarak hem bind mount yani host üzerindeki bir dizin kullanılıyor hem de adminer isimli bir bir DB GUI kullanılıyor. http://localhost:8888 adresine gidilir.
version: '3.9'
...
services:

  #MYSQLDB - ERP
  mysql_db:
    container_name: datasource-mysql-db
    image: mysql:latest
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: ${MY_SQL_DATABASE}
      MYSQL_USER: ${MY_SQL_USER}
      MYSQL_PASSWORD: ${MY_SQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MY_SQL_ROOT_PASSWORD}
    deploy:
      resources:
        limits:
          cpus: "0.5"
          memory: "256M"
    ports:
      - '3306:3306'
    volumes:
      - ./mysql-data:/var/lib/mysql
    profiles:
      - datasource
    networks:
      - datastack

  #SGBD
  adminer:
    container_name: datasource-adminer
    image: adminer:latest
    deploy:
      resources:
        limits:
          cpus: "0.2"
          memory: "256M"
    restart: always
    ports:
      - 8888:8080
    profiles:
      - datasource
    networks:
      - datastack
Örnek
Şöyle yaparız
- Burada init/mysql/scripts/bash dizini volume olarak yükleniyor. Bu dizinde ilk başlarken çalıştırılacak SQL dosyaları var. 
- MySQL verisi Anonymous Volume üzerinde. 
- Ayrıca  MAX_ALLOWED_PACKET atanıyor. Böylece veri tabanını büyük veri ile doldurmak mümkün
version: '3.8'
services:
  my_sql_local:
    container_name: my_sql_local
    image: mysql:8.0.31
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: customer
      MYSQL_USER: customer_user
      MYSQL_PASSWORD: customer_password
      MAX_ALLOWED_PACKET: 1073741824
    volumes:
      - ./init/mysql/scripts/bash:/docker-entrypoint-initdb.d
init/mysql/scripts/bash dizinindeki dosya şöyle. Bu dosya döngü içinde çok büyük veriyi dolduruyor


Hiç yorum yok:

Yorum Gönder

Soft Delete

Giriş Açıklaması  şöyle When using the soft delete mechanism on the database, you might run into a situation where a record with a unique co...