在說明 Port forwarding 時,有個範例是同個 image 開啟多個 container。實務上通常是更複雜的情境,比方說同個 image 開多個 container 且要使用不同的 DB 連線設定,當然這可以透過 volume 解決,但如果今天要管理上百個 container 與上百份設定,volume 的做法反而很難管理。
這時有另一個選擇是使用 --environment|-e
選項。
-e
用法很簡單,直接給 key=value
即可,它會設定到環境變數裡:
# 查看原本的 env
docker run --rm busybox env
# 給 env 設定後再看 env 的內容
docker run --rm -e DB_HOST=mysql busybox env
不同的程式語言則會有不同的方法取得環境變數,以下使用 PHP 與 node.js 為例
# PHP
docker run --rm php -r "echo getenv('DB_HOST');"
docker run --rm -e DB_HOST=mysql php -r "echo getenv('DB_HOST');"
# node.js
docker run --rm node node -e "console.log(process.env.DB_HOST)"
docker run --rm -e DB_HOST=mysql node node -e "console.log(process.env.DB_HOST)"
直接使用 DockerHub 上的 image 作為範例,會比較有感覺。這裡用 Percona 做範例,文件裡面有提到很多 environment 可以搭配設定。
首先先示範 MYSQL_ROOT_PASSWORD
,它會在 Percona 啟動的時候設定 root 帳號的密碼:
# Terminal 1
docker run --rm -it --name db -e MYSQL_ROOT_PASSWORD=pass percona
# Terminal 2
docker run --rm -it --link db percona mysql -hdb -uroot -ppass
# MySQL 指令
show databases;
MYSQL_DATABASE
則是啟動後建立對應名稱的資料庫,注意 client 最後執行 show databases;
後的結果:
# Terminal 1
docker run --rm -it --name db -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=some percona
# Terminal 2
docker run --rm -it --link db percona mysql -hdb -uroot -ppass
# MySQL 指令
show databases;
MYSQL_USER
和 MYSQL_PASSWORD
可以設定 root 以外的新帳號和密碼,同時給予 MYSQL_DATABASE
所有存取權限。
這裡注意 client 指令的帳號密碼跟剛不大一樣了。
# Terminal 1
docker run --rm -it --name db -e MYSQL_RANDOM_ROOT_PASSWORD=yes -e MYSQL_USER=miles -e MYSQL_PASSWORD=chou -e MYSQL_DATABASE=some percona
# Terminal 2
docker run --rm -it --link db percona mysql -hdb -umiles -pchou
# MySQL 指令
show databases;
最後的範例是,搭配連結 container 所學,使用 phpMyAdmin 連結 Percona:
# Terminal 1,使用 MYSQL_ROOT_PASSWORD 與 MYSQL_DATABASE
docker run --rm -it --name db -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=some percona
# Terminal 2
docker run --rm -it --link db -p 8080:80 phpmyadmin
docker run
選項補充
-e|--env
設定該 container 的環境變數今天的環境變數使用方法很單純,但應用可以千變萬化。上面四個範例都使用了 Percona image,搭配 Docker 的隔離特性與環境變數功能,可以同時提供四種不同設定的 container。
-e
設定 container 的環境變數-e
選項,改變 container 的行為