如何使用 Docker 高效搭建本地開發(fā)環(huán)境(詳細(xì)教程)
來源:juejin.cn/post/6844903828949565448
本地開發(fā)之痛苦
在開發(fā)之前,首先你需要安裝各種開發(fā)工具和服務(wù)支持到你的開發(fā)環(huán)境當(dāng)中,可能會(huì)出依賴問題,環(huán)境變量問題,端口沖突,經(jīng)編譯庫問題等等。
開發(fā)途中,可能你又需要依賴一些其他的服務(wù),你最好祈禱不會(huì)出問題,可能你又要重寫來配置你的環(huán)境,因?yàn)槟愕乃械囊蕾嚪?wù)都在你的唯一的工作空間里面。
如果你的伙伴的操作系統(tǒng)不統(tǒng)一,可能你還會(huì)遇到一些不同元字符解析不一致的問題。
然后上線之前,可能你在本地開發(fā)調(diào)試都可以完美運(yùn)行,一但部署到服務(wù)器,就會(huì)出現(xiàn)各種問題。因?yàn)榇蠖鄶?shù)情況下,我們的開發(fā)環(huán)境和生產(chǎn)環(huán)境并不相同。
可能你下次又有要用到一個(gè)新的開項(xiàng)目的開發(fā)環(huán)境。你又要重復(fù)面對(duì)上面這些問題.
你不得不去審視,你要話費(fèi)大量的時(shí)間用在搭建環(huán)境當(dāng)中來。
什么是Docker
Docker 是一個(gè)開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口。對(duì)我們而言,我覺得只需要把他理解成一個(gè)便攜的應(yīng)用容器 即可
Docker本地開發(fā)環(huán)境的好處
試錯(cuò)
對(duì)開發(fā)者而言,每天會(huì)催生出的各式各樣的新技術(shù)都需要嘗試,然而開發(fā)者卻不太可能為他們一一搭建好環(huán)境并進(jìn)行測(cè)試。時(shí)間非常寶貴,正是得益于 Docker,讓我們有可能在一條或者幾條命令內(nèi)就搭建完環(huán)境,而且這個(gè)環(huán)境大到一個(gè)特定版本的操作系統(tǒng),小到一個(gè)軟件。Docker 有一個(gè)傻瓜化的獲取軟件的方法,Docker后臺(tái)會(huì)自動(dòng)獲得環(huán)境鏡像并且運(yùn)行環(huán)境。
統(tǒng)一開發(fā)和生產(chǎn)環(huán)境
對(duì)于一般的小公司來說,搭建一個(gè)公用的開發(fā)環(huán)境是一件不那么劃算的事情。那么就可以用Docker來統(tǒng)一開發(fā)環(huán)境,因?yàn)椴还苣阌玫氖?code style="margin: 0px 2px;padding: 2px 4px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(60, 112, 198);">Windows、Mac 還是 Ubuntu。如果生產(chǎn)環(huán)境也使用的Docker的話,你甚至可以直接打包一套環(huán)境,直接丟上去就可以運(yùn)行了,再也不用擔(dān)心開發(fā)-生產(chǎn)環(huán)境之間的差異了。
高性能
虛擬機(jī)的粒度是虛擬出的機(jī) ,而Docker的粒度則是被限制的應(yīng)用 ,相比較而言 Docker 的內(nèi)存占用更少,更加輕量級(jí),性能也更優(yōu)。
而秒級(jí)的啟動(dòng),也可以讓我們啟動(dòng)電腦時(shí)候,開發(fā)環(huán)境的運(yùn)行是無感知的。
成果展示
我們可能經(jīng)常要給用戶或者是同事展示一樣功能的,但是搭建演示環(huán)境的過程卻是非常麻煩的?,F(xiàn)在可以直接將我們的鏡像打包丟過去,而不必去做任何環(huán)境配置的工作,同時(shí)也不必?fù)?dān)心他們的環(huán)境配置會(huì)導(dǎo)致我們的產(chǎn)品無法運(yùn)行。
安裝Docker
在mac平臺(tái)下,就是去下載一個(gè)dmg的安裝文件。下載好了之后,雙擊,然后拖入就可以了,windows應(yīng)該也是類似的。
就是安裝qq一樣簡(jiǎn)單,傻瓜式的。
附上dockerhub上的下載鏈接:
https://hub.docker.com/search/?type=edition&offering=community&q=
成功之后屬于docker version如果出來版本信息就是安裝成功,類似如下
Client: Docker Engine - Community
Version: 18.09.0
API version: 1.39
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:47:43 2018
OS/Arch: darwin/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.0
API version: 1.39 (minimum version 1.12)
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:55:00 2018
OS/Arch: linux/amd64
Experimental: true
安裝docker-composer
一般來說,mac安裝docker之后就會(huì)攜帶docker-composer。
其他平臺(tái),附上下載鏈接:
https://github.com/docker/compose/releases
安裝完成之后可以輸入命令檢測(cè)
? ~ docker-compose version
docker-compose version 1.23.2, build 1110ad01
docker-py version: 3.6.0
CPython version: 3.6.6
OpenSSL version: OpenSSL 1.1.0h 27 Mar 2018
如果沒有出現(xiàn)版本相關(guān)信息,可以嘗試再次安裝
下載laradock
laradock的項(xiàng)目地址是https://github.com/laradock/laradock 我們找一個(gè)地方clone下來即可
我這里是在我的用戶目錄下面新建了一個(gè)Docker目錄,然后clone了項(xiàng)目下來
配置env文件
拷貝example成.env
cp env-example env.env文件中APP_CODE_PATH_HOST是本地路徑APP_CODE_PATH_CONTAINER是遠(yuǎn)程映射路徑,看需求修改,大多數(shù)情況下是不需要的如果有調(diào)試代碼的需求,也可以將
PHP_FPM_INSTALL_XDEBUG和WORKSPACE_INSTALL_XDEBUG兩個(gè)選項(xiàng)打開如果還有其他的需求,可以在
.env里面搜索,里面已經(jīng)將大多數(shù)配置項(xiàng)都給獨(dú)立出來了
運(yùn)行容器
進(jìn)入到laradock的工作目錄下面,就是clone的項(xiàng)目的根目錄我的工作目錄就是~/Docker/laradock。
然后運(yùn)行如下命令
docker-compose up -d nginx mysql
就會(huì)看到在自動(dòng)執(zhí)行build操作,并且build完了之后自動(dòng)后臺(tái)啟動(dòng)了如下容器
nginx php-fpm workspace mysql
那是因?yàn)?code style="margin: 0px 2px;padding: 2px 4px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(60, 112, 198);">php-fpm和workspace還有docker-in-docker是隨nginx一并啟動(dòng)的
所以實(shí)際上
docker-compose up -d nginx mysql
和
docker-compose up -d nginx workspace php-fpm mysql
這兩條命令的效果是一樣的,可以都帶上,也可以不寫。
up命令在第一次啟動(dòng)的時(shí)候?qū)嶋H上就是build + start的組合,如果容器不存在,那么就build一個(gè)容器,并且啟動(dòng)服務(wù),如果容器存在那么直接啟動(dòng)服務(wù),大概就是這么個(gè)意思 -d的意思是后臺(tái)運(yùn)行
配置web項(xiàng)目
一下是我laravel項(xiàng)目的部分配置
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=blog
DB_USERNAME=root
DB_PASSWORD=root
......
注意,數(shù)據(jù)庫主機(jī)必須得是別名才可以,如果DB_CONNECTION這個(gè)地方輸入172.0.0.1或者是localhost都是會(huì)連接失敗的。
在其它的項(xiàng)目中也必須是這樣的,配置數(shù)據(jù)庫鏈接,redis,或者MemCache鏈接都必須設(shè)置成具體的別名。或者你說我找到各個(gè)容器的ip,可以嘛??梢裕遣⒉唤ㄗh這樣做,因?yàn)閕p是會(huì)變動(dòng)的。
具體別名可以參考./docker-compose.yml文件中的設(shè)置
這個(gè)主要的技術(shù)實(shí)現(xiàn)應(yīng)該是用了docker的虛擬網(wǎng)橋技術(shù).
配置宿主機(jī)的host
因?yàn)椋覀冊(cè)L問的時(shí)候,是通過宿主機(jī)上面的瀏覽器發(fā)送請(qǐng)求的,所以,配置宿主機(jī)上面的host必不可少。
vim /etc/hosts
我這里加入一條我自己設(shè)置的虛擬域名
127.0.0.1 blog.test
然后保存,刷新下host。
配置nginx
進(jìn)入到./laradock/nginx/sites文件夾,然后ll一下,我們會(huì)發(fā)現(xiàn),laradock已經(jīng)幫我們放了好多列舉的文件進(jìn)來
app.conf.example default.conf laravel.conf.example symfony.conf.example
根據(jù)需求拷貝一份,然后修改一下就可以了,都不是很難,由于我們本地是laravel開發(fā)的博客項(xiàng)目,所以我就直接拷貝laravel.conf.example,然后使用vim打開
cp laravel.conf.example blog.conf vim blog.conf
打開后的內(nèi)容...
server {
listen 80;
listen [::]:80;
# For https
# listen 443 ssl;
# listen [::]:443 ssl ipv6only=on;
# ssl_certificate /etc/nginx/ssl/default.crt;
# ssl_certificate_key /etc/nginx/ssl/default.key;
server_name laravel.test;
root /var/www/laravel/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass php-upstream;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fixes timeouts
fastcgi_read_timeout 600;
include fastcgi_params;
我們會(huì)發(fā)現(xiàn),如果沒有特殊需求的話,這個(gè)里面大多數(shù)地方我們并不需要修改。我們只需要關(guān)注server_name和root這兩個(gè)參數(shù),把這個(gè)里面的laravel換成我們項(xiàng)目名就可以了,這里我們換成blog
下面是修改后的內(nèi)容
server {
listen 80;
listen [::]:80;
# For https
# listen 443 ssl;
# listen [::]:443 ssl ipv6only=on;
# ssl_certificate /etc/nginx/ssl/default.crt;
# ssl_certificate_key /etc/nginx/ssl/default.key;
server_name blog.test;
root /var/www/blog/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass php-upstream;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fixes timeouts
fastcgi_read_timeout 600;
include fastcgi_params;
訪問
輸入url
http://blog.test/
瀏覽器返回結(jié)果
推薦閱讀
1 億巨資開發(fā)的防疫 APP,兩年多只找到 2 例確診 字節(jié)高性能開源微服務(wù)中間件 CloudWeGo 技術(shù)大揭秘! 是什么讓Redis“氣急敗壞”回?fù)簦?/a>
你好,我是程序猿DD,10年開發(fā)老司機(jī)、阿里云MVP、騰訊云TVP、出過書創(chuàng)過業(yè)、國(guó)企4年互聯(lián)網(wǎng)6年。從普通開發(fā)到架構(gòu)師、再到合伙人。一路過來,給我最深的感受就是一定要不斷學(xué)習(xí)并關(guān)注前沿。只要你能堅(jiān)持下來,多思考、少抱怨、勤動(dòng)手,就很容易實(shí)現(xiàn)彎道超車!所以,不要問我現(xiàn)在干什么是否來得及。如果你看好一個(gè)事情,一定是堅(jiān)持了才能看到希望,而不是看到希望才去堅(jiān)持。相信我,只要堅(jiān)持下來,你一定比現(xiàn)在更好!如果你還沒什么方向,可以先關(guān)注我,這里會(huì)經(jīng)常分享一些前沿資訊,幫你積累彎道超車的資本。
