docker-compose 中 network_mode 設置致使沒法從容器外部訪問 MySQL

docker-compose 中 network_mode 設置致使沒法從容器外部訪問 MySQL

問題現象

經過 docker-compose 在本身電腦上部署 MySQL,啓動以後,查看容器狀態正常,進入容器內部訪問 MySQL 正常,可是在宿主機上鍊接 MySQL 失敗。mysql

  • docker-compose.yml 配置文件
$ cat docker-compose.yml
version: '2'
services:
    mysql:
        network_mode: "host"
        environment:
            MYSQL_ROOT_PASSWORD: "xxxx"
            MYSQL_USER: "qbench"
            MYSQL_PASS: "xxxx"
        image: "docker.io/mysql:5.7.22"
        ports:
            - "3306:3306"
        restart: always
        volumes:
            - "./db:/var/lib/mysql"
            - "./conf/my.cnf:/etc/my,cnf"
            - "./init:/docker-entrypoint-initdb.d/"
複製代碼
  • 拉取鏡像
$ docker-compose -f docker-compose.yml pull
複製代碼
  • 啓動
$ docker-compost -f docker-compose.yml up -d
複製代碼
  • 從宿主機上鍊接 MySQL 報錯
[20-02-03 19:46:34]  shengang@abcs-MacBook-Pro  ~/Documents/002-workspace/docker-workspace/mysql-5.7.22
$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
4865e2c56f67        mysql:5.7.22        "docker-entrypoint.s…"   6 seconds ago       Up 5 seconds                            mysql-5722_mysql_1
[20-02-03 19:46:39]  shengang@abcs-MacBook-Pro  ~/Documents/002-workspace/docker-workspace/mysql-5.7.22
$ mysql -uroot -P3306 -h127.0.0.1 -p
Enter password:
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (61) 複製代碼
  • 可是進入容器內部鏈接 MySQL 正常
[20-02-03 19:46:56]  shengang@abcs-MacBook-Pro  ~/Documents/002-workspace/docker-workspace/mysql-5.7.22
$ docker exec -it 4865e2c56f67 bash
root@linuxkit-025000000001:/# mysql -uroot -P3306 -h127.0.0.1 -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.22 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, 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>
複製代碼

問題排查

排查過程其實比較簡單,由於從容器內部鏈接正常,從宿主機鏈接失敗,這個基本上就是網絡或者端口或者防火牆的問題了。首先看 docker container ls 的結果輸出中 PORTS 列的內容是空的,說明端口沒有映射出來。可是在 docker-compose.yml 配置文件中咱們明明設置了 ports 配置。仔細看了下 docker-compose.yml 配置文件,發現一個 network_mode: "host" 的配置項,這個我以前沒怎麼了解過,只是抄的網上的配置文件。大機率就是這個配置引發的問題。因而嘗試了一下將 network_mode: "host" 這一行刪除掉了。而後經過 docker-compose -f docker-compose.yml down ,docker-compose -f docker-compose.yml up -d 從新部署容器,鏈接就正常了。linux

問題緣由

雖然問題解決了,可是最終仍是須要了解一下是爲何會致使問題的出現,得好好理解一下 network_mode 這個配置的含義。sql

docker-compose.yml 配置文件中的 netwokr_mode 是用於設置網絡模式的,與 docker run 中的 --network 選項參數同樣,加上了 service:[service name] 形式的配置,默認是 bridge 橋接模式docker

  • network_mode: "bridge"

默認的網絡模式。若是沒有指定網絡驅動,默認會建立一個 bridge 類型的網絡。橋接模式通常是用在應用是獨立的狀況,容器之間不須要互相通訊。bash

  • network_mode: "host"

host 網絡模式,針對的也是應用是獨立的狀況,在 host 網絡模式下,移除了宿主機與容器之間的網絡隔離,榮容器直接使用宿主機的網絡,這樣就能在容器中訪問宿主機網絡。host 網絡模式只對 Docker 17.06 以及更高版本的 swarm 服務可用。網絡

  • network_mode: "none"

none 表示對於這個 container ,禁用全部的網絡。post

  • network_mode: "service:[service name]"ui

  • network_mode: "container:[container name/id]"spa

當在 swarm 服務中,network_mode 選項會被忽略。rest

相關文章
相關標籤/搜索