Hapus dan jalankan kembali wadah mysql

Gambar demo Docker yang akan kita gunakan melayani halaman web dengan beberapa properti dasar seperti nama host, alamat IP, dan port

2. 2. Menjalankan Banyak Kontainer dan Menyebabkan Kesalahan

Untuk menyebabkan error, kita perlu menjalankan dua instance yang akan menggunakan nama yang sama, baeldung_nginx

Perlu dipertimbangkan mengapa kita membutuhkan nama untuk sebuah wadah. Nama bisa menjadi cara praktis untuk menambah arti pada daftar container yang sedang berjalan. Terlebih lagi, nama tersebut dapat digunakan sebagai referensi di jaringan Docker

Mari kita mulai wadah pertama

docker run --name baeldung_nginx -p 80:80 -d nginxdemos/hello:plain-text

Kami menjalankan penampung dalam mode terpisah, yang berarti penampung akan berjalan di latar belakang. Kami memublikasikan port 80 penampung ke port yang sama di mesin host. Terakhir, kami telah menentukan nama khusus kami untuk wadah – baeldung_nginx

Sekarang, jika kita membuka http. //localhost di browser kita, kita akan melihat sesuatu yang mirip dengan ini

Server address: 123.45.6.7:80
Server name: e378ad49d49d
Date: 08/Apr/2022:22:08:44 +0000
URI: /
Request ID: 7bda7e3234cb6d1e51900fccc89320d5
_

Sekarang mari kita coba menjalankan wadah kedua. Kami akan menetapkan port 81 untuk instance kedua karena port host 80 sudah diambil oleh container pertama

docker run --name baeldung_nginx -p 81:80 -d nginxdemos/hello:plain-text

Sayangnya, ini tidak berhasil. Kami mendapatkan kesalahan

docker: Error response from daemon: Conflict. The container name "/baeldung_nginx" is already in use by container "76da8f6d3accc9b6d41c8a98fd492d4b8622804220ee628a438264b8cf4ae3d4". 
You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.

3. Menjelaskan Akar Penyebab Kesalahan

Setiap wadah Docker memiliki nama unik yang ditetapkan untuknya. Jika kita tidak menggunakan argumen nama opsional dalam perintah docker run, Docker akan memberikan nama acak

Dalam kasus kami, kami ingin menetapkan nama yang sama, baeldung_nginx, ke dua penampung yang berbeda. Kita harus mencatat bahwa meskipun kita menggunakan image Docker yang sama, setiap perintah docker run membuat container baru

Karena penampung kedua tidak dapat menggunakan nama yang sudah digunakan, kami mendapatkan kesalahan

4. Bagaimana memperbaikinya

4. 1. Memulai ulang Kontainer

Solusi ini berlaku untuk kasus di mana wadah Docker bernama baeldung_nginx sudah ada di sistem, dan itu adalah status yang benar. Dalam hal ini, kami tidak ingin memiliki dua instance berbeda dengan nama yang sama. Sebaliknya, kami ingin memulai ulang penampung yang sudah ada.

Untuk memulai ulang container yang ada, kita harus menggunakan docker start sebagai ganti < . docker run command. 

docker run membuat wadah baru dari suatu gambar. Kita dapat membuat klon dari gambar yang sama sebanyak mungkin. Di sisi lain, docker start meluncurkan container yang sebelumnya dihentikan.

Jadi, kita mungkin tidak mencoba memulai wadah baru sebanyak memulai ulang wadah yang sudah ada, dalam hal ini adalah solusinya. Namun, terkadang kami ingin meluncurkan pengganti container yang ada dengan image baru

4. 2. Menghapus Kontainer yang Ada

Ketika kami yakin bahwa kami ingin penampung baru kami mengambil alih nama, dan kami telah menghentikan penampung lain dengan nama ini, kami cukup menghapus penampung sebelumnya dengan nama tersebut

docker rm baeldung_nginx

Sayangnya, perintah ini tidak selalu berhasil. Misalnya, wadah lain mungkin memerlukan wadah kami untuk bekerja dengan benar. Jika itu masalahnya dan kami masih ingin menghapus wadah kami, kami dapat menggunakan bendera paksa di perintah hapus

docker rm -f baeldung_nginx
_

Setelah penampung sebelumnya dihapus, kami bebas meluncurkan penampung baru dengan nama pilihan kami

4. 3. Menggunakan Nama Berbeda untuk Kontainer

Bagaimana jika kita ingin menjalankan dua instance dari image yang sama? . Yang harus kita lakukan adalah menggunakan dua nama serta port yang berbeda

