Hướng dẫn how to connect to mysql docker container from another container - cách kết nối với vùng chứa mysql docker từ một vùng chứa khác

Tôi đã thiết lập container Docker với MySQL để lộ 3306. Tôi đã chỉ định người dùng cơ sở dữ liệu, mật khẩu cơ sở dữ liệu và tạo DB thử nghiệm và cung cấp các đặc quyền cho người dùng mới. Trong một thùng chứa khác, tôi muốn truy cập vào DB này. Vì vậy, tôi đã thiết lập container mới với tập lệnh PHP đơn giản là tạo bảng mới trong DB này. Tôi biết rằng IP của MySQL Container là 172,17.0.2 Vì vậy:
In another container i want to accesso to this db.
So i set up new container with a simply php script that create new table in this db.
I know that mysql container's ip is 172.17.0.2 so :

$mysqli = new mysqli("172.17.0.2", "mattia", "prova", "prova");

Hơn sử dụng mysqli, tôi tạo bảng mới và tất cả hoạt động tốt. Nhưng tôi nghĩ rằng kết nối với container bằng địa chỉ IP của anh ấy là không tốt. Có cách nào khác để chỉ định máy chủ DB không? Tôi đã thử với tên máy chủ của thùng chứa MySQL nhưng nó không hoạt động.
But i think that connect to container using his ip address is not good.
Is there another way to specify db host? I tryed with the hostname of the mysql container but it doens't work.

Hướng dẫn how to connect to mysql docker container from another container - cách kết nối với vùng chứa mysql docker từ một vùng chứa khác

hỏi ngày 16 tháng 2 năm 2016 lúc 10:25Feb 16, 2016 at 10:25

Hướng dẫn how to connect to mysql docker container from another container - cách kết nối với vùng chứa mysql docker từ một vùng chứa khác

Cờ

docker run -d -name app-container-name --link mysql-container-name app-image-name
0 được coi là một tính năng kế thừa, bạn nên sử dụng các mạng do người dùng xác định.

Bạn có thể chạy cả hai thùng chứa trên cùng một mạng:

docker run -d --name php_container --network my_network my_php_image

docker run -d --name mysql_container --network my_network my_mysql_image

Mỗi container trên mạng đó sẽ có thể giao tiếp với nhau bằng tên container làm tên máy chủ.

Đã trả lời ngày 3 tháng 1 năm 2019 lúc 7:06Jan 3, 2019 at 7:06

Tiago ctiago cTiago C

7166 Huy hiệu bạc3 Huy hiệu đồng6 silver badges3 bronze badges

5

Bạn cần liên kết các thùng chứa Docker của mình cùng với-Cờ liên kết trong lệnh docker chạy hoặc sử dụng tính năng liên kết trong Docker-compose. Ví dụ:

docker run -d -name app-container-name --link mysql-container-name app-image-name

Theo cách này, Docker sẽ thêm địa chỉ IP của thùng chứa MySQL vào /etc /hosts tệp của container ứng dụng của bạn. Để biết tài liệu đầy đủ, hãy tham khảo: MySQL Docker Container: Hiểu những điều cơ bản

Đã trả lời ngày 4 tháng 1 năm 2017 lúc 4:14Jan 4, 2017 at 4:14

Sarasarasara

1.0601 Huy hiệu vàng11 Huy hiệu bạc20 Huy hiệu đồng 201 gold badge11 silver badges20 bronze badges

1

Trong tập tin Docker-compose.yml của bạn Thêm thuộc tính liên kết vào dịch vụ máy chủ web của bạn: https://docs.docker.com/compose/networking/#links

Sau đó, trong chuỗi truy vấn của bạn, giá trị của tham số máy chủ là tên dịch vụ cơ sở dữ liệu của bạn:

$mysqli = new mysqli("database", "mattia", "prova", "prova");

Đã trả lời ngày 5 tháng 3 năm 2019 lúc 8:42Mar 5, 2019 at 8:42

0

Nếu bạn đang sử dụng docker-compose, hơn cơ sở dữ liệu sẽ có thể truy cập được dưới tên dịch vụ.

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
    ports:
      - "8001:5432"

Sau đó, cơ sở dữ liệu có thể truy cập bằng cách sử dụng:

docker run -d -name app-container-name --link mysql-container-name app-image-name
1. Ở đây tên dịch vụ đồng thời tên máy chủ trong mạng nội bộ.

Trích dẫn từ Docker Docs:

Khi bạn chạy Docker-Compose Up, điều sau đây xảy ra:

  1. Một mạng được gọi là myApp_default được tạo.
  2. Một container được tạo bằng cấu hình web Web. Nó tham gia mạng myApp_default dưới tên web.
  3. Một container được tạo bằng cấu hình DB. Nó tham gia mạng myApp_default dưới tên DB.

