在代碼開(kāi)發(fā)中, 除了語(yǔ)言開(kāi)發(fā)環(huán)境及 IDE 外, 我們往往還需要依賴其他第三方服務(wù), 如:
數(shù)據(jù)庫(kù),服務(wù)器,緩存,搜索,MQ等等. 而這些服務(wù)的安裝各式各樣, 有的極為復(fù)雜, 有的對(duì)開(kāi)發(fā)機(jī)有極大的限制, 甚至有的直接不支持當(dāng)前開(kāi)發(fā)機(jī). 給我們的開(kāi)發(fā)環(huán)境搭建帶來(lái)了極大的困難. 這時(shí)我們可以選擇使用Docker來(lái)快速搭建開(kāi)發(fā)環(huán)境, 屏蔽復(fù)雜的安裝過(guò)程, 服務(wù)配置.
什么是 Docker
我們參考 Docker 官網(wǎng)中的概述 what-docker
Docker 是世界領(lǐng)先的軟件容器平臺(tái)。** 開(kāi)發(fā)人員使用 Docker 來(lái)消除與同事的代碼協(xié)作時(shí)的 “我機(jī)器上的工作” 問(wèn)題 **。運(yùn)營(yíng)商使用 Docker 在獨(dú)立的容器中并行運(yùn)行和管理應(yīng)用程序,以獲得更好的計(jì)算密度。企業(yè)使用 Docker 構(gòu)建靈活的軟件傳送管道,可以更快,更安全地運(yùn)行新功能,并且對(duì)于 Linux 和 Windows Server 應(yīng)用程序都有信心。
-- 來(lái)自谷歌翻譯
在其中的 Docker For Developers 部分中, 我們可以查看對(duì)于我們開(kāi)發(fā)者具體有哪些作用
Docker 自動(dòng)執(zhí)行設(shè)置和配置開(kāi)發(fā)環(huán)境的重復(fù)任務(wù),以便開(kāi)發(fā)人員可以專注于重要的事情:構(gòu)建出優(yōu)秀的軟件。
使用 Docker 的開(kāi)發(fā)人員不必安裝和配置復(fù)雜數(shù)據(jù)庫(kù),也不用擔(dān)心在不兼容的語(yǔ)言工具鏈版本之間切換。當(dāng)應(yīng)用程序 Docker 化時(shí),這種復(fù)雜性被推入容易構(gòu)建,共享和運(yùn)行的容器中。將同事加入新的代碼庫(kù)不再意味著安裝軟件和解釋安裝程序的時(shí)間。Dockerfiles 隨附的代碼更簡(jiǎn)單:依賴關(guān)系被拉為整齊的 Docker 映像,任何具有 Docker 和編輯器的人都可以在幾分鐘內(nèi)構(gòu)建和調(diào)試應(yīng)用程序。
-- 來(lái)自谷歌翻譯
** 簡(jiǎn)單來(lái)說(shuō), 使用 Docker 我們可以專注于代碼的編寫, 忽略其他軟件復(fù)雜的安裝, 配置. 同時(shí)可以統(tǒng)一線上, 線下環(huán)境, 不受服務(wù)版本差異的影響 **
安裝 Docker
請(qǐng)參考 Docker 官方文檔中的 Install Docker
目前 Docker 支持的系統(tǒng)版本如下

Docker 最初是在 Ubuntu 12.04 上開(kāi)發(fā)實(shí)現(xiàn)的 [1], 另外 Docker 官網(wǎng)文檔中的一些操作命令也是基于 Ubuntu 來(lái)講解的, 如果有條件, 推薦使用 Ubuntu
Linux 安裝完成后, 請(qǐng)查看 Post-installation steps for Linux 完成一些后續(xù)配置
對(duì)于 Linux 用戶需要特別注意, 如果是以非
root 用戶運(yùn)行, 需要?jiǎng)?chuàng)建 docker 組, 并將當(dāng)前用戶添加到 docker 組中 [2]
$ sudo groupadd docker
$ sudo usermod -aG docker $USER
Docker 中使用的鏡像都需要從網(wǎng)站上下載, 因?yàn)榫W(wǎng)絡(luò)原因, 國(guó)內(nèi)下載速度往往不佳, 此時(shí)可以使用國(guó)內(nèi)的一些加速器來(lái)加速下載, 如:DaoCloud,阿里云, 具體用法, 請(qǐng)登錄后查看網(wǎng)站說(shuō)明文檔
使用 Docker 搭建開(kāi)發(fā)環(huán)境
現(xiàn)在以搭建 mysql 為例
首先從 hub.docker.com 網(wǎng)站中搜索你需要的鏡像, 如 mysql

