(Ini mungkin pertanyaan bodoh karena pengetahuan saya yang terbatas dengan Docker atau administrasi mysql, tetapi karena saya menghabiskan sepanjang malam untuk masalah ini, saya berani menanyakannya.)
Pendeknya
Saya ingin menjalankan mysql di kontainer buruh pelabuhan dan menghubungkannya dari host saya. Sejauh ini, yang terbaik yang saya capai adalah:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Keterangan lebih lanjut
Saya menggunakan yang berikut ini Dockerfile
:
FROM ubuntu:14.04.3
RUN apt-get update && apt-get install -y mysql-server
# Ensure we won't bind to localhost only
RUN grep -v bind-address /etc/mysql/my.cnf > temp.txt \
&& mv temp.txt /etc/mysql/my.cnf
# It doesn't seem needed since I'll use -p, but it can't hurt
EXPOSE 3306
CMD /etc/init.d/mysql start && tail -F /var/log/mysql.log
Di direktori tempat ada file ini, saya berhasil membuat gambar dan menjalankannya dengan:
> docker build -t my-image .
> docker run -d -p 12345:3306 my-image
Saat saya melampirkan ke gambar, tampaknya berfungsi dengan baik:
# from the host
> docker exec -it <my_image_name> bash
#inside of the container now
$ mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
[...]
Namun saya tidak begitu sukses dari tuan rumah:
> mysql -P 12345 -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Lebih detail lagi
- Saya telah melihat bahwa ada pertanyaan yang sepertinya milik saya . Namun, itu tidak sama (dan toh tidak ada jawaban)
- Saya telah melihat bahwa ada gambar yang didedikasikan untuk mysql , tetapi saya tidak lebih berhasil dengan mereka
- Saya
grep -v
mungkin merasa aneh. Memang, mungkin ada cara yang lebih bersih untuk melakukannya. Tetapi ketika saya melampirkan gambar saya, saya dapat mengamati bahwa itu benar-benar berfungsi seperti yang diharapkan (yaitu: menghapusbind-address
). Dan saya bisa melihat di wadah/var/log/mysql/error.log
:
Nama host server (alamat-bind): '0.0.0.0'; port: 3306 - '0.0.0.0' berubah menjadi '0.0.0.0'; Soket server dibuat pada IP: '0.0.0.0'.
sumber
Jawaban:
Jika host Docker MySQL Anda berjalan dengan benar, Anda dapat menyambungkannya dari mesin lokal, tetapi Anda harus menentukan host, port, dan protokol seperti ini:
Ubah 3306 ke nomor port yang telah Anda teruskan dari kontainer Docker (dalam kasus Anda, ini adalah 12345).
Karena Anda menjalankan MySQL di dalam container Docker, soket tidak tersedia dan Anda harus terhubung melalui TCP. Pengaturan "--protocol" pada perintah mysql akan mengubahnya.
sumber
--socket=/var/run/mysqld/mysqld.sock
2. Pasang file ini di luar wadah Docker 3. Tentukan jalur ke soket di klien MySQL dengan--socket=/host/mysql.sock
--protocol=tcp
akhirnya membuat koneksi berhasil. Terima kasih @maniekq atas jawaban yang bagus dan penjelasan Anda di soket melalui komentar Anda!Jika Anda menggunakan "127.0.0.1" daripada localhost, mysql akan menggunakan metode tcp dan Anda dapat menghubungkan container dengan:
sumber
Saya sarankan untuk memeriksa penulisan docker. Begini cara kerjanya:
Buat file bernama, docker-compose.yml yang terlihat seperti ini:
Selanjutnya, jalankan:
Catatan:
Sekarang, Anda dapat mengakses konsol mysql sebagai berikut:
Catatan:
Anda dapat meneruskan flag -d untuk menjalankan container mysql / mariadb dalam mode detached / background.
Kata sandinya adalah "wp" yang didefinisikan dalam file docker-compose.yml.
Saran yang sama dengan maniekq tetapi contoh lengkap dengan buruh pelabuhan-menulis.
sumber
--protocol=tcp
memperbaiki segalanya untukku. Terima kasih!Metode sederhana adalah dengan membagikan soket mysql unix ke mesin host. Kemudian hubungkan melalui soket
Langkah:
mkdir /host
docker run -it -v /host:/shared <mysql image>
./etc/my.cnf
dan ubah entri soket di file menjadisocket=/shared/mysql.sock
service mysql restart
di buruh pelabuhanmysql -u root --socket=/host/mysql.sock
. Jika kata sandi gunakan opsi -psumber
jika Anda menjalankan buruh pelabuhan di bawah mesin buruh pelabuhan?
jalankan untuk mendapatkan ip:
mengembalikan ip untuk mesin dan mencoba menghubungkan mysql:
sumber
Saya melakukan ini dengan menjalankan kontainer buruh pelabuhan sementara di server saya jadi saya tidak perlu khawatir tentang apa yang diinstal di host saya. Pertama, saya mendefinisikan apa yang saya butuhkan (yang harus Anda modifikasi untuk tujuan Anda):
Saya selalu membuat jaringan buruh pelabuhan baru yang akan dibutuhkan oleh wadah lain:
Mulai server database mySQL:
Tangkap alamat IP dari penampung server baru
Buka antarmuka baris perintah ke server:
Penampung terakhir ini akan menghapus dirinya sendiri saat Anda keluar dari antarmuka mySQL, sementara server akan terus berjalan. Anda juga dapat berbagi volume antara server dan host untuk mempermudah mengimpor data atau skrip. Semoga ini membantu!
sumber
Ingatlah untuk mengubah pengguna, port dan host agar sesuai dengan konfigurasi Anda. Bendera -p diperlukan jika pengguna database Anda dikonfigurasi dengan kata sandi
sumber
Untuk konversi, Anda dapat membuat
~/.my.cnf
file di host:Kemudian lain kali jalankan
mysql
klien mysql untuk membuka koneksi.sumber
Saya dapat menghubungkan server sql5.7 saya yang berjalan di host saya menggunakan perintah di bawah ini: mysql -h 10.10.1.7 -P 3307 --protocol = tcp -u root -p di mana ip yang diberikan adalah ip host saya dan 3307 adalah port forwaded di mysql docker. Setelah memasukkan perintah ketikkan kata sandi untuk myql. itu dia.Sekarang Anda terhubung ke kontainer buruh pelabuhan mysql dari mesin host Anda
sumber
jalankan perintah berikut untuk menjalankan container
jalankan perintah ini untuk mendapatkan db mysql di mesin host
dalam kasusmu itu
sumber
--protocol=tcp
bendera seperti yang dijelaskan dalam beberapa komentar / jawaban lainnya. Dalam kasus saya, itu sangat membingungkan karena saya memiliki instance mysql lokal, non-docker, dan juga berjalan. Secara default, meskipun port ditentukan, meskipun portnya salah, perintah 'mysql' akan terhubung melalui file socket ke instance lokal.mysql -u root -P <EXPOSED_DOCKER_PORT_HERE> -h <YOUR_HOST_IP_ADDRESS_HERE> --protocol=tcp -p
. Bendera,--protocol=tcp
adalah kunci untuk membuat ini berfungsi.Di terminal Anda, jalankan:
docker exec -it container_name /bin/bash
Kemudian:mysql
sumber
BAIK. Saya akhirnya memecahkan masalah ini. Berikut solusi saya yang digunakan di https://sqlflow.org/sqlflow .
Solusi Lengkap
Untuk membuat demo mandiri, saya memindahkan semua kode yang diperlukan ke https://github.com/wangkuiyi/mysql-server-in-docker .
Kunci Solusi
Saya tidak menggunakan gambar resmi di DockerHub.com https://hub.docker.com/r/mysql/mysql-server . Sebagai gantinya, saya membuatnya sendiri dengan menginstal MySQL di Ubuntu 18.04. Pendekatan ini memberi saya kesempatan untuk memulai mysqld dan mengikatnya ke 0.0.0.0 (semua IP) .
Untuk detailnya, lihat baris ini di repo GitHub saya.
Untuk Memverifikasi Solusi Saya
apt-get
.Terhubung dari Penampung Lain di Host yang Sama
Kita dapat menjalankan klien MySQL bahkan dari container lain (di host yang sama).
Terhubung dari Host Lain
Di iMac saya, saya menginstal klien MySQL menggunakan Homebrew.
Kemudian, saya dapat mengakses host Ubuntu di atas (192.168.1.22).
Terhubung dari Penampung yang Berjalan di Host Lain
Saya bahkan dapat menjalankan klien MySQL dalam wadah yang berjalan di iMac untuk terhubung ke server MySQL dalam wadah di workstation Ubuntu saya.
Kasus Khusus
Jika kita menjalankan klien dan server MySQL dalam wadah terpisah yang berjalan pada host yang sama - ini bisa terjadi saat kita menyiapkan CI, kita tidak perlu membuat image Docker server MySQL kita sendiri. Sebagai gantinya, kita bisa menggunakan
--net=container:mysql_server_container_name
saat kita menjalankan wadah klien.Untuk memulai server
Untuk memulai klien
sumber
docker run -e MYSQL_ROOT_PASSWORD = pass --name sql-db -p 3306: 3306 mysql
buruh pelabuhan exec -it sql-db bash
mysql -u root -p
sumber
ERROR 1524 (HY000): Plugin 'unix_socket' is not loaded
ubah "localhost" ke alamat ip asli Anda
karena ke mysql_connect ()
sumber