Docker adalah salah satu platform yang lebih populer untuk mengembangkan dan menerapkan aplikasi dalam wadah. Kontainer adalah lingkungan terisolasi yang menampung aplikasi beserta semua paket perangkat lunak yang dibutuhkannya. Dengan Docker, Anda dapat menjalankan atau menskalakan aplikasi Anda di lingkungan apa pun

MySQL adalah salah satu database relasional paling populer yang kompatibel dengan SQL. Menjalankan MySQL di dalam container Docker memungkinkan Anda memisahkan database dari kode Anda. Anda juga dapat menggunakan container orkestra seperti Kubernetes untuk menskalakan MySQL secara independen dari instance server API Anda

Menggunakan wadah memberi Anda manfaat konsistensi. Setelah selesai membangun sistem, Anda dapat menerapkan wadah ke cloud tanpa menginstal dan mengonfigurasi MySQL secara manual di perangkat keras bare-metal

Dalam artikel ini, Anda akan mempelajari cara Dockerize database Anda, apa yang perlu Anda ketahui terlebih dahulu, dan mengapa Anda harus mencobanya

Merencanakan Penerapan Anda

Saat menggunakan Docker dengan MySQL menyederhanakan banyak aspek penerapan Anda, seperti menginstal server dan membuat database, ada beberapa masalah teknis. Yang paling signifikan adalah penyimpanan data. Docker terutama dirancang di sekitar wadah tanpa kewarganegaraan, sementara database MySQL secara inheren bersifat stateful

Anda perlu menggunakan volume Docker saat menerapkan wadah MySQL. Volume menyediakan mekanisme untuk mempertahankan file setelah wadah berhenti. Anda akan kehilangan basis data jika memulai ulang wadah MySQL yang tidak menggunakan volume

Volume menyimpan data di luar wadah tunggal apa pun. Setelah wadah MySQL Anda berhenti, file yang disimpan dalam volume terpasang akan tetap dapat diakses di host Anda. Anda dapat memasang kembali volume ke wadah baru, menghindari kehilangan data setelah Anda mengganti instans MySQL dengan versi citra baru

Gunakan Kasus untuk MySQL di Docker

Dockerized MySQL bekerja dengan baik dalam lingkungan pengembangan dan pementasan di mana Anda ingin dengan cepat memunculkan instance database yang terisolasi. Jauh lebih cepat dan mudah untuk memulai database di Docker daripada mengonfigurasi instalasi MySQL konvensional di mesin virtual penuh

Meskipun Anda dapat menjalankan MySQL secara lokal di host Anda, hal ini menjadi terbatas saat Anda mengerjakan beberapa aplikasi secara bersamaan. Menggunakan wadah menawarkan pemisahan lengkap dari setiap data sistem dan kemampuan untuk menyediakan konfigurasi server MySQL yang unik untuk masing-masing

Ada beberapa skenario di mana memilih Dockerize database Anda mungkin kurang berdampak. Menuntut lingkungan produksi mungkin lebih baik dengan server MySQL khusus. Overhead kinerja Docker sederhana tetapi dapat menumpuk di beban kerja intensif I/O seperti yang ada di database tulis-berat. Server produksi bare-metal juga membuat instans Anda dapat diakses oleh orang-orang dalam peran pemeliharaan database yang tidak terbiasa dengan Docker

Meskipun demikian, Docker sangat mampu mendukung penerapan database MySQL, dari lingkungan pengembangan lokal hingga produksi. Menggunakannya untuk seluruh siklus Anda menjamin konsistensi. Jika instans produksi Anda menggunakan image Docker yang sama dengan pengembangan, Anda dapat yakin bahwa sistem live Anda akan berperilaku seperti yang dapat diprediksi. Inilah cara menjalankan server MySQL dalam wadah Docker

Memulai Wadah MySQL Anda

MySQL memiliki gambar Docker resmi yang tersedia di Docker Hub. Identifikasi terlebih dahulu tag gambar yang harus Anda gunakan. MySQL versi 5. 6, 5. 7, dan 8. 0 tersedia

Tag

docker exec -it mysql mysql -p
_3 menunjuk ke rilis terbaru, saat ini 8. 0. Hindari menggunakan tag ini, karena itu berarti Anda mungkin secara tidak sengaja menerima peningkatan versi MySQL utama di masa mendatang. Merujuk secara khusus versi yang Anda inginkan memungkinkan pendekatan pembaruan yang lebih terkontrol

Memulai wadah MySQL untuk pertama kali akan secara otomatis membuat