其中第一個(gè)帶有
official 單詞的表明為 Dcoker 官方提供的鏡像, 下面的三個(gè)為個(gè)人 / 組織上傳的鏡像我們點(diǎn)擊右側(cè)
DETAILS 按鈕查看鏡像詳情
圖中的
8.0.1 至 5.5.55 四行表示支持的 mysql 版本, 同時(shí)附帶鏡像構(gòu)建的 Dockerfile 文件右側(cè)的
docker pull mysql 是鏡像的下載命令, 此時(shí)我們可以在命令行中執(zhí)行該命令進(jìn)行下載, 默認(rèn)下載版本為 latest如果希望指定下載版本, 使用如下命令格式
docker pull mysql:版本號(hào), 如 docker pull mysql:5.6
下載 mysql 鏡像
$ docker pull mysql:5.7
運(yùn)行 mysql 鏡像
$ docker run --name mysql --rm -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
此時(shí)會(huì)在命令行中輸出該容器運(yùn)行時(shí)的日志, 若要退出, 請(qǐng)按 Ctrl+c
如果希望在后臺(tái)運(yùn)行, 加入 -d 參數(shù)即可
運(yùn)行參數(shù)說(shuō)明
--name mysql #鏡像運(yùn)行的容器名稱為 mysql
--rm #容器退出后刪除該容器
-p 3306:3306 #將本機(jī)的 3306 端口映射到該容器的 3306 端口
-e MYSQL_ROOT_PASSWORD=root #為容器配置一個(gè)名為 MYSQL_ROOT_PASSWORD, 值為 root 的環(huán)境變量, 因 mysql 容器的特殊性, 必須配置該環(huán)境變量
-d #在后臺(tái)運(yùn)行該容器
測(cè)試容器
在后臺(tái)運(yùn)行 mysql 容器
$ docker run --name mysql --rm -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
查看當(dāng)前運(yùn)行容器列表
$ docker ps

我們可以發(fā)現(xiàn)
mysql 已在后臺(tái)運(yùn)行此時(shí)我們可以使用
Navicat,SQLyog 進(jìn)行鏈接測(cè)試ip: 運(yùn)行容器機(jī)器的 ip端口:3306用戶名:root密碼:root, 即 MYSQL_ROOT_PASSWORD 對(duì)應(yīng)的值亦可使用如下命令進(jìn)入
mysql 命令行
$ docker run -it --link mysql:mysql --rm mysql:5.7 sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR"-P"$MYSQL_PORT_3306_TCP_PORT"-uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
運(yùn)行參數(shù)說(shuō)明
-it #運(yùn)行容器后進(jìn)入一個(gè)交互式的終端
--link mysql:mysql #鏈接一個(gè)名稱為 mysql 的容器, 并為該容器配置一個(gè)名為 mysql 的 hosts
sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR"-P"$MYSQL_PORT_3306_TCP_PORT"-uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"' #為運(yùn)行容器后執(zhí)行的命令, 其中諸如 $MYSQL_PORT_3306_TCP_ADDR,$MYSQL_PORT_3306_TCP_PORT 環(huán)境變量是容器根據(jù) --link mysql:mysql 自動(dòng)生成
數(shù)據(jù)保存
mysql 鏡像默認(rèn)使用的配置文件為 /etc/mysql/my.cnf
如果我們需要自定義配置文件可以使用如下命令覆蓋原本配置
$ docker run --name mysql --rm -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d -v ~/docker/data/mysql/my.cnf:/etc/mysql/my.cnf mysql:5.7
運(yùn)行參數(shù)說(shuō)明
-v ~/docker/data/mysql/my.cnf:/etc/mysql/my.cnf #使用當(dāng)前機(jī)器下的 ~/docker/data/mysql/my.cnf 文件掛載為容器中的 /etc/mysql/my.cnf 文件
在 mysql 鏡像中默認(rèn)存儲(chǔ)目錄為 /var/lib/mysql, 這樣存在容器刪除后數(shù)據(jù)丟失的問(wèn)題
為了防止這一情況產(chǎn)生, 我們需要將外部文件夾掛載到容器的 /var/lib/mysql 中
$ docker run --name mysql --rm -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d -v ~/docker/data/mysql/datadir:/var/lib/mysql mysql:5.7
此時(shí)我們查看 ~/docker/data/mysql/datadir 文件夾
ll -h ~/docker/data/mysql/datadir

發(fā)現(xiàn)已經(jīng)在該文件夾內(nèi)生成了一些
mysql 的初始化文件關(guān)于
mysql 鏡像的更多信息可在 hub.docker.com 中對(duì)應(yīng)的 鏡像詳情 查看關(guān)于其他如
redis,nginx,mongo 等鏡像的搭建及配置皆可在 hub.docker.com 中搜索查看
** 如果希望更加系統(tǒng)的學(xué)習(xí) Docker 信息, 請(qǐng)查看 官網(wǎng)文檔**
如果想查看中文文檔, 可以去看 Docker —— 從入門到實(shí)踐
相關(guān)資料
Docker 官方文檔
Docker —— 從入門到實(shí)踐
labs