มาลองสร้าง LEMP Stack ง่ายๆ ด้วย Docker กัน (Part2)

Sathit Seethaphon
Yii2 Learning
Published in
9 min readSep 7, 2016

ใน part1 เราได้ลองสร้าง Docker Compose แบบง่ายๆ กันไปแล้ว ต่อไปมาลองสร้าง LEMP Stack (Linux, Nginx, MariaDB/MySQL, PHP) ด้วย Docker ในแบบที่ผมใช้งานจริงๆ โดยจะแนะนำตั้งแต่ขั้นตอนการสร้าง docker-compose.yml ไฟล์, การสร้าง Dockerfile และไฟล์ config ต่างๆ ของแต่ละ image

ในตัวอย่างนี้เราจะใช้งาน Nginx เป็น Web Server หลัก ส่วนของการรัน php เราจะใช้ nginx ส่งต่อให้ php7-fpm โดยใช้ fastcgi_pass และในส่วนของฐานข้อมูลเราใช้ MySQL

ในบทความนี้ผมจะไม่ได้อธิบายในส่วนของ Nginx จะพูดถึงแค่ส่วนที่เราจำเป็นต้องตั้งค่าในการใช้งานนะครับ (ผมก็เพิ่งลองใช้ ^^) ส่วนใครที่ยังไม่เคยใช้ Docker แนะนำอ่านบทความนี้ก่อนครับ

Docker Hub

Docker Hub คือที่รวบรวม docker image repository มีทั้งที่เป็น official และ docker image ที่คนอื่นๆ สร้างขึ้นมา ซึ่งเราสามารถเรียกมาใช้งานได้ ตัวอย่าง docker image official สังเกตง่ายๆ จะมีคำว่า official ด้วยเสมอ

docker image ที่เราเห็นทั้งหมดจะถูกสร้างมาจาก Dockerfile อีกทีและตัว Dockerfile จะเป็นที่เก็บคำสั่งสำหรับการติดตั้ง packet ต่างๆ ที่เกี่ยวข้องกับ image นั้นๆ เมื่อลองคลิกเข้าไปดูอย่างเช่น PHP ก็จะมี tag ให้เลือกมากมายเราสามารถเลือกได้ว่าจะใช้แบบใหน เช่น php:cli, php:7-fpm, php:7-apache

และเรายังสามารถคลิกเข้าไปดู Dockerfile ได้ว่าถูกสร้างมาจาก image อะไร และมีคำสั่งอะไรบ้าง ถ้าเปิดเข้าไปดูจะมีคำว่า FROM <xxx>:<xxx>

เช่น FROM debian:jessie

มันหมายความว่า Dockerfile นี้ถูกสืบทอดมาจาก image debian:jessie แล้วนำมาติดตั้ง php ต่อ ข้อดีคือมันสามารถสืบทอดต่อกันไปได้เรื่อยๆ แจ่มมาก

Dockerfile คืออะไร

ก่อนที่จะได้ container มา docker จะเริ่มจากสร้าง Dockerfile จากนั้นนำไป build เป็น image และนำไปรันเป็น container เพื่อใช้งานต่อไป

Dockerfile → Docker Image → Container

ในการใช้งานจริงเราอาจไม่ได้สร้าง Dockerfile เองเสมอไป หากเราไม่ได้ทำอะไรเพิ่มเติมอย่างเช่น docker image ของ Wordpress เราสามารถ pull image และนำมาใช้งานได้เลย เพราะเค้าเตรียมมาให้พร้อมใช้แล้ว

ข้อดีอีกอย่างของ Docker คือเราสามารถสร้าง docker image ใหม่โดยสืบทอดจาก docker image เดิมที่มีคนสร้างไว้แล้วหรือสืบทอดจาก official image ก็ได้ ทำให้เราไม่ต้องเริ่มสร้างใหม่จากศูนย์ คล้ายๆ กับ Git เลย เก็บเฉพาะส่วนที่เปลี่ยนแปลง อ่านเพิ่มเติมเกี่ยวกับหลักการสร้าง Dockerfile ที่ดีได้ที่นี่

ยกตัวอย่างเช่น ในตอนแรก เราสร้าง Dockerfile จาก docker image php สมมุติ ว่าชื่อ image A

ต่อมาเราสามารถสร้าง docker image ใหม่โดยสืบทอดจาก docker image A เดิมและทำการติดตั้ง php extension PDO เข้าไป และตั้งชื่อใหม่เป็น image B

ต่อมาเราสามารถสร้าง docker image ใหม่โดยเรียกสืบทอดจาก docker image B และทำการติดตั้ง php extension Memched เข้าไป และตั้งชื่อใหม่เป็น C

Docker image A → Docker image B → Docker image C

เราจะเห็นว่ามันสามารถสืบทอด image ต่อกันไปได้เรื่อยๆ นี่คือข้อดีอีกอย่างของ Docker image ถ้าเราอยากใช้ php แบบเพียวๆ ก็แค่เลือก image A ถ้าอยากได้ตัวที่ติดตั้ง php,memched ก็เลือกใช้ image C เป็นต้น

อ่าน Dockerfile เพิ่มเติมที่นี่

เตรียมโครงสร้าง

ให้เราสร้างโฟลเดอร์และไฟล์ตามนี้

lemp_docker_advance
├── docker-compose.yml
├── mysql
│ ├── backup
│ ├── data
│ └── initdb
├── nginx
│ ├── conf
│ │ └── nginx.conf
│ └── conf.d
│ └── default.conf
└── www
└── index.php
8 directories, 4 files
  • docker-compose.yml
  • www: เก็บไฟล์ php ที่ใช้รัน
  • mysql: โฟลเดอร์ที่เก็บข้อมูลของ MySQL ทั้งหมด ไฟล์เดอร์แรก backup เก็บข้อมูลที่ backup เป็น .sql , data ข้อมูลจริงที่เป็น Binary ทั้งหมด เราจะ Volume ออกมาเก็บไว้ที่นี่, initdb เก็บไฟล์ .sql หากเราต้องการให้มัน import เข้าให้ในครั้งแรก
  • nginx: โฟลเดอร์ที่เก็บไฟล์คอนฟิกของ nginx ทั้งหมด

สร้างไฟล์ docker-compose.yml

version: '2'
services:
db:
image: mariadb:10.1
container_name: lemp_mariadb
restart: always
volumes:
- ./mysql/initdb/:/docker-entrypoint-initdb.d
- ./mysql/data/:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=123132123
- MYSQL_DATABASE=lemp_db
- MYSQL_USER=lemp
- MYSQL_PASSWORD=123456
php:
image: php:7-fpm-alpine
container_name: lemp_php-fpm
restart: always
volumes:
- ./www/:/var/www/html
expose:
- "9000"
nginx:
image: nginx:alpine
container_name: lemp_nginx
restart: always
volumes:
- ./nginx/conf/nginx.conf:/etc/nginx/conf/nginx.conf:ro
- ./nginx/conf.d:/etc/nginx/conf.d:ro
volumes_from:
- php
ports:
- 80:80

สร้างไฟล์ www/index.php

<?php phpinfo(); ?>

สร้างไฟล์สำหรับ config nginx ดังนี้ ไฟล์แรก nginx/conf/nginx.conf

