Sunting: Jika Anda menggunakan Docker-for-mac atau Docker-for-Windows 18.03+, cukup sambungkan ke layanan mysql Anda menggunakan host host.docker.internal
(bukan 127.0.0.1
dalam string koneksi Anda).
Pada Docker 18.09.3, ini tidak berfungsi pada Docker-untuk-Linux. Sebuah memperbaiki telah disampaikan pada Maret 8, 2019 dan mudah-mudahan akan bergabung untuk basis kode. Sampai saat itu, solusinya adalah menggunakan wadah seperti yang dijelaskan dalam jawaban qoomon .
2020-01: beberapa kemajuan telah dibuat. Jika semuanya berjalan dengan baik, ini akan mendarat di Docker 20.04
TLDR
Gunakan --network="host"
dalam docker run
perintah Anda , maka 127.0.0.1
dalam wadah buruh pelabuhan Anda akan menunjuk ke host buruh pelabuhan Anda.
Catatan: Mode ini hanya berfungsi di Docker untuk Linux, sesuai dokumentasinya .
Catatan tentang mode jaringan wadah buruh pelabuhan
Docker menawarkan berbagai mode jaringan saat menjalankan wadah. Tergantung pada mode yang Anda pilih, Anda akan terhubung ke database MySQL Anda yang berjalan pada host buruh pelabuhan secara berbeda.
docker run --network = "bridge" (default)
Docker membuat jembatan bernama docker0
secara default. Baik host buruh pelabuhan dan wadah buruh pelabuhan memiliki alamat IP di jembatan itu.
pada host Docker, ketik sudo ip addr show docker0
Anda akan memiliki output seperti:
[vagrant@docker:~] $ sudo ip addr show docker0
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::5484:7aff:fefe:9799/64 scope link
valid_lft forever preferred_lft forever
Jadi di sini host buruh pelabuhan saya memiliki alamat IP 172.17.42.1
pada docker0
antarmuka jaringan.
Sekarang mulai wadah baru dan dapatkan shell di atasnya: docker run --rm -it ubuntu:trusty bash
dan dalam jenis wadah ip addr show eth0
untuk menemukan bagaimana antarmuka jaringan utamanya diatur:
root@e77f6a1b3740:/# ip addr show eth0
863: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 66:32:13:f0:f1:e3 brd ff:ff:ff:ff:ff:ff
inet 172.17.1.192/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::6432:13ff:fef0:f1e3/64 scope link
valid_lft forever preferred_lft forever
Di sini wadah saya memiliki alamat IP 172.17.1.192
. Sekarang lihat tabel routing:
root@e77f6a1b3740:/# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 172.17.42.1 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 * 255.255.0.0 U 0 0 0 eth0
Jadi Alamat IP dari host buruh pelabuhan 172.17.42.1
diatur sebagai rute default dan dapat diakses dari wadah Anda.
root@e77f6a1b3740:/# ping 172.17.42.1
PING 172.17.42.1 (172.17.42.1) 56(84) bytes of data.
64 bytes from 172.17.42.1: icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from 172.17.42.1: icmp_seq=2 ttl=64 time=0.201 ms
64 bytes from 172.17.42.1: icmp_seq=3 ttl=64 time=0.116 ms
docker run --network = "host"
Atau Anda dapat menjalankan wadah buruh pelabuhan dengan pengaturan jaringan diatur kehost
. Kontainer semacam itu akan berbagi tumpukan jaringan dengan host buruh pelabuhan dan dari sudut pandang wadah, localhost
(atau 127.0.0.1
) akan merujuk pada host buruh pelabuhan.
Ketahuilah bahwa port apa pun yang dibuka dalam wadah buruh pelabuhan Anda akan dibuka pada host buruh pelabuhan. Dan ini tanpa memerlukan opsi -p
atau-P
docker run
.
Konfigurasi IP pada host buruh pelabuhan saya:
[vagrant@docker:~] $ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
valid_lft forever preferred_lft forever
dan dari wadah buruh pelabuhan dalam mode host :
[vagrant@docker:~] $ docker run --rm -it --network=host ubuntu:trusty ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
valid_lft forever preferred_lft forever
Seperti yang Anda lihat, kedua buruh pelabuhan dan wadah buruh pelabuhan berbagi antarmuka jaringan yang sama persis dan karenanya memiliki alamat IP yang sama.
Menghubungkan ke MySQL dari wadah
mode jembatan
Untuk mengakses MySQL yang berjalan pada host buruh pelabuhan dari wadah dalam mode bridge , Anda perlu memastikan layanan MySQL mendengarkan koneksi pada 172.17.42.1
alamat IP.
Untuk melakukannya, pastikan Anda memiliki salah satu bind-address = 172.17.42.1
atau bind-address = 0.0.0.0
dalam file konfigurasi MySQL Anda (my.cnf).
Jika Anda perlu mengatur variabel lingkungan dengan alamat IP gateway, Anda dapat menjalankan kode berikut dalam sebuah wadah:
export DOCKER_HOST_IP=$(route -n | awk '/UG[ \t]/{print $2}')
kemudian di aplikasi Anda, gunakan DOCKER_HOST_IP
variabel lingkungan untuk membuka koneksi ke MySQL.
Catatan: jika Anda menggunakan bind-address = 0.0.0.0
server MySQL Anda akan mendengarkan koneksi pada semua antarmuka jaringan. Itu berarti server MySQL Anda dapat dijangkau dari Internet; pastikan untuk mengatur aturan firewall yang sesuai.
Catatan 2: jika Anda menggunakan bind-address = 172.17.42.1
server MySQL Anda tidak akan mendengarkan koneksi yang dibuat 127.0.0.1
. Proses yang berjalan pada host buruh pelabuhan yang ingin terhubung ke MySQL harus menggunakan 172.17.42.1
alamat IP.
mode tuan rumah
Untuk mengakses MySQL yang berjalan di host buruh pelabuhan dari wadah dalam mode host , Anda dapat tetap bind-address = 127.0.0.1
menggunakan konfigurasi MySQL Anda dan yang perlu Anda lakukan hanyalah menyambung ke 127.0.0.1
dari wadah Anda:
[vagrant@docker:~] $ docker run --rm -it --network=host mysql mysql -h 127.0.0.1 -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 5.5.41-0ubuntu0.14.04.1 (Ubuntu)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Catatan: Jangan gunakan mysql -h 127.0.0.1
dan tidak mysql -h localhost
; jika tidak, klien MySQL akan mencoba terhubung menggunakan soket unix.