docker exec -it mysql mysql -p
4 pengguna awal. Anda harus memberikan kata sandi untuk pengguna ini atau meminta MySQL untuk membuatnya. Berikut adalah contoh menjalankan wadah MySQL dasar dengan kata sandi root yang ditentukan

docker run --name mysql -d \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=change-me \
    --restart unless-stopped \
    mysql:8

Hapus dan jalankan kembali wadah mysql
Memulai wadah MySQL dan menarik gambar Docker

Perintah ini memulai wadah dengan MySQL 8. Kata sandi untuk

docker exec -it mysql mysql -p
_4 pengguna diatur secara manual. Bendera
docker exec -it mysql mysql -p
6 berarti kontainer akan berjalan di latar belakang hingga dihentikan, terlepas dari sesi terminal Anda. Anda dapat melihat log startup penampung dengan
docker exec -it mysql mysql -p
7. Ketika "siap untuk koneksi" muncul, database MySQL Anda dapat diakses

Hapus dan jalankan kembali wadah mysql
Log bootstrap MySQL awal

Parameter

docker exec -it mysql mysql -p
_8 menginstruksikan Docker untuk selalu memulai ulang container. Ini berarti database MySQL Anda akan berjalan tanpa intervensi setelah mesin host melakukan boot ulang atau pembaruan daemon Docker. Kebijakan
docker exec -it mysql mysql -p
_9 yang digunakan di sini tidak akan memulai penampung jika Anda menghentikannya secara manual dengan
docker stop mysql
docker rm mysql
0

Flag

docker stop mysql
docker rm mysql
1 Docker memungkinkan penerusan porta ke dalam container sehingga Anda dapat mengakses database Anda di
docker stop mysql
docker rm mysql
2. Ini adalah port default MySQL; . Gunakan klien MySQL favorit Anda untuk terhubung melalui port ini dengan
docker exec -it mysql mysql -p
4 dan kata sandi pilihan Anda sebagai kredensial pengguna

Tanpa mengaktifkan port forwarding, Anda hanya dapat mengakses database Anda dari dalam container. Anda dapat melakukan ini kapan saja dengan menggunakan

docker stop mysql
docker rm mysql
4 untuk memasukkan cangkang ke dalam wadah

docker exec -it mysql mysql -p

Perintah ini menjalankan

docker stop mysql
docker rm mysql
_5 di dalam wadah
docker stop mysql
docker rm mysql
6. Bendera
docker stop mysql
docker rm mysql
_7 berarti aliran input terminal Anda akan diteruskan ke wadah sebagai TTY interaktif

Hapus dan jalankan kembali wadah mysql
Meluncurkan shell MySQL di dalam wadah Docker

Data Bertahan Dengan Volume

Meskipun penampung yang dibuat di atas adalah server MySQL yang berfungsi penuh, Anda perlu mengatur volume agar data Anda tidak hilang saat penampung berhenti. Gambar MySQL Docker dikonfigurasi untuk menyimpan semua datanya di direktori

docker stop mysql
docker rm mysql
8. Memasang volume ke direktori ini akan mengaktifkan penyimpanan data persisten yang bertahan lebih lama dari instance kontainer tunggal mana pun

Hentikan dan hapus penampung Anda sebelumnya untuk menghindari konflik penamaan

docker stop mysql
docker rm mysql

Kemudian mulai wadah baru dengan konfigurasi yang telah direvisi

docker run --name mysql -d \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=change-me \
    -v mysql:/var/lib/mysql \
    mysql:8

Menggunakan perintah ini untuk memulai wadah MySQL Anda akan membuat volume Docker baru bernama

docker stop mysql
docker rm mysql
6. Itu akan dipasang ke wadah di
docker stop mysql
docker rm mysql
8, tempat MySQL menyimpan file datanya. Setiap data yang ditulis ke direktori ini sekarang akan disimpan secara transparan di volume yang dikelola Docker di host Anda

Ulangi langkah-langkah untuk menghentikan dan menghapus penampung Anda

docker stop mysql
docker rm mysql

Hapus dan jalankan kembali wadah mysql
Menghentikan dan menghapus wadah Docker

Ulangi perintah

docker run --name mysql -d \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=change-me \
    -v mysql:/var/lib/mysql \
    mysql:8
_1 dengan argumen yang sama. Karena
docker stop mysql
docker rm mysql
6 bernama volume sudah ada, wadah baru akan menyimpan data yang dibuat oleh yang lama. Jika Anda ingin menghancurkan volume, gunakan
docker run --name mysql -d \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=change-me \
    -v mysql:/var/lib/mysql \
    mysql:8
3

Menggunakan Jaringan Kontainer

