มาลองสร้าง LEMP Stack ง่ายๆ ด้วย Docker กัน (Part2)
ใน 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.php8 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=123456php:
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 ที่เราเลือกใช้ในบทความชุดนี้คือ
- nginx ใช้ nginx:alpine
- php ใช้ php:7-fpm-alpine
- Mysql ใช้ mariadb:latest
เราลองมาชำแระแต่ละส่วนของ 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=123456php:
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.sql0 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.sql0 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 gdEXPOSE 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=123456php:
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=123456php:
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:80pma:
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
- https://www.jaynarol.com/docker-compose-part-3/
- https://teamteam.me/ติดตั้ง-wordpress-บน-docker-lemp-stack-b61623ca28e3?source=linkShare-e7541e05dd20-1473309955&gi=11116b727c5a