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 -vTekrar başlatalım
docker-compose upSelect 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:
docker compose upBash açmak için başka bir terminalden şöyle yaparız.
docker exec -it mysql-8 bashDocker 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 stopTekrar 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 -vHer şeyi tekrar başlatalım
docker compose upYine 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
Hiç yorum yok:
Yorum Gönder