摘要:簡介其實(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)來支持于是在應(yīng)用代碼的執(zhí)行效
Docker簡介
其實(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)來支持. 于是在應(yīng)用代碼的執(zhí)行效率, 內(nèi)存的使用以及文件的讀取速度都比傳統(tǒng)虛擬化的方式來的強(qiáng). 而且它的啟動速度非???往往都是在毫秒級的,可以大大的節(jié)約了開發(fā)測試以及部署的時(shí)間.
其實(shí)對于開發(fā)人員來說, Docker 一個(gè)更大的意義就是可以保證擁有一致的運(yùn)行環(huán)境, 程序員最常見的就是在開發(fā)測試部署環(huán)境不一致的情況下, 經(jīng)常會觸發(fā)一些莫名奇妙的BUG, 為了杜絕「這段代碼在我機(jī)器上沒問題啊」這類的問題,這也是我們要去學(xué)習(xí) Docker 的理由之一.
網(wǎng)上充斥著大量的關(guān)于 Docker 各個(gè)方面的教程和資料, 而且由于 Docker 的飛速發(fā)展, 很多教程其實(shí)都過時(shí)了, 對于初學(xué)者來說很難去分辨把握, 隨之而來的就是一系列的坑與問題, 漸漸的磨滅了學(xué)習(xí)者的動力. 其實(shí)學(xué)習(xí)一門新技術(shù)最好的永遠(yuǎn)都是從官方的文檔入手, 然后就是 GitHub 上面一個(gè)技術(shù)人員的學(xué)習(xí)筆記, 最重要的是要去摸索實(shí)踐, 并且做好學(xué)習(xí)筆記. 其實(shí)學(xué)習(xí)一門新技術(shù), 如果有正確的學(xué)習(xí)方法是可以少走很多彎路的, 這個(gè)有機(jī)會會寫一篇心得.
快速入門這里限制于篇幅和作者水平, 不會大談 Docker 底層原理以及技術(shù)實(shí)現(xiàn),也不會教你如何寫一個(gè)繁瑣的 Dockerfile, 而是會從一個(gè)普通開發(fā)者的身份入手, 帶你從零搭建一個(gè)基于 Docker 的 Laravel 應(yīng)用.我們的系統(tǒng)環(huán)境使用的是 Ubuntu17.04, 其他系統(tǒng)也差不多,當(dāng)然 Window 的話可能就要另當(dāng)別論了.
安裝Docker在 Ubuntu 下 Docker 的安裝和常規(guī)的軟件一樣,但是由于中國特色,還有有很多要注意的點(diǎn),待會會詳細(xì)說明. Docker 的安裝方式有很多種,這里建議使用官方的一鍵安裝腳本來,避免一系列繁瑣的操作。
1. 下載安裝curl -fsSL get.docker.com -o get-docker.sh
然后安裝,并且選擇從阿里鏡像源下載:
sudo sh get-docker.sh --mirror Aliyun2. 基本配置
其實(shí)安裝后基本上就可以使用了,主要是配置一些鏡像源和用戶組。配置鏡像源的目的不多說,用戶組主要是為了再使用的時(shí)候不用使用超級管理員權(quán)限即可運(yùn)行。
加入用戶組
sudo usermod -aG docker $USER
PS. 配置用戶組后,可能還是會出現(xiàn)還是提示沒有權(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)建起來后就是容器,然后容器可以啟動停止,對于運(yùn)行于容器中的應(yīng)用在運(yùn)行過程中產(chǎn)生的數(shù)據(jù),實(shí)際上是可以保留下來的,只要不銷毀容器. 如果銷毀或者重新構(gòu)建容器后數(shù)據(jù)自然就不存在了,所以官方建議用掛載的方式來持久化, 接下來會說到.
docker-composedocker-compose 可以說是真正的讓 Docker 現(xiàn)代化了. 它就類似于 PHP 的 Composer 包管理工具一樣, 是用來管理多個(gè)鏡像的. 它極大的降低了學(xué)習(xí) Docker 的難度. 我們在日常的開發(fā)中, 經(jīng)常會碰到需要多個(gè)容器相互配合來完成某項(xiàng)任務(wù)的情況,比如 Web 容器和數(shù)據(jù)庫容器之間的通信,我們可以多帶帶的把一個(gè)項(xiàng)目中需要的所有容器和配置寫到一個(gè) docker-compose.yml 文件中,來統(tǒng)一管理.來看一下一個(gè)簡單的配置文件格式:
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ù)雜的一塊,簡單介紹一下. Docker 里面的文件系統(tǒng)其實(shí)很真實(shí)宿主機(jī)的一樣, 可以用同樣的命令去操作, 只是要注意的一點(diǎn)就是我們在容器中運(yùn)行的應(yīng)用配置文件的路徑全部都是基于 Docker 的,不是基于宿主機(jī)的,很多文件不存在的問題都是這個(gè)引起來的.比如我們在運(yùn)行一個(gè) Nginx 容器和 PHP-FPM 容器的時(shí)候,不僅要把宿主機(jī)的項(xiàng)目路徑映射到 Nginx 容器中,還要映射到 PHP-FPM 容器中,否則就會是一系列的 File not found.
Docker 中的網(wǎng)絡(luò)是有多種模式的, 在默認(rèn)情況下是會創(chuàng)建一個(gè)虛擬網(wǎng)橋的, 實(shí)際上是 Linux 的一個(gè) bridge,它會在掛載到它的網(wǎng)口之間進(jìn)行轉(zhuǎn)發(fā)。并且會隨機(jī)分配一個(gè)本地未被使用的屬于 172.17.0.0/16 網(wǎng)段的 IP 到各個(gè)容器中.這是一個(gè)網(wǎng)絡(luò)拓?fù)鋱D:
基本介紹后我們會通過一個(gè)簡單的實(shí)例來加深理解, 就是部署一個(gè) Laravel 應(yīng)用. Web 服務(wù)器我們會使用 Nginx, 并且通過 PHP-FPM 來處理動態(tài)請求,用 MySQL 來存儲數(shù)據(jù), Redis 作為我們的緩存和隊(duì)列驅(qū)動. 不同于網(wǎng)上的通過 Supervisor 來把所有服務(wù)運(yùn)行在同一個(gè)容器中,我們會把這四個(gè)服務(wù)運(yùn)行在四個(gè)容器中,這也是官方推薦的一種做法,然后我們會通過 docker-compose 來管理所有的服務(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è)鏡像來構(gòu)建; ports 表示要暴露的端口,其中 8090 是指宿主機(jī)的端口,80 是指容器中的端口;volumes 表示掛載的目錄和文件,我們這里掛載了代碼目錄,虛擬主機(jī)目錄以及配置文件;command 表示容器啟動后要運(yùn)行的命令。我們還要在當(dāng)前目錄下創(chuàng)建一個(gè) nginx 的目錄,用來存放一系列的文件,還需要把配置文件新建并且寫入配置內(nèi)容(具體配置內(nèi)容可以去官網(wǎng)查看,這里不說明),最后的目錄結(jié)構(gòu)是這樣
Docker - docker-compose.yml - nginx - www - sites - nginx.conf
可以把日志一起掛載,這里沒有表述出來
然后執(zhí)行啟動容器的命令:
docker-compose up nginx
以上不會在后臺啟動,而是會直接在當(dāng)前的 shell 上,然后我們訪問應(yīng)該就可以看到 Welcome to nginx!
PHP-FPM MySQL Redis同理我們再次配置 PHP-FPM,MySQL 以及 Redis 的容器了,具體過程不多講,這里貼出配置:
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)上很多教程都沒提到,導(dǎo)致最后雖然按照步驟走了但就是跑不起來。其中的 links 就是配置要連接到哪個(gè)容器中。比如配置了 Nginx 容器連接到 PHP-FPM 的容器,這樣我們在 Nginx 的容器中就可以直接 ping php-fpm,在配置的時(shí)候也可以這樣 php-fpm:9000 來配置了。
配置文件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)行訪問 附錄
貼一些常用的 docker-compose 命令,其中的 dc 表示 docker-compose 命令。
dc stop 停止所有容器 dc stop nginx 停止指定容器 dc up -d 啟動容器后臺運(yùn)行 dc ps 查看當(dāng)前容器 dc logs kafka 查看指定容器日志
歡迎關(guān)我的個(gè)人公眾號:左手代碼
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://hztianpu.com/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)目能做什么搭建開發(fā)生產(chǎn)環(huán)境。搭建開發(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)目能做什么搭建開發(fā)生產(chǎn)環(huán)境。搭建開發(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...
閱讀 1169·2021-10-08 10:04
閱讀 3612·2021-08-05 10:01
閱讀 2373·2019-08-30 11:04
閱讀 1873·2019-08-29 15:29
閱讀 976·2019-08-29 15:12
閱讀 1761·2019-08-26 12:11
閱讀 3203·2019-08-26 11:33
閱讀 1231·2019-08-26 10:23