Kontainer adalah topik diskusi terpanas di Industri TI karena banyak keuntungannya. Organisasi mengadopsi solusi berbasis wadah untuk bisnis mereka dengan kecepatan yang luar biasa. Menurut 451 Research, pasar wadah aplikasi akan tumbuh empat kali lebih besar di tahun-tahun mendatang
Saat ini, kami bahkan memiliki database seperti MySQL, MongoDB, PostgreSQL, dan banyak lagi dalam bentuk container. Namun, artikel ini akan membahas opsi untuk menyetel dan menjalankan kontainer MySQL. Untuk memulai, kami akan mengambil cadangan dari database MySQL kami yang ada. Selanjutnya, kita akan membuat konfigurasi container dalam bentuk YAML dan menjalankannya menggunakan docker-compose, sebuah toolkit sumber terbuka untuk menyatukan tumpukan container aplikasi
Tanpa basa-basi lagi, mari masuk ke detail seluk beluknya
2. Membangun Konfigurasi Wadah MySQL
Di bagian ini, kita akan membuat wadah MySQL menggunakan alat pembuat docker. Namun, YAML juga menggunakan image dari Dockerfile sebagai konfigurasi dasar di jalur saat ini
2. 1. Komposisi Docker
Pertama, mari buat file YAML dengan tag versi dan layanan. Kami menentukan versi format file di bawah tag versi dari file YAML. Layanan MySQL menggunakan informasi gambar dari Dockerfile, yang kami definisikan dalam konteksnya
Selanjutnya, kami juga menginstruksikan alat untuk menggunakan argumen default yang didefinisikan sebagai variabel lingkungan di. env. Terakhir, tag port akan mengikat wadah dan port mesin host 3306. Mari kita lihat isi dari file YAML penyusun docker yang kita gunakan untuk membuka layanan MySQL
# cat docker-compose.yml version: '3.3' services: ### MySQL Container mysql: build: context: /home/tools/bael/dung/B015 args: - MYSQL_DATABASE=${MYSQL_DATABASE} - MYSQL_USER=${MYSQL_USER} - MYSQL_PASSWORD=${MYSQL_PASSWORD} - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} ports: - "${MYSQL_PORT}:3306"2. 2. Pembuatan Dockerfile
Secara internal, docker-compose menggunakan Dockerfile di jalur yang ditentukan untuk membuat image dan mengatur lingkungan untuk MySQL. Dockerfile kami mengunduh gambar dari DockerHub dan memutar wadah dengan variabel yang ditentukan
# cat Dockerfile FROM mysql:latest MAINTAINER baeldung.com RUN chown -R mysql:root /var/lib/mysql/ ARG MYSQL_DATABASE ARG MYSQL_USER ARG MYSQL_PASSWORD ARG MYSQL_ROOT_PASSWORD ENV MYSQL_DATABASE=$MYSQL_DATABASE ENV MYSQL_USER=$MYSQL_USER ENV MYSQL_PASSWORD=$MYSQL_PASSWORD ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD ADD data.sql /etc/mysql/data.sql RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d EXPOSE 3306_Sekarang, mari kita lihat sekilas semua instruksi yang diberikan di cuplikan Dockerfile di bawah ini
- FROM – Dockerfile yang valid dimulai dengan pernyataan FROM, yang menjelaskan nama image dan tag versi. Dalam kasus kami, kami menggunakan gambar mysql dengan tag terbaru
- PEMELIHARA – Tetapkan informasi pembuat sebagai metadata penampung yang terlihat melalui pemeriksaan buruh pelabuhan
- RUN – Jalankan perintah di atas gambar mysql, yang selanjutnya membentuk layer baru. Gambar yang dihasilkan dikomit dan digunakan untuk langkah selanjutnya yang ditentukan di Dockerfile
- ARG – Meneruskan variabel selama waktu pembuatan. Di sini, kami memberikan empat variabel pengguna sebagai argumen build
- ENV – Kami menggunakan simbol $ untuk mewakili variabel lingkungan di Dockerfile. Dalam cuplikan di atas, kami menggunakan empat variabel
- TAMBAH – Selama waktu pembuatan, itu akan menambahkan file ke dalam wadah untuk digunakan di masa mendatang
- EXPOSE – Jadikan layanan tersedia di luar Docker Container
2. 3. Mengatur Lingkungan
Selain itu, kita dapat membuat file variabel lingkungan sebagai. env di jalur saat ini. File ini berisi semua variabel yang terlibat dalam file penulisan
# cat .env MYSQL_DATABASE=my_db_name MYSQL_USER=baeldung MYSQL_PASSWORD=pass MYSQL_ROOT_PASSWORD=pass MYSQL_PORT=33062. 4. File Cadangan MySQL
Demi demonstrasi, mari ambil cadangan dari tabel database yang ada. Di sini, kami mengimpor tabel Pelanggan yang sama ke wadah MySQL kami secara otomatis melalui data. .sql
Di bawah ini, kami menampilkan data tabel menggunakan kueri SELECT, yang mengambil data dari tabel yang diminta
mysql> select * from Customers; +--------------+-----------------+---------------+-----------+------------+---------+ | CustomerName | ContactName | Address | City | PostalCode | Country | +--------------+-----------------+---------------+-----------+------------+---------+ | Cardinal | Tom B. Erichsen | Skagen 21 | Stavanger | 4006 | Norway | | Wilman Kala | Matti Karttunen | Keskuskatu 45 | Helsinki | 21240 | Finland | +--------------+-----------------+---------------+-----------+------------+---------+ 2 rows in set (0.00 sec)Sebagai bagian dari paket RDBMS MySQL, utilitas mysqldump digunakan untuk mencadangkan semua data dalam database menjadi file teks. Menggunakan perintah sederhana dengan argumen sebaris, kita dapat dengan cepat mengambil cadangan tabel MySQL
- -u. nama pengguna MySQL
- -p. Kata sandi MySQL
Pada tingkat tinggi, file cadangan akan menjatuhkan tabel apa pun yang bernama Pelanggan di database yang dipilih dan memasukkan semua data yang dicadangkan ke dalamnya
# cat data.sql -- MySQL dump 10.13 Distrib 8.0.26, for Linux (x86_64) ... .. output truncated ... ... DROP TABLE IF EXISTS `Customers`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `Customers` ( `CustomerName` varchar(255) DEFAULT NULL, ... .. output truncated ... ... INSERT INTO `Customers` VALUES ('Cardinal','Tom B. Erichsen','Skagen 21','Stavanger','4006','Norway'),('Wilman Kala','Matti Karttunen','Keskuskatu 45','Helsinki','21240','Finland'); /*!40000 ALTER TABLE `Customers` ENABLE KEYS */; UNLOCK TABLES; ... .. output truncated ... ... -- Dump completed on 2022-07-28 1:56:09Namun, pembuatan atau penghapusan database tidak dikelola dalam file dump yang dibuat. Kami akan menambahkan cuplikan di bawah ini ke dalam data. sql, yang membuat database jika tidak ada. Itu membuat lingkaran lengkap dengan mengelola database dan tabel. Terakhir, ini juga menggunakan database yang dibuat dengan perintah USE
-- -- Create a database using `MYSQL_DATABASE` placeholder -- CREATE DATABASE IF NOT EXISTS `MYSQL_DATABASE`; USE `MYSQL_DATABASE`;_Saat ini, struktur direktori terlihat seperti ini
# tree -a . ├── data.sql ├── docker-compose.yml ├── Dockerfile └── .env3. Memutar Kontainer Server MySQL
Sekarang, kita siap untuk memutar wadah melalui docker-compose. Untuk membuka container MySQL, kita perlu menjalankan docker-compose up
Saat kita menelusuri garis keluaran, kita dapat melihat bahwa mereka membentuk lapisan baru di setiap langkah di atas gambar MySQL
Selanjutnya, itu juga membuat database dan memuat data yang ditentukan dalam data. .sql
# docker-compose up Building mysql Sending build context to Docker daemon 7.168kB Step 1/15 : FROM mysql:latest ---> c60d96bd2b77 Step 2/15 : MAINTAINER baeldung.com ---> Running in a647bd02b91f Removing intermediate container a647bd02b91f ---> fafa500c0fac Step 3/15 : RUN chown -R mysql:root /var/lib/mysql/ ---> Running in b37e1d5ba079 ... .. output truncated ... ... Step 14/15 : RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d ---> Running in 34f1d9807bad Removing intermediate container 34f1d9807bad ---> 927b68a43976 Step 15/15 : EXPOSE 3306 ---> Running in defb868f4207 Removing intermediate container defb868f4207 ---> 6c6f435f52a9 Successfully built 6c6f435f52a9 Successfully tagged b015_mysql:latest Creating b015_mysql_1 .. done Attaching to b015_mysql_1 mysql_1 | 2022-07-28 00:49:03+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.26-1debian10 started. ... .. output truncated ... ... mysql_1 | 2022-07-28 00:49:16+00:00 [Note] [Entrypoint]: Creating database my_db_name mysql_1 | 2022-07-28 00:49:16+00:00 [Note] [Entrypoint]: Creating user baeldung mysql_1 | 2022-07-28 00:49:16+00:00 [Note] [Entrypoint]: Giving user baeldung access to schema my_db_name mysql_1 | mysql_1 | 2022-07-28 00:49:16+00:00 [Note] [Entrypoint]: /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/data.sql ... .. output truncated ... ..._Kita dapat menggunakan opsi -d untuk menjalankan kontainer dalam mode terpisah
# docker-compose up -d Building mysql Sending build context to Docker daemon 7.168kB Step 1/15 : FROM mysql:latest ---> c60d96bd2b77 ... .. output truncated ... ... Step 15/15 : EXPOSE 3306 ---> Running in 958e1d4af340 Removing intermediate container 958e1d4af340 ---> c3516657c4c8 Successfully built c3516657c4c8 Successfully tagged b015_mysql:latest Creating b015_mysql_1 .. done #_4. Kesiapan Klien MySQL
Ini wajib untuk menginstal klien untuk mendapatkan akses mudah ke server MySQL. Bergantung pada kebutuhan kita, kita dapat menginstal klien di mesin host atau mesin atau wadah lain yang memiliki jangkauan IP dengan wadah server
# cat Dockerfile FROM mysql:latest MAINTAINER baeldung.com RUN chown -R mysql:root /var/lib/mysql/ ARG MYSQL_DATABASE ARG MYSQL_USER ARG MYSQL_PASSWORD ARG MYSQL_ROOT_PASSWORD ENV MYSQL_DATABASE=$MYSQL_DATABASE ENV MYSQL_USER=$MYSQL_USER ENV MYSQL_PASSWORD=$MYSQL_PASSWORD ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD ADD data.sql /etc/mysql/data.sql RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d EXPOSE 3306_0Sekarang, mari ekstrak jalur instalasi dan versi klien MySQL
# cat Dockerfile FROM mysql:latest MAINTAINER baeldung.com RUN chown -R mysql:root /var/lib/mysql/ ARG MYSQL_DATABASE ARG MYSQL_USER ARG MYSQL_PASSWORD ARG MYSQL_ROOT_PASSWORD ENV MYSQL_DATABASE=$MYSQL_DATABASE ENV MYSQL_USER=$MYSQL_USER ENV MYSQL_PASSWORD=$MYSQL_PASSWORD ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD ADD data.sql /etc/mysql/data.sql RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d EXPOSE 3306_15. Komunikasi Klien Server
Kita dapat mengakses server MySQL yang dikerahkan menggunakan aplikasi klien. Pada bagian ini, kita akan melihat cara mengakses server MySQL melalui klien
Mari kita lihat id dan status kontainer yang dibuat menggunakan perintah docker ps
# cat Dockerfile FROM mysql:latest MAINTAINER baeldung.com RUN chown -R mysql:root /var/lib/mysql/ ARG MYSQL_DATABASE ARG MYSQL_USER ARG MYSQL_PASSWORD ARG MYSQL_ROOT_PASSWORD ENV MYSQL_DATABASE=$MYSQL_DATABASE ENV MYSQL_USER=$MYSQL_USER ENV MYSQL_PASSWORD=$MYSQL_PASSWORD ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD ADD data.sql /etc/mysql/data.sql RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d EXPOSE 3306_2Selanjutnya, mari dapatkan alamat IP kontainer untuk mengakses database menggunakan layanan klien yang diinstal. Jika kami mengeluarkan perintah docker inspect, kami akan melihat informasi mendetail tentang container dalam format JSON. Kami juga dapat memilih bidang apa pun dari JSON yang dihasilkan. Di sini, kami mengambil alamat IP dari jangkauan. Pengaturan jaringan. Jaringan -> Alamat IP
# cat Dockerfile FROM mysql:latest MAINTAINER baeldung.com RUN chown -R mysql:root /var/lib/mysql/ ARG MYSQL_DATABASE ARG MYSQL_USER ARG MYSQL_PASSWORD ARG MYSQL_ROOT_PASSWORD ENV MYSQL_DATABASE=$MYSQL_DATABASE ENV MYSQL_USER=$MYSQL_USER ENV MYSQL_PASSWORD=$MYSQL_PASSWORD ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD ADD data.sql /etc/mysql/data.sql RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d EXPOSE 3306_3Kami kemudian dapat menggunakan klien untuk masuk ke Server MySQL menggunakan informasi host dan port yang dikonfigurasi
# cat Dockerfile FROM mysql:latest MAINTAINER baeldung.com RUN chown -R mysql:root /var/lib/mysql/ ARG MYSQL_DATABASE ARG MYSQL_USER ARG MYSQL_PASSWORD ARG MYSQL_ROOT_PASSWORD ENV MYSQL_DATABASE=$MYSQL_DATABASE ENV MYSQL_USER=$MYSQL_USER ENV MYSQL_PASSWORD=$MYSQL_PASSWORD ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD ADD data.sql /etc/mysql/data.sql RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d EXPOSE 3306_4Di sini, kita dapat melihat bahwa data dipulihkan secara otomatis dari data. .sql
mysql> select * from Customers; +--------------+-----------------+---------------+-----------+------------+---------+ | CustomerName | ContactName | Address | City | PostalCode | Country | +--------------+-----------------+---------------+-----------+------------+---------+ | Cardinal | Tom B. Erichsen | Skagen 21 | Stavanger | 4006 | Norway | | Wilman Kala | Matti Karttunen | Keskuskatu 45 | Helsinki | 21240 | Finland | +--------------+-----------------+---------------+-----------+------------+---------+ 2 rows in set (0.00 sec)Sekarang, mari kita coba menambahkan beberapa baris lagi ke tabel database yang sudah ada. Kami akan menggunakan kueri INSERT untuk menambahkan data ke tabel
# cat Dockerfile FROM mysql:latest MAINTAINER baeldung.com RUN chown -R mysql:root /var/lib/mysql/ ARG MYSQL_DATABASE ARG MYSQL_USER ARG MYSQL_PASSWORD ARG MYSQL_ROOT_PASSWORD ENV MYSQL_DATABASE=$MYSQL_DATABASE ENV MYSQL_USER=$MYSQL_USER ENV MYSQL_PASSWORD=$MYSQL_PASSWORD ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD ADD data.sql /etc/mysql/data.sql RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d EXPOSE 3306_6Kami juga telah berhasil memasukkan baris baru ke dalam tabel yang dipulihkan. Selamat. Mari kita lihat hasilnya
# cat Dockerfile FROM mysql:latest MAINTAINER baeldung.com RUN chown -R mysql:root /var/lib/mysql/ ARG MYSQL_DATABASE ARG MYSQL_USER ARG MYSQL_PASSWORD ARG MYSQL_ROOT_PASSWORD ENV MYSQL_DATABASE=$MYSQL_DATABASE ENV MYSQL_USER=$MYSQL_USER ENV MYSQL_PASSWORD=$MYSQL_PASSWORD ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD ADD data.sql /etc/mysql/data.sql RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d EXPOSE 3306_7Sebagai alternatif, wadah server MySQL dilengkapi dengan instalasi klien MySQL. Namun, itu hanya dapat digunakan di dalam wadah untuk tujuan pengujian apa pun. Sekarang, mari masuk ke container Docker dan mencoba mengakses server MySQL menggunakan klien MySQL default
Perintah docker exec membantu untuk masuk ke wadah yang sedang berjalan menggunakan id wadah. Opsi -i membuat STDIN tetap terbuka, dan -t akan mengalokasikan pseudo-TTY, dan akhirnya, /bin/bash pada akhirnya menempatkan kita di prompt BASH
# cat Dockerfile FROM mysql:latest MAINTAINER baeldung.com RUN chown -R mysql:root /var/lib/mysql/ ARG MYSQL_DATABASE ARG MYSQL_USER ARG MYSQL_PASSWORD ARG MYSQL_ROOT_PASSWORD ENV MYSQL_DATABASE=$MYSQL_DATABASE ENV MYSQL_USER=$MYSQL_USER ENV MYSQL_PASSWORD=$MYSQL_PASSWORD ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD ADD data.sql /etc/mysql/data.sql RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d EXPOSE 3306_86. Kesimpulan
Singkatnya, kami membahas langkah-langkah untuk membuka wadah server MySQL menggunakan docker-compose. Itu juga secara otomatis memulihkan database dan tabel dari file cadangan. Selanjutnya, kami juga mengakses data yang dipulihkan dan melakukan beberapa operasi CRUD