Pada contoh di atas, port forwarding digunakan untuk mengekspos server MySQL di jaringan host Anda. Jika Anda hanya akan terhubung ke MySQL dari dalam wadah Docker lain, seperti server API Anda, pendekatan yang lebih baik adalah membuat jaringan Docker khusus. Ini meningkatkan keamanan dengan membatasi eksposur database Anda

Pertama buat jaringan Docker untuk aplikasi Anda

docker network create example-app

Tentukan jaringan ini saat memulai penampung MySQL Anda

docker run --name mysql -d \
    -e MYSQL_ROOT_PASSWORD=change-me \
    -v mysql:/var/lib/mysql \
    --network example-app \
    mysql:8

Hubungkan wadah lain ke jaringan yang sama

docker run --name api-server -d \
    -p 80:80 \
    --network example-app \
    example-api-server:latest

Container API dan MySQL Anda sekarang berbagi jaringan. Anda dapat terhubung ke MySQL dari penampung API dengan mereferensikan nama host penampung MySQL. Ini cocok dengan nama penampung secara default. Di sini aplikasi Anda harus terhubung ke port 3306 pada host

docker stop mysql
docker rm mysql
6

Konfigurasi MySQL

Gambar MySQL resmi mendukung beberapa variabel lingkungan yang dapat Anda gunakan untuk mengonfigurasi status awal wadah Anda. Anda sudah melihatnya,

docker run --name mysql -d \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=change-me \
    -v mysql:/var/lib/mysql \
    mysql:8
5. Gunakan bendera
docker run --name mysql -d \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=change-me \
    -v mysql:/var/lib/mysql \
    mysql:8
_6 dengan
docker run --name mysql -d \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=change-me \
    -v mysql:/var/lib/mysql \
    mysql:8
1 untuk menyetel masing-masing variabel ini. Mereka hanya dihormati saat pertama kali wadah dimulai, saat direktori data MySQL kosong

  • docker run --name mysql -d \
        -p 3306:3306 \
        -e MYSQL_ROOT_PASSWORD=change-me \
        -v mysql:/var/lib/mysql \
        mysql:8
    8 - Nama skema database yang akan dibuat saat wadah dimulai
  • docker run --name mysql -d \
        -p 3306:3306 \
        -e MYSQL_ROOT_PASSWORD=change-me \
        -v mysql:/var/lib/mysql \
        mysql:8
    9 dan
    docker stop mysql
    docker rm mysql
    0 - Buat pengguna biasa baru saat penampung dimulai
  • docker stop mysql
    docker rm mysql
    1 - Tetapkan ini sebagai ganti
    docker run --name mysql -d \
        -p 3306:3306 \
        -e MYSQL_ROOT_PASSWORD=change-me \
        -v mysql:/var/lib/mysql \
        mysql:8
    5 jika Anda ingin MySQL menghasilkan kata sandi
    docker exec -it mysql mysql -p
    4 yang aman untuk Anda. Jika Anda mengaktifkan pengaturan ini, kata sandi akan dipancarkan ke log penampung (dapat diakses melalui perintah
    docker stop mysql
    docker rm mysql
    4) selama permulaan pertama. Tidak mungkin untuk mengambil kata sandi sesudahnya
  • docker stop mysql
    docker rm mysql
    5 - Pengaturan ini akan membuat pengguna
    docker exec -it mysql mysql -p
    4 dengan kata sandi kosong. Hanya gunakan opsi ini untuk instans database sekali pakai. Itu tidak aman dan akan membiarkan siapa pun terhubung ke MySQL dengan hak superuser

Menggunakan variabel lingkungan ini berarti nilainya akan terlihat oleh siapa saja yang dapat

docker stop mysql
docker rm mysql
7 penampung Anda. Pendekatan yang lebih aman adalah menggunakan rahasia atau volume Docker untuk menyuntikkan nilai sebagai file

Hapus dan jalankan kembali wadah mysql
MySQL menghasilkan kata sandi root acak

Gambar MySQL mendukung varian tambahan dari masing-masing variabel di atas. Akhiri nama variabel dengan

docker stop mysql
docker rm mysql
8 agar nilainya ditafsirkan sebagai jalur ke file yang berisi nilai sebenarnya. Contoh ini menyetel kata sandi pengguna
docker exec -it mysql mysql -p
_4 dengan aman dengan cara yang tidak dapat diperiksa dari luar penampung

mkdir secrets
echo "P@$$w0rd" > secrets/mysql-root-password

docker run --name mysql -d \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root-password \
    -v ./secrets:/run/secrets \
    --restart unless-stopped \
    mysql:8