Nguồn: https://docs.docker.com/compose/networking/

Đã trả lời ngày 16 tháng 3 lúc 13:31Mar 16 at 13:31

Bojan Hrnkasbojan HrnkasBojan Hrnkas

1.50815 huy hiệu bạc22 Huy hiệu đồng15 silver badges22 bronze badges

Thời gian đọc ước tính: 11 phút

Cho đến thời điểm này, chúng tôi đã làm việc với các ứng dụng container duy nhất. Nhưng, bây giờ chúng tôi muốn thêm MySQL vào ngăn xếp ứng dụng. Câu hỏi sau đây thường được đặt ra - Mysql sẽ chạy ở đâu? Cài đặt nó trong cùng một container hoặc chạy nó một cách riêng biệt? Nói chung, mỗi container nên làm một việc và làm tốt. Một vài lý do:each container should do one thing and do it well. A few reasons:

  • Có một cơ hội tốt mà bạn phải mở rộng quy mô API và kết thúc khác với cơ sở dữ liệu
  • Các thùng chứa riêng cho phép bạn phiên bản và phiên bản cập nhật trong sự cô lập
  • Mặc dù bạn có thể sử dụng một thùng chứa cho cơ sở dữ liệu cục bộ, bạn có thể muốn sử dụng dịch vụ được quản lý cho cơ sở dữ liệu trong sản xuất. Bạn không muốn gửi công cụ cơ sở dữ liệu của bạn với ứng dụng của bạn sau đó.
  • Chạy nhiều quy trình sẽ yêu cầu Trình quản lý quy trình (container chỉ bắt đầu một quy trình), điều này làm tăng thêm độ phức tạp để khởi động/tắt máy

Và có nhiều lý do. Vì vậy, chúng tôi sẽ cập nhật ứng dụng của mình để hoạt động như thế này:

Hướng dẫn how to connect to mysql docker container from another container - cách kết nối với vùng chứa mysql docker từ một vùng chứa khác

Mạng container

Hãy nhớ rằng các container, theo mặc định, chạy trong sự cô lập và không biết bất cứ điều gì về các quy trình hoặc container khác trên cùng một máy. Vì vậy, làm thế nào để chúng ta cho phép một container nói chuyện với người khác? Câu trả lời là kết nối mạng. Bây giờ, bạn không phải là một kỹ sư mạng (hooray!). Đơn giản chỉ cần nhớ quy tắc này ...networking. Now, you don’t have to be a network engineer (hooray!). Simply remember this rule...

Ghi chú

Nếu hai container nằm trên cùng một mạng, họ có thể nói chuyện với nhau. Nếu họ aren, họ có thể.

Bắt đầu MySQL

Có hai cách để đặt một container trên mạng: 1) gán nó khi bắt đầu hoặc 2) Kết nối một thùng chứa hiện có. Hiện tại, chúng tôi sẽ tạo mạng trước và gắn thùng chứa MySQL khi khởi động.

  1. Tạo mạng.

     $ docker network create todo-app
    

  2. Bắt đầu một thùng chứa MySQL và gắn nó vào mạng. Chúng tôi cũng sẽ xác định một vài biến môi trường mà cơ sở dữ liệu sẽ sử dụng để khởi tạo cơ sở dữ liệu (xem phần Biến môi trường trên mạng trong danh sách Hub Docker MySQL).

     $ docker run -d \
         --network todo-app --network-alias mysql \
         -v todo-mysql-data:/var/lib/mysql \
         -e MYSQL_ROOT_PASSWORD=secret \
         -e MYSQL_DATABASE=todos \
         mysql:5.7
    

    Nếu bạn đang sử dụng chip dựa trên cánh tay, ví dụ: MacBook M1 Chips / Apple Silicon, sau đó sử dụng lệnh này.

     $ docker run -d \
         --network todo-app --network-alias mysql \
         --platform "linux/amd64" \
         -v todo-mysql-data:/var/lib/mysql \
         -e MYSQL_ROOT_PASSWORD=secret \
         -e MYSQL_DATABASE=todos \
         mysql:5.7
    

    Nếu bạn đang sử dụng Windows thì hãy sử dụng lệnh này trong PowerShell.

     PS> docker run -d `
         --network todo-app --network-alias mysql `
         -v todo-mysql-data:/var/lib/mysql `
         -e MYSQL_ROOT_PASSWORD=secret `
         -e MYSQL_DATABASE=todos `
         mysql:5.7
    

    Bạn cũng sẽ thấy chúng tôi đã chỉ định cờ

    docker run -d -name app-container-name --link mysql-container-name app-image-name
    
    2. Chúng tôi sẽ trở lại điều đó chỉ trong giây lát.

    Mẹo

    Bạn có thể nhận thấy chúng tôi sử dụng một tập có tên

    docker run -d -name app-container-name --link mysql-container-name app-image-name
    
    3 tại đây và gắn nó tại
    docker run -d -name app-container-name --link mysql-container-name app-image-name
    
    4, đó là nơi MySQL lưu trữ dữ liệu của nó. Tuy nhiên, chúng tôi không bao giờ chạy một lệnh
    docker run -d -name app-container-name --link mysql-container-name app-image-name
    
    5. Docker nhận ra chúng tôi muốn sử dụng một âm lượng được đặt tên và tạo một âm lượng tự động cho chúng tôi.

  3. Để xác nhận chúng tôi có cơ sở dữ liệu lên và chạy, kết nối với cơ sở dữ liệu và xác minh nó kết nối.

     $ docker exec -it  mysql -u root -p
    

    Khi lời nhắc mật khẩu xuất hiện, hãy nhập bí mật. Trong vỏ MySQL, hãy liệt kê cơ sở dữ liệu và xác minh bạn thấy cơ sở dữ liệu

    docker run -d -name app-container-name --link mysql-container-name app-image-name
    
    6.secret. In the MySQL shell, list the databases and verify you see the
    docker run -d -name app-container-name --link mysql-container-name app-image-name
    
    6 database.

    Bạn sẽ thấy đầu ra trông như thế này:

    docker run -d --name php_container --network my_network my_php_image
    
    docker run -d --name mysql_container --network my_network my_mysql_image
    
    0

    Thoát khỏi vỏ MySQL để quay lại vỏ trên máy của chúng tôi.

    Hoan hô! Chúng tôi có cơ sở dữ liệu

    docker run -d -name app-container-name --link mysql-container-name app-image-name
    
    6 của chúng tôi và nó đã sẵn sàng để chúng tôi sử dụng!

Kết nối với MySQL

Bây giờ chúng ta đã biết MySQL đang hoạt động, hãy để sử dụng nó! Nhưng, câu hỏi là ... làm thế nào? Nếu chúng ta chạy một thùng chứa khác trên cùng một mạng, làm thế nào để chúng ta tìm thấy container (hãy nhớ mỗi container có địa chỉ IP riêng)?

Để tìm ra nó, chúng tôi sẽ sử dụng thùng chứa Nicolaka/Netshoot, nơi vận chuyển rất nhiều công cụ hữu ích để khắc phục sự cố hoặc gỡ lỗi mạng.

  1. Bắt đầu một thùng chứa mới bằng hình ảnh Nicolaka/Netshoot. Đảm bảo kết nối nó với cùng một mạng.

    docker run -d --name php_container --network my_network my_php_image
    
    docker run -d --name mysql_container --network my_network my_mysql_image
    
    1

  2. Bên trong container, chúng tôi sẽ sử dụng lệnh

    docker run -d -name app-container-name --link mysql-container-name app-image-name
    
    8, đây là một công cụ DNS hữu ích. Chúng tôi sẽ tìm kiếm địa chỉ IP cho tên máy chủ
    docker run -d -name app-container-name --link mysql-container-name app-image-name
    
    9.

    Và bạn sẽ nhận được một đầu ra như thế này ...

    docker run -d --name php_container --network my_network my_php_image
    
    docker run -d --name mysql_container --network my_network my_mysql_image
    
    2

    Trong phần Trả lời của người Viking, bạn sẽ thấy một bản ghi

    $mysqli = new mysqli("database", "mattia", "prova", "prova");
    
    0 cho
    docker run -d -name app-container-name --link mysql-container-name app-image-name
    
    9 giải quyết thành
    $mysqli = new mysqli("database", "mattia", "prova", "prova");
    
    2 (địa chỉ IP của bạn rất có thể sẽ có một giá trị khác). Mặc dù
    docker run -d -name app-container-name --link mysql-container-name app-image-name
    
    9 không phải là tên máy chủ hợp lệ, Docker đã có thể giải quyết nó thành địa chỉ IP của container có bí danh mạng đó (hãy nhớ cờ
    docker run -d -name app-container-name --link mysql-container-name app-image-name
    
    2 mà chúng tôi đã sử dụng trước đó?).

    Điều này có nghĩa là ... Ứng dụng của chúng tôi chỉ cần kết nối với máy chủ có tên

    docker run -d -name app-container-name --link mysql-container-name app-image-name
    
    9 và nó sẽ nói chuyện với cơ sở dữ liệu! Nó không đơn giản hơn nhiều so với thế!

Chạy ứng dụng của bạn với MySQL

Ứng dụng TODO hỗ trợ cài đặt của một vài biến môi trường để chỉ định cài đặt kết nối MySQL. Họ đang:

  • $mysqli = new mysqli("database", "mattia", "prova", "prova");
    
    6 - Tên máy chủ cho máy chủ MySQL đang chạy
  • $mysqli = new mysqli("database", "mattia", "prova", "prova");
    
    7 - Tên người dùng sẽ sử dụng cho kết nối
  • $mysqli = new mysqli("database", "mattia", "prova", "prova");
    
    8 - Mật khẩu để sử dụng cho kết nối
  • $mysqli = new mysqli("database", "mattia", "prova", "prova");
    
    9 - Cơ sở dữ liệu để sử dụng một khi được kết nối

Cài đặt cài đặt kết nối thông qua env vars

Mặc dù sử dụng env vars để đặt cài đặt kết nối thường ổn để phát triển, nhưng nó rất nản lòng khi chạy các ứng dụng trong sản xuất. Diogo Monica, cựu lãnh đạo an ninh tại Docker, đã viết một bài đăng trên blog tuyệt vời giải thích lý do tại sao.HIGHLY DISCOURAGED when running applications in production. Diogo Monica, the former lead of security at Docker, wrote a fantastic blog post explaining why.

Một cơ chế an toàn hơn là sử dụng hỗ trợ bí mật được cung cấp bởi khung điều phối container của bạn. Trong hầu hết các trường hợp, các bí mật này được gắn dưới dạng tệp trong thùng chứa đang chạy. Bạn có thể thấy nhiều ứng dụng (bao gồm hình ảnh MySQL và ứng dụng TODO) cũng hỗ trợ env vars với hậu tố

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
    ports:
      - "8001:5432"
0 để trỏ đến một tệp chứa biến.

Ví dụ, việc đặt

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
    ports:
      - "8001:5432"
1 var sẽ khiến ứng dụng sử dụng nội dung của tệp được tham chiếu làm mật khẩu kết nối. Docker không làm bất cứ điều gì để hỗ trợ các env vars này. Ứng dụng của bạn sẽ cần biết để tìm kiếm biến và nhận nội dung tệp.

Với tất cả những điều đó được giải thích, hãy để bắt đầu container sẵn sàng cho chúng tôi!

  1. Lưu ý: Đối với các phiên bản MySQL 8.0 trở lên, hãy đảm bảo bao gồm các lệnh sau trong
    docker run -d -name app-container-name --link mysql-container-name app-image-name
    
    9.
    : for MySQL versions 8.0 and higher, make sure to include the following commands in
    docker run -d -name app-container-name --link mysql-container-name app-image-name
    
    9.

    docker run -d --name php_container --network my_network my_php_image
    
    docker run -d --name mysql_container --network my_network my_mysql_image
    
    3

  2. Chúng tôi sẽ chỉ định từng biến môi trường ở trên, cũng như kết nối container với mạng ứng dụng của chúng tôi.

    docker run -d --name php_container --network my_network my_php_image
    
    docker run -d --name mysql_container --network my_network my_mysql_image
    
    4

    Nếu bạn đang sử dụng chip dựa trên cánh tay, ví dụ: MacBook M1 Chips / Apple Silicon, sau đó sử dụng lệnh này.

    docker run -d --name php_container --network my_network my_php_image
    
    docker run -d --name mysql_container --network my_network my_mysql_image
    
    5

    Nếu bạn đang sử dụng Windows thì hãy sử dụng lệnh này trong PowerShell.

    docker run -d --name php_container --network my_network my_php_image
    
    docker run -d --name mysql_container --network my_network my_mysql_image
    
    6

  3. Nếu chúng ta nhìn vào nhật ký cho container (

    version: "3.9"
    services:
      web:
        build: .
        ports:
          - "8000:8000"
      db:
        image: postgres
        ports:
          - "8001:5432"
    
    3), chúng ta sẽ thấy một thông báo cho biết nó sử dụng cơ sở dữ liệu MySQL.

    docker run -d --name php_container --network my_network my_php_image
    
    docker run -d --name mysql_container --network my_network my_mysql_image
    
    7

  4. Mở ứng dụng trong trình duyệt của bạn và thêm một vài mục vào danh sách việc cần làm của bạn.

  5. Kết nối với cơ sở dữ liệu MySQL và chứng minh rằng các mục đang được ghi vào cơ sở dữ liệu. Hãy nhớ rằng, mật khẩu là bí mật.secret.

    docker run -d --name php_container --network my_network my_php_image
    
    docker run -d --name mysql_container --network my_network my_mysql_image
    
    8

    Và trong vỏ MySQL, hãy chạy như sau:

    docker run -d --name php_container --network my_network my_php_image
    
    docker run -d --name mysql_container --network my_network my_mysql_image
    
    9

    Rõ ràng, bàn của bạn sẽ trông khác vì nó có các mặt hàng của bạn. Nhưng, bạn sẽ thấy họ được lưu trữ ở đó!

Nếu bạn nhìn nhanh vào bảng điều khiển Docker, bạn sẽ thấy rằng chúng tôi có hai container ứng dụng đang chạy. Nhưng, không có dấu hiệu thực sự nào cho thấy chúng được nhóm lại với nhau trong một ứng dụng duy nhất. Chúng tôi sẽ thấy làm thế nào để làm cho điều đó tốt hơn trong thời gian ngắn!

Hướng dẫn how to connect to mysql docker container from another container - cách kết nối với vùng chứa mysql docker từ một vùng chứa khác

Tóm tắt lại

Tại thời điểm này, chúng tôi có một ứng dụng hiện lưu trữ dữ liệu của nó trong cơ sở dữ liệu bên ngoài chạy trong một thùng chứa riêng. Chúng tôi đã học được một chút về mạng lưới container và thấy cách thức khám phá dịch vụ có thể được thực hiện bằng DNS.

Nhưng, có một cơ hội tốt mà bạn bắt đầu cảm thấy hơi choáng ngợp với mọi thứ bạn cần làm để khởi động ứng dụng này. Chúng tôi phải tạo một mạng, bắt đầu các container, chỉ định tất cả các biến môi trường, hiển thị các cổng và hơn thế nữa! Đó là rất nhiều điều để nhớ và nó chắc chắn làm cho mọi thứ khó khăn hơn để truyền lại cho người khác.

Trong phần tiếp theo, chúng tôi sẽ nói về Docker Compose. Với Docker Compose, chúng tôi có thể chia sẻ các ngăn xếp ứng dụng của mình theo cách dễ dàng hơn nhiều và để người khác quay chúng lại bằng một lệnh duy nhất (và đơn giản)!

Bắt đầu, thiết lập, định hướng, nhanh chóng, giới thiệu, khái niệm, container, Docker Desktop

Làm cách nào để kết nối với thùng chứa MySQL từ một thùng chứa khác?

Để cho phép một container nói chuyện với người khác, hãy sử dụng mạng. Nếu hai container nằm trên cùng một mạng, họ có thể nói chuyện với nhau ...
Tạo mạng bằng cách sử dụng lệnh này. ....
Bắt đầu một thùng chứa MySQL và đính kèm mạng. ....
Nhận ID container của bạn bằng cách sử dụng lệnh Docker PS ..

Làm cách nào để kết nối một container với thùng chứa khác trong Docker?

Cách sử dụng mạng cầu mặc định..
Kiểm tra xem mạng cầu có đang chạy không: bạn có thể kiểm tra nó đang chạy bằng cách nhập Docker Network LS.....
Bắt đầu các thùng chứa của bạn: Bắt đầu các thùng chứa của bạn như bình thường, với Docker Run.....
Địa chỉ một thùng chứa khác theo địa chỉ IP của nó: Bây giờ một container có thể nói chuyện với một thùng khác, bằng cách sử dụng địa chỉ IP của nó ..

Làm cách nào để kết nối với thùng chứa docker mysql?

Dưới đây là các bước bạn có thể làm theo để cài đặt Container MySQL của Dockerhub: Bước 1: Kéo hình ảnh Docker cho MySQL.Bước 2: Triển khai và khởi động thùng chứa MySQL.Bước 3: Kết nối với container Docker MySQL.Step 1: Pull the Docker Image for MySQL. Step 2: Deploy and Start the MySQL Container. Step 3: Connect with the Docker MySQL Container.

Làm cách nào để liên kết một container này với một container khác?

Để tạo một liên kết, bạn sử dụng cờ -liên kết.Đầu tiên, tạo một container mới, lần này là một chứa một cơ sở dữ liệu.Điều này tạo ra một container mới gọi là DB từ hình ảnh đào tạo/Postgres, chứa cơ sở dữ liệu PostgreSQL.Bây giờ, hãy tạo một thùng chứa web mới và liên kết nó với thùng chứa DB của bạn.use the --link flag. First, create a new container, this time one containing a database. This creates a new container called db from the training/postgres image, which contains a PostgreSQL database. Now, create a new web container and link it with your db container.