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/mysqlenvironment
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