本地開發之痛苦
在開發之前,首先你需要安裝各種開發工具和服務支援到你的開發環境當中,可能會出依賴問題,環境變數問題,埠衝突,經編譯庫問題等等。
開發途中,可能你又需要依賴一些其他的服務,你最好祈禱不會出問題,可能你又要重寫來配置你的環境,因為你的所有的依賴服務都在你的唯一的工作空間裡面。
如果你的夥伴的作業系統不統一,可能你還會遇到一些不同元字元解析不一致的問題。
然後上線之前,可能你在本地開發除錯都可以完美執行,一但部署到伺服器,就會出現各種問題。因為大多數情況下,我們的開發環境和生產環境並不相同。
可能你下次又有要用到一個新的開專案的開發環境。你又要重複面對上面這些問題.
你不得不去審視,你要話費大量的時間用在搭建環境當中來。
什麼是Docker
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux
機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。
對我們而言,我覺得只需要把他理解成一個便攜的應用容器即可
Docker
本地開發環境的好處
試錯
對開發者而言,每天會催生出的各式各樣的新技術都需要嘗試,然而開發者卻不太可能為他們一一搭建好環境並進行測試。時間非常寶貴,正是得益於 Docker
,讓我們有可能在一條或者幾條命令內就搭建完環境,而且這個環境大到一個特定版本的作業系統,小到一個軟體。Docker 有一個傻瓜化的獲取軟體的方法,Docker
後臺會自動獲得環境映象並且執行環境。
統一開發和生產環境
對於一般的小公司來說,搭建一個公用的開發環境是一件不那麼划算的事情。那麼就可以用Docker
來統一開發環境,因為不管你用的是Windows
、Mac
還是 Ubuntu
。
如果生產環境也使用的Docker
的話,你甚至可以直接打包一套環境,直接丟上去就可以執行了,再也不用擔心開發-生產環境之間的差異了。
高效能
虛擬機器的粒度是虛擬出的機,而Docker
的粒度則是被限制的應用,相比較而言 Docker 的記憶體佔用更少,更加輕量級,效能也更優。
而秒級的啟動,也可以讓我們啟動電腦時候,開發環境的執行是無感知的。
成果展示
我們可能經常要給使用者或者是同事展示一樣功能的,但是搭建演示環境的過程卻是非常麻煩的。現在可以直接將我們的映象打包丟過去,而不必去做任何環境配置的工作,同時也不必擔心他們的環境配置會導致我們的產品無法執行。
安裝Docker
在mac
平臺下,就是去下載一個dmg
的安裝檔案。下載好了之後,雙擊,然後拖入就可以了,windows
應該也是類似的。
就是安裝qq
一樣簡單,傻瓜式的。
附上dockerhub
上的下載連結
成功之後屬於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
之後就會攜帶docker-composer
。
其他平臺,附上下載連結
安裝完成之後可以輸入命令檢測
➜ ~ 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
複製程式碼
如果沒有出現版本相關資訊,可以嘗試再次安裝
下載laradock
laradock
的專案地址是https://github.com/laradock/laradock
我們找一個地方clone
下來即可
我這裡是在我的使用者目錄下面新建了一個Docker
目錄,然後clone
了專案下來
配置env
檔案
-
拷貝example成.env
cp env-example env 複製程式碼
-
.env
檔案中APP_CODE_PATH_HOST
是本地路徑APP_CODE_PATH_CONTAINER
是遠端對映路徑,看需求修改,大多數情況下是不需要的 -
如果有除錯程式碼的需求,也可以將
PHP_FPM_INSTALL_XDEBUG
和WORKSPACE_INSTALL_XDEBUG
兩個選項開啟 -
如果還有其他的需求,可以在
.env
裡面搜尋,裡面已經將大多數配置項都給獨立出來了
執行容器
進入到laradock
的工作目錄下面,就是clone
的專案的根目錄我的工作目錄就是~/Docker/laradock
。
然後執行如下命令
docker-compose up -d nginx mysql
複製程式碼
就會看到在自動執行build
操作,並且build完了之後自動後臺啟動了如下容器
- nginx
- php-fpm
- workspace
- mysql
那是因為php-fpm
和workspace
還有docker-in-docker
是隨nginx
一併啟動的
所以實際上
docker-compose up -d nginx mysql
複製程式碼
和
docker-compose up -d nginx workspace php-fpm mysql
複製程式碼
這兩條命令的效果是一樣的,可以都帶上,也可以不寫。
up
命令在第一次啟動的時候實際上就是build
+ start
的組合,如果容器不存在,那麼就build
一個容器,並且啟動服務,如果容器存在那麼直接啟動服務,大概就是這麼個意思 -d
的意思是後臺執行
配置web專案
一下是我laravel
專案的部分配置
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=blog
DB_USERNAME=root
DB_PASSWORD=root
......
複製程式碼
注意,資料庫主機必須得是別名才可以,如果DB_CONNECTION
這個地方輸入172.0.0.1或者是localhost
都是會連線失敗的。
在其它的專案中也必須是這樣的,配置資料庫連結,redis
,或者MemCache
連結都必須設定成具體的別名。或者你說我找到各個容器的ip,可以嘛。可以,但是並不建議這樣做,因為ip是會變動的。
具體別名可以參考./docker-compose.yml
檔案中的設定
這個主要的技術實現應該是用了docker
的虛擬網橋技術.
配置宿主機的host
因為,往往我們訪問的時候,是通過宿主機上面的瀏覽器傳送請求的,所以,配置宿主機上面的host
必不可少。
vim /etc/hosts
複製程式碼
我這裡加入一條我自己設定的虛擬域名
127.0.0.1 blog.test
複製程式碼
然後儲存,重新整理下host。
配置nginx
進入到./laradock/nginx/sites
資料夾,然後ll
一下,我們會發現,laradock已經幫我們放了好多列舉的檔案進來
app.conf.example
default.conf
laravel.conf.example
symfony.conf.example
複製程式碼
根據需求拷貝一份,然後修改一下就可以了,都不是很難,由於我們本地是laravel開發的部落格專案,所以我就直接拷貝laravel.conf.example
,然後使用vim開啟
cp laravel.conf.example blog.conf
vim blog.conf
複製程式碼
開啟後的內容...
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;
複製程式碼
我們會發現,如果沒有特殊需求的話,這個裡面大多數地方我們並不需要修改。我們只需要關注server_name
和root
這兩個引數,把這個裡面的laravel
換成我們專案名就可以了,這裡我們換成blog
下面是修改後的內容
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/
複製程式碼
瀏覽器返回結果
enjoy !
轉載請註明出處juejin.im/post/5cbea7…