Cách kết nối PostgreSQL hoặc MySQL trong Docker từ máy Mac
TablePro Team
Trên trang này
Cơ sở dữ liệu trong container lắng nghe bên trong mạng của Docker. Máy Mac của bạn chỉ tới được nó qua một port bạn publish ra ngoài. Khi port đã được publish, cơ sở dữ liệu nằm ở localhost như mọi server local khác, và client nào cũng kết nối theo cách quen thuộc.
Publish port
#docker run --name pg -e POSTGRES_PASSWORD=secret -p 5432:5432 -d postgres:17
docker run --name mysql -e MYSQL_ROOT_PASSWORD=secret -p 3306:3306 -d mysql:8.4
-p 5432:5432 ánh xạ port 5432 trên máy Mac tới port 5432 trong container. Số bên trái là port bạn kết nối tới. Nếu một PostgreSQL cài bằng Homebrew đang giữ port 5432, hãy publish ra port khác, -p 5433:5432, rồi kết nối tới 5433.
-p 5432:5432 publish trên mọi network interface của máy Mac. Để cơ sở dữ liệu không lộ ra mạng nội bộ, hãy bind vào loopback: -p 127.0.0.1:5432:5432.
docker ps hiện ánh xạ này ở cột PORTS, còn docker port pg in ra cho riêng một container.
Kết nối từ dòng lệnh
#psql "postgresql://postgres:secret@localhost:5432/postgres"
mysql -h 127.0.0.1 -P 3306 -u root -p
Các image chính thức tạo sẵn những tài khoản sau:
| Image | User | Mật khẩu | Cơ sở dữ liệu |
|---|---|---|---|
postgres |
postgres, hoặc POSTGRES_USER |
POSTGRES_PASSWORD |
Trùng tên user, hoặc POSTGRES_DB |
mysql |
root |
MYSQL_ROOT_PASSWORD |
Không có, trừ khi bạn đặt MYSQL_DATABASE |
Với client mysql, hãy dùng 127.0.0.1 thay vì localhost. Trên Mac, client này hiểu localhost là "dùng Unix socket", mà socket của container thì không nằm trên máy Mac.
Nếu chưa cài client nào, hãy chạy client có sẵn trong container: docker exec -it pg psql -U postgres.
Kết nối trong TablePro
#- Bấm Kết nối mới… (New Connection…) trên cửa sổ chào mừng, hoặc bấm
Cmd+N, rồi chọn PostgreSQL hoặc MySQL. - Ở tab Tổng quát (General), đặt Máy chủ (Host) là
localhostvà Cổng (Port) là port đã publish. - Điền Tên người dùng (Username) và Mật khẩu (Password) theo bảng ở trên. PostgreSQL còn cần Cơ sở dữ liệu (Database): với container mới tạo,
postgreslà dùng được. Với MySQL, bạn có thể để trống Cơ sở dữ liệu rồi chọn sau bằngCmd+K. - Bấm Kiểm tra kết nối (Test Connection), rồi Lưu & kết nối (Save & Connect).
Driver MySQL của TablePro chỉ kết nối qua TCP, nên localhost dùng được ở đây dù không dùng được với client mysql. Tài khoản MySQL 8 dùng caching_sha2_password kết nối được mà không cần đổi auth plugin. Với MySQL, để trống Tên người dùng nghĩa là dùng tên đăng nhập macOS của bạn, nên hãy gõ root.
Nếu bạn đã có sẵn connection string thì không cần điền từng ô. Bấm Nhập từ URL… (Import from URL…) ở cuối bảng chọn loại cơ sở dữ liệu, dán URL, xem phần xem trước rồi bấm Nhập (Import). Form mở ra với các ô đã điền sẵn. Mật khẩu có @, # hoặc % cần được percent-encode trước: p@ss thành p%40ss.
Đọc thiết lập từ file Compose
#Trong một dự án, những thông tin trên nằm trong docker-compose.yml:
services:
db:
image: postgres:17
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: secret
POSTGRES_DB: app
ports:
- "5432:5432"
Tên service db chỉ phân giải được bên trong mạng của Compose. Từ máy Mac, địa chỉ vẫn là localhost và port đã publish.
TablePro đọc được file này để bạn không phải gõ lại:
- Chọn Tệp > Nhập > Mở thư mục dự án… (File > Import > Open Project Folder…) và chọn thư mục dự án.
- Bảng hiện ra liệt kê mỗi bộ thông tin đăng nhập tìm được trên một dòng, gồm loại cơ sở dữ liệu, host, port, user và cơ sở dữ liệu, kèm file và key chứa nó. Một service trong Compose hiện với host
127.0.0.1và port đã publish. - Chọn một dòng rồi bấm Tiếp tục (Continue). Form connection mở ra với các ô đã điền sẵn. Chưa có gì được lưu và chưa có gì kết nối cho tới khi bạn bấm Lưu (Save).
Lượt quét đọc docker-compose.yml và compose.yaml, đọc cả .env, nên một ${POSTGRES_PASSWORD} trong file Compose được điền từ .env của dự án. Mật khẩu không bao giờ được hiển thị. Dòng đó ghi Đã tìm thấy mật khẩu (Password found), và giá trị được đưa vào Keychain khi bạn lưu.
Hai ghi chú trên một dòng cho biết nó có thể không kết nối được:
- Không có cổng được công bố, có thể không truy cập được (No published port, may be unreachable): service không có ánh xạ
ports:. - Tên dịch vụ container, có thể không truy cập được (Container service name, may be unreachable): host lấy từ một giá trị trong
.envnhưDB_HOST=db, vốn chỉ phân giải được bên trong Docker. Hãy đổi Máy chủ thànhlocalhosttrong form.
Giới hạn
#- Mỗi lượt Mở thư mục dự án… chỉ import một dòng. Chạy lại cho service tiếp theo.
- TablePro không đối chiếu với các connection bạn đã có, nên import cùng một dòng hai lần sẽ cho ra hai connection.
- Các file mẫu như
.env.examplebị bỏ qua. - TablePro không khởi động, dừng hay liệt kê container. Ứng dụng kết nối tới bất cứ thứ gì đang lắng nghe trên port đó.
- Connection MySQL không bao giờ dùng Unix socket. Hãy cho connection một host và một port.
Nếu không kết nối được
#- Connection refused: không có gì lắng nghe trên port đó. Dùng
docker psđể kiểm tra container có đang chạy và port đã được publish chưa. - Password authentication failed trên PostgreSQL, hoặc Access denied trên MySQL, dù bạn dùng đúng mật khẩu trong lệnh
docker run:POSTGRES_PASSWORDvàMYSQL_ROOT_PASSWORDchỉ có tác dụng khi thư mục dữ liệu được tạo lần đầu. Container khởi động trên một volume có sẵn vẫn giữ mật khẩu từ lúc volume đó được tạo. - Kết nối được, nhưng vào nhầm server: một PostgreSQL hoặc MySQL khác trên máy Mac đang giữ port. Hãy publish container ra một port khác.
Form connection được mô tả từng ô trong tài liệu cho PostgreSQL và MySQL, còn các file cấu hình mà lượt quét đọc được liệt kê trong Open Project Folder (các trang tài liệu đều bằng tiếng Anh). Trên trang này, hãy xem trang PostgreSQL, trang MySQL và mục import connection từ một dự án.
Khi đã kết nối được với container, bước tiếp theo thường là nạp dữ liệu: xem cách import file CSV vào PostgreSQL hoặc MySQL.
Trang liên quan
Hiện có trên Mac, iPhone và iPad.
Tải về cho Mac