Docker 起手式-實做篇

18rauoim91ri5valpuuuaow

本文我們將使用 Machine、Compose 及 Docker engine 建立一個 LAMP 應用。

Docker-machine

首先我們借助 Machine 建立一個可以運行 Docker 的環境

$ docker-machine create --driver virtualbox default

看到下面訊息表示,已經建立好 VirtualBox 環境

1f8cltgun19nkqpzald8g_a

用以下命令查看已建立的 machine

$ docker-machine ls

接著運行以下命令查看 VirtualBox 的環境設置

$ docker-machine env default
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.102:2376"
export DOCKER_CERT_PATH="/Users/SDLyu/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
# Run this command to configure your shell:
# eval "$(docker-machine env default)"

最後記得設置環境,才算完成設置 VirtualBox

$ eval "$(docker-machine env default)"

更多命令選項可以參考 Docker Machine command line reference

Docker-compose

有了運行 Docker 的環境之後,接著要開始構建我們的應用,分別需要三個容器

  1. Apache + PHP
  2. MySQL
  3. Memcache

我們將使用 Compose 來構建應用,首先在專案底下新增 docker-compose.yml,我們先指明需要的三個組件 mysql、memcached 及 web

mysql:
memcached:
web:

目前使用 MySQL 及 Memcached 做為資料儲存容器,不需要額外的套件,所以選擇官方鏡像及設定環境變數,最後曝露出端口給 Web 容器使用即可。

mysql:
   image: mysql
   ports:
       — 3306:3306
   environment:
       MYSQL_USERNAME: root
       MYSQL_ROOT_PASSWORD: password
       MYSQL_PASSWORD: password
       MYSQL_DATABASE: sample_db
memcached:
   image: memcached
   ports:
       — 11211:11211
web:

接著來構建 Apache + PHP,你可以重頭開始建造 Apache + PHP,但我們選擇更快速的做法,直接使用 PHP 官方的 Docker 鏡像。在專案底下建立 Dockerfile 並指定使用的鏡像

FROM php:5.6-apache

接著更新並安裝其它套件

RUN apt-get update \
   && apt-get install -y libmemcached11 libmemcachedutil2 build-essential libmemcached-dev libz-dev \
   && pecl install memcached \
   && echo extension=memcached.so >> /usr/local/etc/php/conf.d/memcached.ini \
   && apt-get remove -y build-essential libmemcached-dev libz-dev \
   && apt-get autoremove -y \
   && apt-get clean \
   && rm -rf /tmp/pear
# 官方的 PHP 鏡像,有提供安裝 PHP extension 指令
RUN docker-php-ext-install mysql mysqli pdo pdo_mysql mbstring
# 啟動 rewrite 模組
RUN a2enmod rewrite

接著設定 Apache 環境變數

ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
# 建議自備 app.conf 及 php.ini,官方鏡像是無法修改 php.ini 的,只能覆蓋
ADD app.conf /etc/apache2/sites-enabled/app.conf
COPY php.ini /usr/local/etc/php/

最後,如果是運行 Mac 上,記得加上下面的指令,使得掛載的 volume 檔案可以被 Apache 修改

RUN usermod -u 1000 www-data
RUN usermod -G staff www-data

附上完整的 Dockerfile

FROM php:5.6-apache
RUN apt-get update \
 && apt-get install -y libmemcached11 libmemcachedutil2 build-essential libmemcached-dev libz-dev \
 && pecl install memcached \
 && echo extension=memcached.so >> /usr/local/etc/php/conf.d/memcached.ini \
 && apt-get remove -y build-essential libmemcached-dev libz-dev \
 && apt-get autoremove -y \
 && apt-get clean \
 && rm -rf /tmp/pear
RUN docker-php-ext-install mysql mysqli pdo pdo_mysql mbstring
RUN a2enmod rewrite
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ADD app.conf /etc/apache2/sites-enabled/app.conf
COPY php.ini /usr/local/etc/php/
RUN usermod -u 1000 www-data
RUN usermod -G staff www-data

到目前為止三個組件已經準備好了。

我們新增一個 index.php 到專案目錄下

<?php
phpinfo();

接著將專案目錄掛載至 Docker,並將 Apache 與MySQL、Memcached 連接起來,最後的 docker-compose.yml 如下

mysql:
   image: mysql
   ports:
       — 3306:3306
   environment:
       MYSQL_USERNAME: root
       MYSQL_ROOT_PASSWORD: password
       MYSQL_PASSWORD: password
       MYSQL_DATABASE: sample_db
memcached:
   image: memcached
   ports:
       — 11211:11211
web:
   build: .
   ports:
       — 80:80
   volumes:
       — .:/var/www/html/
   links:
     — mysql:mysql
     — memcached:memcached

啟動 Web 應用

所有的設置都準備好了! 可以啟動 Web 應用了,先構建出 Docker 容器

$ docker-compose build

接著運行容器,加上 -d 表明在背景運行

$ docker-compose up -d

如果都沒有異常,用瀏覽器開啟應用的網址 (像我自已的是 192.168.99.102),就可以看到 Web 應用的畫面了。

15edjf9ylzwecrljgog2yug

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

w

連結到 %s