摘要:簡(jiǎn)介其實(shí)在這樣的一個(gè)云計(jì)算時(shí)代早就已被人眾所周知了它改變了傳統(tǒng)物理機(jī)的虛擬化方式使得機(jī)器的資源得到了高效的利用因?yàn)檫\(yùn)行在中的應(yīng)用實(shí)際上就是運(yùn)行在宿主機(jī)上的所以它是不需要進(jìn)行硬件層面的虛擬化以及運(yùn)行一個(gè)完整操作系統(tǒng)來(lái)支持于是在應(yīng)用代碼的執(zhí)行效
Docker簡(jiǎn)介
其實(shí)在這樣的一個(gè)云計(jì)算時(shí)代, Docker 早就已被人眾所周知了,它改變了傳統(tǒng)物理機(jī)的虛擬化方式,使得機(jī)器的資源得到了高效的利用. 因?yàn)檫\(yùn)行在 Docker 中的應(yīng)用實(shí)際上就是運(yùn)行在宿主機(jī)上的, 所以它是不需要進(jìn)行硬件層面的虛擬化以及運(yùn)行一個(gè)完整操作系統(tǒng)來(lái)支持. 于是在應(yīng)用代碼的執(zhí)行效率, 內(nèi)存的使用以及文件的讀取速度都比傳統(tǒng)虛擬化的方式來(lái)的強(qiáng). 而且它的啟動(dòng)速度非???往往都是在毫秒級(jí)的,可以大大的節(jié)約了開(kāi)發(fā)測(cè)試以及部署的時(shí)間.
其實(shí)對(duì)于開(kāi)發(fā)人員來(lái)說(shuō), Docker 一個(gè)更大的意義就是可以保證擁有一致的運(yùn)行環(huán)境, 程序員最常見(jiàn)的就是在開(kāi)發(fā)測(cè)試部署環(huán)境不一致的情況下, 經(jīng)常會(huì)觸發(fā)一些莫名奇妙的BUG, 為了杜絕「這段代碼在我機(jī)器上沒(méi)問(wèn)題啊」這類的問(wèn)題,這也是我們要去學(xué)習(xí) Docker 的理由之一.
網(wǎng)上充斥著大量的關(guān)于 Docker 各個(gè)方面的教程和資料, 而且由于 Docker 的飛速發(fā)展, 很多教程其實(shí)都過(guò)時(shí)了, 對(duì)于初學(xué)者來(lái)說(shuō)很難去分辨把握, 隨之而來(lái)的就是一系列的坑與問(wèn)題, 漸漸的磨滅了學(xué)習(xí)者的動(dòng)力. 其實(shí)學(xué)習(xí)一門(mén)新技術(shù)最好的永遠(yuǎn)都是從官方的文檔入手, 然后就是 GitHub 上面一個(gè)技術(shù)人員的學(xué)習(xí)筆記, 最重要的是要去摸索實(shí)踐, 并且做好學(xué)習(xí)筆記. 其實(shí)學(xué)習(xí)一門(mén)新技術(shù), 如果有正確的學(xué)習(xí)方法是可以少走很多彎路的, 這個(gè)有機(jī)會(huì)會(huì)寫(xiě)一篇心得.
快速入門(mén)這里限制于篇幅和作者水平, 不會(huì)大談 Docker 底層原理以及技術(shù)實(shí)現(xiàn),也不會(huì)教你如何寫(xiě)一個(gè)繁瑣的 Dockerfile, 而是會(huì)從一個(gè)普通開(kāi)發(fā)者的身份入手, 帶你從零搭建一個(gè)基于 Docker 的 Laravel 應(yīng)用.我們的系統(tǒng)環(huán)境使用的是 Ubuntu17.04, 其他系統(tǒng)也差不多,當(dāng)然 Window 的話可能就要另當(dāng)別論了.
安裝Docker在 Ubuntu 下 Docker 的安裝和常規(guī)的軟件一樣,但是由于中國(guó)特色,還有有很多要注意的點(diǎn),待會(huì)會(huì)詳細(xì)說(shuō)明. Docker 的安裝方式有很多種,這里建議使用官方的一鍵安裝腳本來(lái),避免一系列繁瑣的操作。
1. 下載安裝curl -fsSL get.docker.com -o get-docker.sh
然后安裝,并且選擇從阿里鏡像源下載:
sudo sh get-docker.sh --mirror Aliyun2. 基本配置
其實(shí)安裝后基本上就可以使用了,主要是配置一些鏡像源和用戶組。配置鏡像源的目的不多說(shuō),用戶組主要是為了再使用的時(shí)候不用使用超級(jí)管理員權(quán)限即可運(yùn)行。
加入用戶組
sudo usermod -aG docker $USER
PS. 配置用戶組后,可能還是會(huì)出現(xiàn)還是提示沒(méi)有權(quán)限的情況,這時(shí)重啟機(jī)器即可
配置鏡像源
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-"EOF" { "registry-mirrors": ["https://be62qq2e.mirror.aliyuncs.com"] } EOF
PS. 這里的鏡像源是我自己阿里云的,同學(xué)們可以自行去阿里云獲取專有鏡像源地址
重啟
sudo systemctl daemon-reload sudo systemctl restart docker3. 安裝docker-compose
docker-compose類似一個(gè)包管理工具,方便我們管理鏡像。
curl -L https://github.com/docker/compose/releases/download/1.17.1/run.sh > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose基本概念
Docker 有兩個(gè)很重要的基本概念就是鏡像和容器. 這兩個(gè)其實(shí)就類似面向?qū)ο笾械念惡蛯?shí)例. 鏡像構(gòu)建起來(lái)后就是容器,然后容器可以啟動(dòng)停止,對(duì)于運(yùn)行于容器中的應(yīng)用在運(yùn)行過(guò)程中產(chǎn)生的數(shù)據(jù),實(shí)際上是可以保留下來(lái)的,只要不銷(xiāo)毀容器. 如果銷(xiāo)毀或者重新構(gòu)建容器后數(shù)據(jù)自然就不存在了,所以官方建議用掛載的方式來(lái)持久化, 接下來(lái)會(huì)說(shuō)到.
docker-composedocker-compose 可以說(shuō)是真正的讓 Docker 現(xiàn)代化了. 它就類似于 PHP 的 Composer 包管理工具一樣, 是用來(lái)管理多個(gè)鏡像的. 它極大的降低了學(xué)習(xí) Docker 的難度. 我們?cè)谌粘5拈_(kāi)發(fā)中, 經(jīng)常會(huì)碰到需要多個(gè)容器相互配合來(lái)完成某項(xiàng)任務(wù)的情況,比如 Web 容器和數(shù)據(jù)庫(kù)容器之間的通信,我們可以多帶帶的把一個(gè)項(xiàng)目中需要的所有容器和配置寫(xiě)到一個(gè) docker-compose.yml 文件中,來(lái)統(tǒng)一管理.來(lái)看一下一個(gè)簡(jiǎn)單的配置文件格式:
version: "3" services: nginx: build: . ports: - "80:80" redis: image: "redis:alpine"
一個(gè)項(xiàng)目可以由多個(gè)服務(wù)(容器)工程,而 docker-compose 是面向項(xiàng)目進(jìn)行管理.
文件系統(tǒng)和網(wǎng)絡(luò)這是 Docker 比較復(fù)雜的一塊,簡(jiǎn)單介紹一下. Docker 里面的文件系統(tǒng)其實(shí)很真實(shí)宿主機(jī)的一樣, 可以用同樣的命令去操作, 只是要注意的一點(diǎn)就是我們?cè)谌萜髦羞\(yùn)行的應(yīng)用配置文件的路徑全部都是基于 Docker 的,不是基于宿主機(jī)的,很多文件不存在的問(wèn)題都是這個(gè)引起來(lái)的.比如我們?cè)谶\(yùn)行一個(gè) Nginx 容器和 PHP-FPM 容器的時(shí)候,不僅要把宿主機(jī)的項(xiàng)目路徑映射到 Nginx 容器中,還要映射到 PHP-FPM 容器中,否則就會(huì)是一系列的 File not found.
Docker 中的網(wǎng)絡(luò)是有多種模式的, 在默認(rèn)情況下是會(huì)創(chuàng)建一個(gè)虛擬網(wǎng)橋的, 實(shí)際上是 Linux 的一個(gè) bridge,它會(huì)在掛載到它的網(wǎng)口之間進(jìn)行轉(zhuǎn)發(fā)。并且會(huì)隨機(jī)分配一個(gè)本地未被使用的屬于 172.17.0.0/16 網(wǎng)段的 IP 到各個(gè)容器中.這是一個(gè)網(wǎng)絡(luò)拓?fù)鋱D:
基本介紹后我們會(huì)通過(guò)一個(gè)簡(jiǎn)單的實(shí)例來(lái)加深理解, 就是部署一個(gè) Laravel 應(yīng)用. Web 服務(wù)器我們會(huì)使用 Nginx, 并且通過(guò) PHP-FPM 來(lái)處理動(dòng)態(tài)請(qǐng)求,用 MySQL 來(lái)存儲(chǔ)數(shù)據(jù), Redis 作為我們的緩存和隊(duì)列驅(qū)動(dòng). 不同于網(wǎng)上的通過(guò) Supervisor 來(lái)把所有服務(wù)運(yùn)行在同一個(gè)容器中,我們會(huì)把這四個(gè)服務(wù)運(yùn)行在四個(gè)容器中,這也是官方推薦的一種做法,然后我們會(huì)通過(guò) docker-compose 來(lái)管理所有的服務(wù)(容器).
Nginx直接上配置文件:
version: "2" services: nginx: image: nginx ports: - "8090:80" links: - php-fpm volumes: - ./nginx/www:/var/www/html - ./nginx/sites:/etc/nginx/sites-enabled - ./nginx/nginx.conf:/etc/nginx/nginx.conf command: [nginx-debug, "-g", "daemon off;"]
其中的 services 節(jié)點(diǎn)下每一個(gè)表示一個(gè)服務(wù);然后 nginx 這是個(gè)服務(wù)名可以隨便取;image 指定使用哪個(gè)鏡像來(lái)構(gòu)建; ports 表示要暴露的端口,其中 8090 是指宿主機(jī)的端口,80 是指容器中的端口;volumes 表示掛載的目錄和文件,我們這里掛載了代碼目錄,虛擬主機(jī)目錄以及配置文件;command 表示容器啟動(dòng)后要運(yùn)行的命令。我們還要在當(dāng)前目錄下創(chuàng)建一個(gè) nginx 的目錄,用來(lái)存放一系列的文件,還需要把配置文件新建并且寫(xiě)入配置內(nèi)容(具體配置內(nèi)容可以去官網(wǎng)查看,這里不說(shuō)明),最后的目錄結(jié)構(gòu)是這樣
Docker - docker-compose.yml - nginx - www - sites - nginx.conf
可以把日志一起掛載,這里沒(méi)有表述出來(lái)
然后執(zhí)行啟動(dòng)容器的命令:
docker-compose up nginx
以上不會(huì)在后臺(tái)啟動(dòng),而是會(huì)直接在當(dāng)前的 shell 上,然后我們?cè)L問(wèn)應(yīng)該就可以看到 Welcome to nginx!
PHP-FPM MySQL Redis同理我們?cè)俅闻渲?PHP-FPM,MySQL 以及 Redis 的容器了,具體過(guò)程不多講,這里貼出配置:
php-fpm: image: "bitnami/php-fpm:7.1" volumes: - ./nginx/www:/var/www/html - ./php-fpm/php.ini:/bitnami/php/conf/php.ini links: - mysql - redis mysql: image: mysql restart: always environment: MYSQL_ROOT_PASSWORD: example volumes: - /var/lib/mysql:/var/lib/mysql redis: image: redis
有一點(diǎn)要注意的是,在配置PHP-FPM容器的時(shí)候是需要把代碼目錄也掛載到容器里面的,這一點(diǎn)很容易被遺忘,網(wǎng)上很多教程都沒(méi)提到,導(dǎo)致最后雖然按照步驟走了但就是跑不起來(lái)。其中的 links 就是配置要連接到哪個(gè)容器中。比如配置了 Nginx 容器連接到 PHP-FPM 的容器,這樣我們?cè)?Nginx 的容器中就可以直接 ping php-fpm,在配置的時(shí)候也可以這樣 php-fpm:9000 來(lái)配置了。
配置文件Nginx 的配置文件,然后還要修改一下本地的 hosts 文件。
server { listen 80; listen [::]:80; root /var/www/html/laravel/public; index index.html index.php; server_name laravel-docker.app; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ .php$ { fastcgi_split_path_info ^(.+.php)(/.+)$; fastcgi_pass php-fpm:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }運(yùn)行訪問(wèn) 附錄
貼一些常用的 docker-compose 命令,其中的 dc 表示 docker-compose 命令。
dc stop 停止所有容器 dc stop nginx 停止指定容器 dc up -d 啟動(dòng)容器后臺(tái)運(yùn)行 dc ps 查看當(dāng)前容器 dc logs kafka 查看指定容器日志
歡迎關(guān)我的個(gè)人公眾號(hào):左手代碼
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/27188.html
摘要:最近部署上線一個(gè)項(xiàng)目,新的服務(wù)器,在生產(chǎn)環(huán)境安裝配置等各種東西一大堆很麻煩。本文是我學(xué)習(xí)并使用部署項(xiàng)目的一個(gè)記錄。另外我們可以部署不同版本的應(yīng)用,例如,并且互不干擾。之后部署只需要移植鏡像生成容器,就能保證環(huán)境的一致。需要使用三個(gè)鏡像。 最近部署上線一個(gè)項(xiàng)目,新的服務(wù)器,在生產(chǎn)環(huán)境安裝配置nginx、php、mysql、git、composer等各種東西一大堆很麻煩。docker已經(jīng)火...
摘要:最近部署上線一個(gè)項(xiàng)目,新的服務(wù)器,在生產(chǎn)環(huán)境安裝配置等各種東西一大堆很麻煩。本文是我學(xué)習(xí)并使用部署項(xiàng)目的一個(gè)記錄。另外我們可以部署不同版本的應(yīng)用,例如,并且互不干擾。之后部署只需要移植鏡像生成容器,就能保證環(huán)境的一致。需要使用三個(gè)鏡像。 最近部署上線一個(gè)項(xiàng)目,新的服務(wù)器,在生產(chǎn)環(huán)境安裝配置nginx、php、mysql、git、composer等各種東西一大堆很麻煩。docker已經(jīng)火...
摘要:基于快速搭建服務(wù)根據(jù)自定義配置文件快速搭建環(huán)境。目錄此項(xiàng)目能做什么地址視頻教程包含軟件項(xiàng)目目錄結(jié)構(gòu)快速運(yùn)行運(yùn)行服務(wù)運(yùn)行項(xiàng)目運(yùn)行前端服務(wù)此項(xiàng)目能做什么搭建開(kāi)發(fā)生產(chǎn)環(huán)境。搭建開(kāi)發(fā)生產(chǎn)環(huán)境。 基于Docker快速搭建Web服務(wù) 根據(jù)自定義配置文件快速搭建Web環(huán)境。 目錄 此項(xiàng)目能做什么 GItHub地址、視頻教程 包含軟件 項(xiàng)目目錄結(jié)構(gòu) 快速運(yùn)行KFKDock 運(yùn)行PHP服務(wù) 運(yùn)行L...
摘要:基于快速搭建服務(wù)根據(jù)自定義配置文件快速搭建環(huán)境。目錄此項(xiàng)目能做什么地址視頻教程包含軟件項(xiàng)目目錄結(jié)構(gòu)快速運(yùn)行運(yùn)行服務(wù)運(yùn)行項(xiàng)目運(yùn)行前端服務(wù)此項(xiàng)目能做什么搭建開(kāi)發(fā)生產(chǎn)環(huán)境。搭建開(kāi)發(fā)生產(chǎn)環(huán)境。 基于Docker快速搭建Web服務(wù) 根據(jù)自定義配置文件快速搭建Web環(huán)境。 目錄 此項(xiàng)目能做什么 GItHub地址、視頻教程 包含軟件 項(xiàng)目目錄結(jié)構(gòu) 快速運(yùn)行KFKDock 運(yùn)行PHP服務(wù) 運(yùn)行L...
閱讀 1167·2021-10-08 10:04
閱讀 3612·2021-08-05 10:01
閱讀 2372·2019-08-30 11:04
閱讀 1868·2019-08-29 15:29
閱讀 976·2019-08-29 15:12
閱讀 1760·2019-08-26 12:11
閱讀 3200·2019-08-26 11:33
閱讀 1231·2019-08-26 10:23