最近部署上線一個項目,新的服務器,在生產環境安裝配置nginx、php、mysql、git、composer等各類東西一大堆很麻煩。docker已經火了一段時間,已經成了後端和運維的必備技能,以前老大也說要嘗試下,因而就來體驗一下docker的魅力。本文是我學習並使用docker部署項目的一個記錄。php
docker的主要優點能夠總結爲:一次構建,處處部署。當咱們使用docker構建好項目後,在開發環境、測試環境、生產環境均可以使用統一的鏡像來部署,保證了環境的一致。而且docker支持linux、mac os、windows三大平臺,代碼運行在容器中,不受外部操做系統的影響,只和你的鏡像有依賴關係。mysql
另外咱們能夠部署不一樣版本的應用,例如mysql5.五、mysql5.7,而且互不干擾。linux
關於docker的安裝和相關概念在此都不贅述了,網上有不少資料,說下具體實施的思路。nginx
正確的使用方式不是項目完成後纔開始構建docker鏡像,而是項目架構、依賴、環境肯定了以後就構建和配置好docker鏡像,以後代碼的開發和運行都在容器之中。以後部署只須要移植鏡像生成容器,就能保證環境的一致。laravel
我這個項目很簡單,只用到nginx、php、mysql這三件套,nginx使用php-fpm做爲cgi解析器。須要使用三個鏡像:nginx、php-fpm、mysql。爲何要用三個鏡像而不是把這三個集成到一個大鏡像中?這是docker推薦的作法,鏡像之間儘可能解耦,方便複用,避免臃腫的鏡像,容器間經過網絡鏈接起來。git
官方提供了不少優質鏡像,咱們只須要挑選並基於官方鏡像來配置就好。github
DockerFile:docker
FROM nginx:1.10 ADD nginx.conf /etc/nginx/nginx.conf ADD site.conf /etc/nginx/conf.d/ ADD mkdir.sh /opt/ RUN chmod +x /opt/mkdir.sh && /opt/mkdir.sh
將基本配置和站點配置複製進去,用shell腳步來建立好log文件夾shell
DockerFile:
FROM php:7.0-fpm ADD apt-list /opt/ RUN cp /etc/apt/sources.list /etc/apt/sources.list.bak \ && cat /opt/apt-list > /etc/apt/sources.list \ && apt-get update \ && apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng-dev RUN docker-php-ext-install -j$(nproc) iconv mcrypt \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd \ && docker-php-ext-install pdo_mysql \ && docker-php-ext-install zip RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \ && composer config -g repo.packagist composer https://packagist.phpcomposer.com \
php鏡像的是最麻煩的,要裝系統依賴,php擴展,composer,還要設置環境變量。php擴展那塊參考官方鏡像dockr-hub-php
使用了apt,因此咱們要修改apt源,官方php鏡像是基於debian的,不是ubuntu的源。
dockerfile一個run建一層,這裏建議apt install做爲一層,安裝php擴展做爲一層,而不是都放在一層。這樣的好處就是若是第二層php擴展裝失敗了,不用再跑一遍apt install。最後一層咱們裝上composer。
爲了讓php版本一致,咱們應該調用php容器內的php做爲cli:
docker run -it -v $PWD:/opt/code -w /opt/code my-php php -v
命令太長了,咱們能夠作個alias,在~/.bash_aliases中加入一行(注意最後空格):
alias myphp='docker run -it -v $PWD:/opt/code -w /opt/code --rm my-php '
咱們在yourpath/opt/code下建立laravel應用,修改權限,注意在宿主機將你加入www-data group:
cd ~/docker-php/opt/code myphp composer create-project --prefer-dist laravel/laravel . sudo chown -R www-data:www-data . && sudo chmod -R 775 .
DockerFile:
FROM mysql:5.7
mysql最簡單,直接用官方的就好了
咱們如今有三個鏡像,若是一個個啓動、鏈接、掛載很麻煩,官方提供了docker-compose工具,將配置寫在一塊兒,一鍵啓動。
docker-compose.yml:
nginx: build: ./nginx ports: - "80:80" links: - "php" volumes: - ~/docker-php/opt:/opt php: build: ./php ports: - "9000:9000" links: - "mysql" volumes: - ~/docker-php/opt:/opt mysql: build: ./mysql ports: - "3306:3306" volumes: - ~/docker-php/opt/data/mysql:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: 123456
使用docker-compose up命令啓動容器組:
啓動訪問 yourhost:80 能夠看到熟悉的laravel歡迎頁面:
進入mysql容器建個數據庫建個表測試一下數據庫鏈接:
docker exec -it dockerphp_mysql_1 bash
修改yourpath/opt/code/routes:
測試了一下報錯:
SQLSTATE[HY000] [2002] Connection refused
google了一下,修改一下.env,把db_host改成你的ip:
DB_HOST=127.0.0.1 -> DB_HOST=yourhost
訪問/mysql,頁面輸出,大功告成:
Reference: