使用 Docker 快速搭建開(kāi)發(fā)環(huán)境

在代碼開(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 支持的系統(tǒng)版本. png

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

hub 搜索鏡像. png

其中第一個(gè)帶有 official 單詞的表明為 Dcoker 官方提供的鏡像, 下面的三個(gè)為個(gè)人 / 組織上傳的鏡像
我們點(diǎn)擊右側(cè) DETAILS 按鈕查看鏡像詳情
hub 鏡像說(shuō)明. png

圖中的 8.0.15.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

docker ps.png

我們可以發(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

datadir 文件夾. png

發(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


  1. 參考自 Docker — 從入門到實(shí)踐 ?

  2. 參考自 Manage Docker as a non-root user ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Docker — 云時(shí)代的程序分發(fā)方式 要說(shuō)最近一年云計(jì)算業(yè)界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,848評(píng)論 15 147
  • 我在南方的艷陽(yáng)天里 一夜無(wú)夢(mèng),眨眼到了第二天。拉開(kāi)窗簾,迎接我們的是進(jìn)入雨季以來(lái)難得的大晴天。終于可以體驗(yàn)晴空...
    qingyljoy閱讀 338評(píng)論 0 1
  • 秋分將至。 經(jīng)云:至則氣同,分則氣異。是說(shuō)冬至夏至前后的氣溫相差不會(huì)太多,基本在同一水平上下波動(dòng)。春分秋分前后的氣...
    養(yǎng)生知源閱讀 524評(píng)論 0 0
  • 文/熠歆 當(dāng)我親身經(jīng)歷帶小孩時(shí),我才真正知道帶孩子是一件不容易的事,再想想我們的母親又是多么艱難呀! 記得有一次帶...
    熠歆閱讀 211評(píng)論 10 1
  • 最近 發(fā)現(xiàn) 我失去了一個(gè)很重要的東西。 同時(shí)也發(fā)展出了一些新的品質(zhì)。 我看見(jiàn) 我自己 漸漸沒(méi)有了愛(ài)一個(gè)人不得不說(shuō)出...
    賢母堂趙欣柔閱讀 548評(píng)論 0 0

友情鏈接更多精彩內(nèi)容