Docker基礎:連接容器

【摘要】本文是作者學習Docker的筆記,介紹了Docker上的網路,並提供了例子。

  • 簡介

這篇文章是Docker基礎系列的第二篇。上篇文章中,我們討論了鏡像和容器的區別以及幾個簡單的例子。

這次假設我們有連個容器,我們如何讓它倆相互通信。我首先想到的場景是application-database間的關係。我將創建下面兩個容器:

  1. MySQL RDBMS

  2. 一個簡單的Python腳本,從MySQL容器fetch數據並且列印出來

  • 一個綁定容器的網路

過去連接容器使用--link標記,但是它被棄用了。新的方法是使用network特性。當我們運行docker network ls時會看到:

NETWORK ID NAME DRIVER SCOPE

它們的含義是:

Advertisements

  1. bridge:默認網路,所有容器默認連接到它

  2. none:沒有網路介面

  3. host:連接到主機的網路棧,主機和容器間的網路沒有隔離

如果想深入了解某個網路,使用docker network inspect <name>命令。

控制容器間通信的推薦做法是使用用戶定義網路,通過它我們可以方便地創建自己的網路。比如創建一個網路docker network create my-network然後查看docker network ls

NETWORK ID NAME DRIVER SCOPE

這樣我們自己定義的網路就創建好並且可以使用了。

  • MySQL容器

先運行一個docker run -d --name mysql-server --network my-network -e MYSQL_ROOT_PASSWORD=secret mysql不同參數的含義分別是:

Advertisements

  1. -d,容器與當前進程分離,後台運行

  2. **--name--,指定容器名

  3. --network,指定容器連接網路

  4. -e,設置環境變數

非常簡單,我們的容器就運行起來了。現在我們要連接到我們的資料庫容器中,創建資料庫、表,然後添加些簡單的數據。我將演示創建的網路把兩個容器連接起來,我需要再運行一個不同的容器來連接到資料庫伺服器上:

docker run -it --rm --network my-network mysql sh -c 'exec mysql -h"mysql-server" -P"3306" -uroot -p"secret"'

如果一切正常,我們會看到:

mysql: [Warning] Using a password on the command line interface can be insecure.

剛才的命令意思是:

  1. -it,運行在交互模式

  2. --rm,容器退出后自動刪除

  3. --network,指定需要連接的網路

  4. 然後execMySQL程序和必要的參數連接到資料庫伺服器。注意,我們用MySQL容器名作為host

下面我們創建一個例子:python腳本連接資料庫。首先運行下面命令創建資料庫等:

CREATE DATABASE mydb;
  • 查詢腳本

這部分我們會創建自己的鏡像,Windows用戶需要注意:由於Docker在Windows有些限制,我們的目錄和腳本需要放到C:\Users\<someuser>目錄下。

首先創建目錄C:\Users\myuser\my-script,然後目錄下創建Dockerfile(是的,不需要擴展名):

FROM python:2

簡單解釋下,這幾行分別表示python:2基礎鏡像,設置工作目錄,下載依賴,拷貝文件,指定容器執行命令。

然後創建script.py文件:

#!/usr/bin/python

這個腳本會連接到MySQL資料庫,然後查詢數據。最後我們構建鏡像:

docker build -t my-script .

接著運行鏡像:

docker run -it --rm --network my-network my-script

會看到輸出:

fname=Mick, lname=Jagger

證明我們的腳本正確運行。

  • 總結

  1. --link參數會被棄用

  2. 使用新的--network參數

  3. 會有默認的network,但是推薦使用自定義網路

  4. --name很重要,它指定主機在另一個容器里的可見地址

  • 常用命令:

  1. docker network ls

  2. docker network create <name>

  3. docker network inspect <name>

Advertisements

你可能會喜歡