Kata sandi ditulis ke file yang dipasang ke wadah menggunakan volume Docker. MySQL menginstruksikan bahwa kata sandi bersumber dari file yang dipasang melalui variabel lingkungan

docker network create example-app
0. Siapa pun yang melihat variabel lingkungan penampung akan melihat jalur file alih-alih kata sandi teks biasa

Membuat Gambar Kustom

Akan sangat membantu untuk membuat gambar Docker Anda sendiri jika aplikasi Anda memerlukan konfigurasi MySQL khusus. Menambahkan lapisan ekstra di atas gambar dasar MySQL resmi memberi Anda gambar yang siap digunakan di mana Anda dapat menghilangkan injeksi manual dari file konfigurasi MySQL

Berikut adalah contoh

docker network create example-app
_1 yang mengubah beberapa pengaturan MySQL

[mysqld]
innodb-ft-enable-stopword = 0
innodb-ft-min-token-size = 1

Gambar MySQL memuat file konfigurasi yang disimpan di direktori

docker network create example-app
2. File hanya akan dibaca saat server MySQL dimulai, yaitu saat Anda memulai wadah Docker Anda. Untuk memasukkan konfigurasi Anda ke dalam wadah Anda, gunakan volume Docker lain untuk mengikat mount file Anda, atau gunakan Dockerfile untuk memanggang perubahan Anda menjadi gambar baru

docker exec -it mysql mysql -p
0

Bangun citra Anda

docker exec -it mysql mysql -p
1

Hapus dan jalankan kembali wadah mysql
Membangun gambar Docker MySQL khusus

Sekarang Anda dapat menjalankan gambar Anda untuk memulai instance MySQL yang secara otomatis menggunakan file konfigurasi Anda

docker exec -it mysql mysql -p
2

Karena gambar khusus Anda didasarkan pada versi Docker Hub resmi, Anda dapat menggunakan semua variabel lingkungan yang ada yang dijelaskan di atas

Kesimpulan

Menjalankan MySQL dalam container Docker memberikan konsistensi dan isolasi lintas lingkungan untuk penerapan database Anda. Anda dapat menggunakan gambar MySQL resmi apa adanya atau membuat gambar khusus

Setelah Anda siap untuk beralih ke produksi, Anda dapat menggunakan kembali alur kerja pengembangan untuk mengaktifkan database Anda. Otomatiskan proses dengan meluncurkan wadah Anda di dalam pipa CI/CD Anda, di mana alat seperti Earthly dapat menawarkan build berulang dan wawasan tentang kegagalan apa pun. Earthly menawarkan daemon Docker sesuai permintaan dan reproduktifitas tinggi untuk membantu Anda mengotomatiskan build dengan lebih cepat

Saat Anda di sini

Earthly adalah kerangka kerja CI/CD yang mudah
Kembangkan pipeline CI/CD secara lokal dan jalankan di mana saja

Hapus dan jalankan kembali wadah mysql

James Walker

James Walker adalah pendiri Heron Web, sebuah studio pengembangan perangkat lunak berbasis di Inggris yang menyediakan solusi khusus untuk UKM. Dia berpengalaman dalam memberikan perangkat lunak khusus menggunakan alur kerja rekayasa yang dibangun di sekitar metodologi DevOps modern. James juga seorang penulis teknis lepas dan telah banyak menulis tentang siklus hidup pengembangan perangkat lunak, tren industri saat ini, serta konsep dan teknologi DevOps

Bagaimana Anda menjalankan kembali wadah?

Prosedur Hentikan/Mulai Ulang Kontainer .
Untuk memverifikasi apakah wadah telah berhenti, jalankan perintah docker ps -a. Status wadah yang dihentikan akan ditampilkan sebagai Keluar. buruh pelabuhan ps -a
Start a Docker container in a stopped state docker start Connect:Direct service automatically starts inside the container..

Alat apa yang Anda perlukan untuk menarik dan menjalankan wadah buruh pelabuhan MySQL?

Langkah 4. Setelah memulai penampung, Anda perlu terhubung ke MySQL dari localhost dengan menggunakan alat GUI seperti MySQL Workbench atau baris perintah.

Bagaimana cara menghapus wadah yang ada?

Prosedur untuk menghapus container Docker pengumpul data .
Run the following command to remove Docker container: docker stop docker rm .. .
Opsional. Jalankan perintah berikut untuk menghapus wadah dengan paksa. docker rm -f < Container_ID>

Apa perintah untuk menghapus semua kontainer yang berjalan dan berhenti?

Gunakan perintah docker container prune untuk menghapus semua container yang terhenti, atau lihat perintah docker system prune untuk menghapus container yang tidak digunakan selain .