worker_processes 1;daemon off;events {
worker_connections 1024;
}
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
http {
include /etc/nginx/conf/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;sendfile on;
#tcp_nopush on;
keepalive_timeout 65;gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# tells the server to use on-the-fly gzip compression.
include /etc/nginx/conf.d/*.conf;
}

สร้างไฟล์ nginx/conf.d/default.conf

ในกรณีที่เรามีหลายๆ เว็บไซต์ก็สร้างไฟล์นี้หลายๆ ไฟล์ได้ แล้วชี้พาทไปที่โฟลเดอร์ที่ต้องการได้ ถ้าหากเราอยากจะเรวมไว้ที่ container เดียวกันนะ

server {
charset utf-8;
client_max_body_size 128M;
listen 80; ## listen for ipv4
#listen [::]:80 default_server ipv6only=on; ## listen for ipv6
#server_name app-frontend.dev;
root /var/www/html;
index index.php;
location / {
# Redirect everything that isn't a real file to index.php
try_files $uri $uri/ /index.php$is_args$args;
}
# uncomment to avoid processing of calls to non-existing static files by Yii
#location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
# try_files $uri =404;
#}
#error_page 404 /404.html;
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass php:9000;
try_files $uri =404;
}
location ~ /\.(ht|svn|git) {
deny all;
}
}

ไฟล์นี้เป็นการตั้งค่าของ nginx ว่าจะให้รันที่โฟลเดอร์อะไร

root /var/www/html;

ในกรณีที่ต้องการระบุโดเมนก็ใส่เพิ่มตรงนี้ได้

server_name app.dev;

ในส่วนที่รัน php เราจะให้ nginx ส่งต่อไปให้ php ผ่าน fastcgi_pass โดยระบุชื่อ service php ไปเลยที่ port 9000 ซึ่งใน docker-compose.yml ในส่วนของ service php จะเห็นว่าเราเปิด port 9000 ไว้

fastcgi_pass   php:9000;

ชำแระ docker_compose.yml

ลองมาดูกันว่าแต่ละส่วนของ Docker Compose มีอะไรบ้าง ส่วนใหญ่ Docker image ที่ใช้ ผมจะเลือกใช้ image ที่สร้างมาจาก Alpine เพราะเล็กและก็เบาที่สุด ซึ่งปกติแล้วที่เห็นกันเยอะๆ ก็จะเป็น image มาจาก Ubuntu ไม่ก็ Debian

สำหรับ image ที่เราเลือกใช้ในบทความชุดนี้คือ

เราลองมาชำแระแต่ละส่วนของ service ใน docker-compose.yml กัน

version: '2'
services:
db:
image: mariadb:10.1
container_name: lemp_mariadb
restart: always
volumes:
- ./mysql/initdb/:/docker-entrypoint-initdb.d
- ./mysql/data/:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=123132123
- MYSQL_DATABASE=lemp_db
- MYSQL_USER=lemp
- MYSQL_PASSWORD=123456
php:
image: php:7-fpm-alpine
container_name: lemp_php-fpm
restart: always
volumes:
- ./www/:/var/www/html
expose:
- "9000"
nginx:
image: nginx:alpine
container_name: lemp_nginx
restart: always
volumes:
- ./nginx/conf/nginx.conf:/etc/nginx/conf/nginx.conf:ro
- ./nginx/conf.d:/etc/nginx/conf.d:ro
volumes_from:
- php
ports:
- 80:80

ถ้าดูตามไฟล์ docker-compose.yml เราจะเห็นว่ามี service อยู่ทั้งหมด 3 ตัวด้วยกันคือ db, php, nginx

→ db

เป็น service ที่รัน mysql เก็บข้อมูลของเราทั้งหมด

volumes:
- ./mysql/initdb/:/docker-entrypoint-initdb.d
- ./mysql/data/:/var/lib/mysql

ใน service เราจะทำ volume 2 โฟลเดอร์ดังนี้

โฟลเดอร์แรก mysql/initdb/ เราจะทำ volume ไปที่ docker-entrypoint-initdb.d ของ container ถ้าหากเราต้องการที่ import ข้อมูลที่เป็นไฟล์ .sql ให้นำมาไว้ที่นี่ mysql/initdb/ ในครั้งแรกที่รัน docker จะ import data เข้าฐานให้อัตโนมัติ

โฟลเดอร์ที่ 2 mysql/data/ เราจะทำ volume ชี้ไปที่ /var/lib/mysql เพื่อมันอ่านและเขียนไฟล์บน host ของเรา (นอก Container) เวลาที่ย้ายหรือเปลี่ยนเวอร์ชั่นก็ชี้ volume มาที่นี่ ก็จะได้ข้อมูลเดิม

ในส่วนของ environment variables สามารถกำหนดค่าได้ดังนี้ สามารถดูเพิ่มเติมได้ที่นี่

- MYSQL_ROOT_PASSWORD=123132123
- MYSQL_DATABASE=lemp_db
- MYSQL_USER=lemp
- MYSQL_PASSWORD=123456

→ php

เป็น service ที่มีหน้าที่รัน php อย่างเดียวซึ่งจะถูกส่งต่อมาจาก nginx อีกที

→ nginx

เป็น service ที่รัน Web server

ใช้งาน Docker Compose

ตอนนี้เราได้เตรียมข้อมูลไฟล์ โฟลเดอร์ต่างๆ ครบแล้ว เราสามารถใช้งานได้เลย ให้เรา cd เข้าไปที่โฟลเดอร์ lemp_docker_advance ที่เราสร้างไว้ จากนั้นรันคำสั่ง

สั่งรัน

docker-compose up -d

จะได้ผลลัพธ์ดังนี้

Creating network "lempdockeradvance_default" with the default driver
Creating lemp_mariadb
Creating lemp_php-fpm
Creating lemp_nginx

ให้เข้าไปที http://127.0.0.1 จะได้หน้าตา php ดังนี้

ตอนนี้ผมใช้ docker for mac อยู่ถ้าใครใช้ docker toolbox ต้องดู ip ว่า host ของเราชื่ออะไรแล้วพิมพ์เข้าใช้งานตาม ip นั้น! ใช้ docker for mac หรือ docker for windows ง่ายกว่าครับ

ตรวจสอบ services

เราสามารถตรวจสอบ services ที่รันแล้วด้วยคำสั่ง

docker-compose ps   

เราจะเห็นรายการ service แต่ละตัวสถานะเป็นยังไง รันที่ port อะไร และชื่อ container เวลาที่เราตรวจสอบสถานะต่างๆ ก็ใช้คำสั่งนี้ สังเกตง่ายๆ ถ้ารันได้ปกติตรง state ต้องเป็น up เท่านั้น

การ ssh เข้าไปที่ container

ทำได้ 2 แบบ คือผ่าน docker

docker exec -it lemp_nginx sh

ผ่าน docker-compose

docker-compose exec nginx sh

จากนั้นมันก็จะเข้าไปใน container ได้ สังเกตข้อแตกต่าง docker จะใช้ชื่อ container แต่ docker-compose จะใช้ชื่อ service แทนในการเรียก container นะครับ

ปกติในกรณีทั่วไปการ exec จะตามท้ายด้วย bash เช่น docker exec -it lemp_nginx bash, docker-compose exec nginx bash ในตัวอย่างนี้ผมใช้ image มาจาก apline มันกำหนดให้ใช้ sh ครับ

การ stop service

เราสามารถสั่งหยุดการทำงานของ service ได้ดังนี้ สั่งให้อยุดทำงานทั้งหมด

docker-compose stop

สั่งให้ stop service ตามชื่อที่เราระบุ

docker-compose stop php

การ start service

สั่ง start service ทั้งหมด

docker-compose start

สั่งให้ start service ตามชื่อที่เราระบุ

docker-compose start php

คำสั่งดู log

ดู logs ทั้งหมด

docker-compose log

ดู log ตามชื่อ service

docker-compose logs php

คำสั่งสุดท้าย down

down จะเป็นการสั่ง stop container และ ลบ containers , networks, volumes และ images ที่สร้างโดย docker-compose up

docker-compose down

จะได้ผลลัพธ์ประมาณนี้

docker-compose down
Stopping lemp_nginx ... done
Stopping lemp_php-fpm ... done
Stopping lemp_mariadb ... done
Removing lemp_nginx ... done
Removing lemp_php-fpm ... done
Removing lemp_mariadb ... done
Removing network lempdockeradvance_default

Import ฐานข้อมูล MySQL

image ของ mariadb สามารถกำหนดค่าให้นำมันเข้าไฟล์ .sql ในตอนรันครั้งแรกได้ เพียงแค่ทำ volume โฟลเดอร์ที่เก็บไฟล์ .sql แล้วชี้ไปที่ /docker-entrypoint-initdb.d ใน container

ถ้าหากเรากลับไปดูที่ docker-compose.yml เราได้ทำ volumes ให้กับ service db 2 โฟลเดอร์ดังนี้

volumes:
- ./mysql/initdb/:/docker-entrypoint-initdb.d
- ./mysql/data/:/var/lib/mysql
  • mysql/initdb สำหรับเก็บไฟล์ sql ที่ต้องการให้ import ในตอนแรก
  • mysql/data ที่เก็บไฟล์ฐานข้อมูลที่เราทำ volume เข้าไปใน container

ซึ่งปกติโดยการทำงานจะมีลำดับดังนี้

  • เมื่อรันครั้งแรกมันจะเช็คว่าใน mysql/data ที่เราทำ volume มีข้อมูลหรือยัง
  • ถ้ายังไม่มีจะ import ไฟล์ .sql มาจาก mysql/intdb/ ให้อัตโนมัติ เพียงแค่นำไฟล์ .sql มาไว้ที่นี่

เมื่อเราเปิดใช้งานให้ไปดูที่โฟลเดอร์ mysql/data จะพบกับข้อมูลที่เป็น Binary แบบนี้

mysql
├── backup
├── data
│ ├── aria_log.00000001
│ ├── aria_log_control
│ ├── ib_logfile0
│ ├── ib_logfile1
│ ├── ibdata1
│ ├── lemp_db
│ ├── multi-master.info
│ ├── mysql
│ ├── performance_schema
│ └── tc.log
└── initdb

ถ้าหากมีข้อมูล binary ในโฟลเดอร์ mysql/data แล้วมันจะไม่ import ไฟล์ .sql ใน mysql/initdb อีก ถ้าอยากให้มัน import ใหม่ต้อง clear ข้อมูลใน mysql/data ของเราให้หมดครับ แล้วสั่งรัน docker-compose up -dใหม่อีกที

การ Backup ฐานข้อมูล MySQL

ปกติการ backup ฐานข้อมูลเราจะใช้คำสั่ง mysqldump ใน mysql เพื่อ export ข้อมูล ซึ่งเราสามารถ exec เข้าไปใน container ตรงๆ เพื่อเรียกใช้งาน mysqldump ได้

docker exec lemp_mariadb sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --databases $MYSQL_DATABASE' > "./mysql/backup/backup.sql"

เราจะได้ไฟล์ mysql/backup/backup.sql มา 1 ไฟล์

mysql/backup
└── backup.sql
0 directories, 1 files

เพื่อให้เราสามารถทำการ backup ฐานข้อมูลได้สะดวกยิ่งขึ้นเราจะเขียนเป็นไฟล์ .sh แล้วสั่งเรียกใช้งานอีกที

สร้างไฟล์ mysql/backup.sh

#!/bin/bash
NOW=$(date +"%m-%d-%Y_%H-%M")
FILE="backup-$NOW.sql"
docker exec lemp_mariadb sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --databases $MYSQL_DATABASE' > "./mysql/backup/$FILE"
echo "Backing up data complate."

เรียกใช้งาน

. mysql/backup.sh

จะพบกับไฟล์ backup-วันที่เวลา.sql

mysql/backup
├── backup-09-08-2016_00-16.sql
└── backup.sql
0 directories, 2 files

ดูวิธีการ backup เต็มๆ ได้ที่นี่

ติดตั้ง extension php เพิ่มเติม

ในกรณีที่เราจำเป็นที่จะต้องติดตั้ง extension ต่างๆ เพิ่มเติมเราสามารถทำได้โดยการใช้ Dockerfile เพื่อสร้าง image ขึ้นมาใช้งานเอง ตัวอย่างนี้ base image มาจาก php official ผมเลือกเป็น 7-fpm-alpine จากนั้นเราจะทำการสร้าง dockerfile และติดตั้ง php extension คือ Gd, Intl, pdo_mysql, memched และอื่นๆ ที่จำเป็น เพิ่มเติมเข้าไป รายละเอียดการติดตั้งดูเพิ่มเติมได้ที่ official image ของ php

สร้างไฟล์ ไว้ที่ lemp_docker_advance/Dockerfile

FROM php:7-fpm-alpineMAINTAINER Sathit Seethaphon <dixonsatit@gmail.com>RUN apk upgrade --update && apk --no-cache add \
git autoconf file g++ gcc binutils isl libatomic libc-dev musl-dev make re2c libstdc++ libgcc libcurl binutils-libs mpc1 mpfr3 gmp libgomp coreutils freetype-dev libjpeg-turbo-dev libltdl libmcrypt-dev libpng-dev openssl-dev libxml2-dev expat-dev icu-dev libmemcached-dev \
&& docker-php-ext-install iconv mysqli pdo pdo_mysql curl bcmath mcrypt mbstring json xml zip bz2 opcache intl \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install gd
EXPOSE 9000CMD ["php-fpm"]

แก้ไขไฟล์ docker-compose.yml

เราจะแก้ไขในส่วนของ image จากเดิมที่เป็น image: php:7-fpm-alpine ให้ลบออกเปลี่ยนเป็น build: ./ เพื่อให้มัน build image จาก Dockerfile ที่เราสร้างขึ้นมาใหม่ ถ้าหากเราเก็บ Dockerfile ไว้ที่อื่นเช่น เก็บไว้ในโฟลเดอร์ php ก็ระบุ build: ./php/

version: '2'
services:
db:
image: mariadb:10.1
container_name: lemp_mariadb
restart: always
volumes:
- ./mysql/initdb/:/docker-entrypoint-initdb.d
- ./mysql/data/:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=123132123
- MYSQL_DATABASE=lemp_db
- MYSQL_USER=lemp
- MYSQL_PASSWORD=123456
php:
build: ./
container_name: lemp_php-fpm
restart: always
volumes:
- ./www/:/var/www/html
expose:
- "9000"
nginx:
image: nginx:alpine
container_name: lemp_nginx
restart: always
volumes:
- ./nginx/conf/nginx.conf:/etc/nginx/conf/nginx.conf:ro
- ./nginx/conf.d:/etc/nginx/conf.d:ro
volumes_from:
- php
ports:
- 80:80

จากนั้นสั่ง build และ start service

docker-compose up -d

จะได้ผลลัพธ์ประมาณนี้ รอซักครู่ให้มันสร้าง image ในครั้งต่อๆ ก็จะเร็วขึ้น

docker-compose up -dCreating network "lempdockeradvance_default" with the default driver
Building php
Step 1 : FROM php:7-fpm-alpine
---> cd228f10875c
Step 2 : MAINTAINER Sathit Seethaphon <dixonsatit@gmail.com>
---> Using cache
---> dbdec59fc1e7
Step 3 : RUN apk add --no-cache
........

เมื่อเสร็จแล้วให้เข้าไปที่หน้า http://127.0.0.1

สังเกตเราจะเห็น php extension ใหม่ที่เราได้ติดตั้งเพิ่มเข้าไปแล้ว

เพิ่ม PhpMyAdmin

สุดท้ายเพื่อให้การเข้าถึงฐานข้อมูลทำได้ง่ายเราจะติดตั้ง PhpMyAdmin เข้าไปโดยการเพิ่ม service phpmyadmin โดยเราจะใช้ image phpmyadmin

แก้ไขไฟล์ docker-compose.yml เราจะตั้งชื่อ service ใหม่ว่า pma และระบุให้รันที่ port 8000

version: '2'
services:
db:
image: mariadb:10.1
container_name: lemp_mariadb
restart: always
volumes:
- ./mysql/initdb/:/docker-entrypoint-initdb.d
- ./mysql/data/:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=123132123
- MYSQL_DATABASE=lemp_db
- MYSQL_USER=lemp
- MYSQL_PASSWORD=123456
php:
build: ./
container_name: lemp_php-fpm
restart: always
volumes:
- ./www/:/var/www/html
expose:
- "9000"
nginx:
image: nginx:alpine
container_name: lemp_nginx
restart: always
volumes:
- ./nginx/conf/nginx.conf:/etc/nginx/conf/nginx.conf:ro
- ./nginx/conf.d:/etc/nginx/conf.d:ro
volumes_from:
- php
ports:
- 80:80
pma:
image: phpmyadmin/phpmyadmin
container_name: lemp-phpmyadmin
restart: always
ports:
- "8000:80"

จากนั้นรันคำสั่ง up อีกครั้ง

docker-compose up -dlemp_php-fpm is up-to-date
lemp_mariadb is up-to-date
lemp_nginx is up-to-date
Creating lemp-phpmyadmin

ตรวจสอบ service ว่ารันได้จริงหรือไม่

docker-compose ps

ลองเข้าไปที่ http://127.0.0.1:8000 จะพบหน้าจอของ PhpMyAdmin จากนั้นให้เรากรอกข้อมูล username กับ password ที่เรากำหนดไว้ใน docker-compose ไฟล์ ก็จะสามารถใช้งานได้ปกติ

เพิ่ม domain ให้กับ PhpMyAdmin

การที่เราเข้าใช้งาน phpmyadmin โดยระบุ port ด้วยอาจจะไม่สะดวกเท่าที่ควรเราสามารถเพิ่ม sub domain ให้กับ phpmyadmin ได้

สร้างไฟล์ชื่อว่า nginx/conf.d/pma.conf

#PhpMyAdmin
server {
listen 80;
server_name pma.lemp.dev;
location / {
proxy_pass http://pma.lemp.dev:8000;
}
}

จากนั้นสั่ง restart service nginx

docker-compose restart nginx

ลองเข้า phpmyadmin ผ่านโดเมนใหม่

ในส่วนของ sub domain ตรงนี้ เราต้องเพิ่มเองให้เสร็จเรียบร้อยในตัวจัดการ domain ที่เราซื้อมา

บทสรุป

ขั้นตอนของการใช้งาน docker-compose คือ

  • เลือก image
  • สร้าง docker-compose.yml ไฟล์
  • สร้าง Dockerfile (ในกรณีต้องการสร้าง image เอง)
  • สร้างไฟล์ config ต่างๆ
  • ทดสอบรันและตรวจสอบว่าทำงานได้จริง

คิดว่าคงพอทำให้เรามองภาพการใช้งาน Docker Compose มากขึ้น ผมเองก็เพิ่งได้ลองใช้งานประมาณ 2 เดือนก็รู้สึกชอบมากๆ หวังว่าคุณก็คงจะชอบเช่นกันครับ ^^

Download Source code

Referent

--

--