Trong quá trình phát triển các dự án, điều cần thiết là tái tạo được nhiều môi trường dev và test, mô phỏng được môi trường triển khai của dự án, như vậy sẽ hạn chế rủi ro và lỗi xảy ra lúc triển khai.

Chúng ta có thể áp dụng Docker để tạo các môi trường khác nhau theo đúng mục đích của mình.

Bài viết này sẽ hướng dẫn cách tạo môi trường web php 5.3 trên ubuntu 12.04

 

I. Dockerfile

 

Dockerfile là 1 file text chứa các lệnh thực thi để build 1 image cho docker. Với dockerfile chúng ta có 1 phương tiện tiện dụng để build các image 1 cách tự động và share với nhau 1 cách dễ dàng, 1 team của 1 dự án có thể dung dockerfile để tạo các môi trường dev và test đồng nhất với nhau

Docker file có các lệnh cơ bản sau mà chúng ta sẽ dùng trong bài viết này:

 

1. FROM <image>

 

Đây là lệnh phải có với bất kỳ 1 dockerfile nào, và phải nằm ở line đầu tiên của file

Mục đích của lệnh là set image làm cơ sở để từ đó tạo nên image muốn build

Ví dụ: FROM ubuntu:12.04

Nếu image cơ sở này không tồn tại trong local thì docker sẽ tự pull image này từ Docker Hub

 

2. MAINTAINER <name>

 

Lệnh dùng để set tác giả của image, có thể có hoặc không

 

3. RUN <command>

 

Lệnh dùng để thực thi 1 command trên hệ thống(của image)

 

4. CMD <command>

 

Trong 1 dockerfile chỉ có thể có 1 lệnh CMD. Lệnh này để tạo command được thưc thi khi khởi chạy image

 

5. ADD <src> <dest>

 

Lệnh dùng để copy file từ remote hoặc local file được chỉ định ở <src> vào path trên container được chỉ đinh ở <dest>

 

6. EXPOSE <port> [<port>]

 

Lệnh dùng để chỉ định rằng containner của image sẽ listen trên các port nào đó trong khi chạy

 

Có thể tham khảo thêm các lệnh khác ở http://docs.docker.com/reference/builder/

 

II. Tạo Dockerfile

 

Như đã nói chúng ta sẽ tạo 1 image dựa trên ubuntu 12.04 và có install LAMP server

Vì vậy lệnh đầu tiên là xác định base image la ubuntu 12.04

 

FROM ubuntu:12.04

 

Tiếp theo thực hiện chạy update ubuntu repositories

 

RUN apt-get -y update

 

Và thưc hiện install apache2, php5, mysql, và các lib của php

RUN DEBIAN_FRONTEND=noninteractive apt-get -y install supervisor \
apache2 \
mysql-server \
php5 \
libapache2-mod-php5 \
php5-mysql \
php5-mcrypt

 

Trong đó DEBIAN_FRONTEND=noninteractive nhằm mục đích để cho hệ thống install mà không cần xác nhận từ user, nếu không thì docker build sẽ dừng ngay

 

Tiếp theo chúng ta cần install ssh-server để sau này dễ dàng thao tác với container thông qua ssh

 

RUN DEBIAN_FRONTEND=noninteractive apt-get -y install openssh-server

 

Sau khi install ssh server thì ta cần config password của root và config sshd để cho phép login

Các lệnh như sau:

RUN mkdir /var/run/sshd
RUN echo 'root:root' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

 

Tiếp theo expose 2 port là 22(ssh) và 80(web)

 

EXPOSE 22 80

 

Đến đây là chúng ta đã có được image với các phần mềm cần thiết được cài đặt. Nhưng nếu dừng ở đây là chưa đủ, vì khi chúng ta khởi chạy image thì web server, ssh hay mysql chưa được chạy như vậy chúng ta không thể nào access được vào container của image. Docker có cơ chế là cho phép chạy 1 chương trình nào đó khi ta khởi động container, ví dụ muốn thao tác dòng lệnh với container thì ta có thể khởi chạy /bin/bash. Nhưng với image ta vừa tạo thì ta muốn cả web server, sshd và mysqld phải được khởi chạy khi container được start. Chúng ta có thể làm được điều này nếu tạo 1 script init, nhưng sẽ dễ dàng hơn nếu dùng Supersisor. Supervisor dùng để control các daemon process trên các hệ thống UNIX http://supervisord.org/

 

Để dùng supervisor thì ta cần phải config để báo cho supervisor biết các process ta muốn chạy daemon là gì. File config như sau:

[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D
autorestart=true

[program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
autorestart=true

[program:mysqld]
command=/usr/bin/pidproxy /var/run/mysqld/mysqld.pid /usr/sbin/mysqld
autostart=true

 

Nội dung file config là ta cần phải thiết định các câu lệnh của các daemon tương ứng ta cần khởi chạy

 

Ta cần copy file này vào đúng nơi cần thiết trên image

 

ADD ./supervisord.conf /etc/supervisor/conf.d/supervisord.conf

 

Và cuối cùng ta cần chỉ định supervisor phải được khởi chạy khi container được start thông qua câu lệnh

 

CMD ["/usr/bin/supervisord"]

 

Nội dung đầy đủ của Dockerfile

FROM ubuntu:12.04
MAINTAINER phuoctu <tran_phuoctu@co-mit.com.vn>

RUN apt-get -y update
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install supervisor \
apache2 \
mysql-server \
php5 \
libapache2-mod-php5 \
php5-mysql \
php5-mcrypt

#ssh
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:root' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22 80
ADD ./supervisord.conf /etc/supervisor/conf.d/supervisord.conf
CMD ["/usr/bin/supervisord"]

 

III. Sử dụng

 

1. Build image:

 

Để build ra image từ Dockerfile đã tạo, từ folder chứa Dockerfile ta thực hiện câu lệnh sau:

 

sudo docker build -t comit/ubuntu-php5.3env .

 

Ở đây lấy ta lấy tag cho image được tạo là comit/ubuntu-php5.3env

Sau khi câu lệnh chạy xong ta kiểm tra image được tạo

 

 

Ta thấy có image comit/ubuntu-php5.3env trong list, như vậy là image được tạo thành công

 

2. Run image

 

Để chạy image thì ta thực hiện câu lệnh sau:

 

sudo docker run -d --name ubuntu-php5.3env -p 4000:80 -p 2222:22 -v /var/www:/var/www comit/ubuntu-php5.3env

 

Ta thực hiện map port 4000 trên host vào port 80, port 2222 trên host vào port 22 trên container, vì vậy ta có thể truy cập vào web server của container thông qua port 4000 của host, ssh vào container thông qua port 2222 của host

 

Ngoài ra ta còn thực hiện mount folder /var/www trên host vào /var/www của container

Sau khi thực hiện câu lệnh thì docker sẽ trả về id của container

Ta thử access vào web server của container xem đã ok chưa:

 

 

Như đã thấy, ta thực hiện access vào localhost:4000/info.php thì sẽ output ra version php 5.3

Nếu access web server của host thì kết quả là

 

 

Trên url là localhost/info.php và version php là 5.5

 

Thử thực hiện ssh vào container:

 

 

3. Stop container:

 

Để stop container khi không cần dùng nữa thì ta chạy câu lệnh sau:

sudo docker stop ubuntu-php5.3env
sudo docker rm ubuntu-php5.3env

 

Ở bước start thì ta khởi chạy container với name là ubuntu-php5.3env, và ta stop container với tên tương ứng

 

Như vậy là chúng ta đã build xong 1 docker image.

Source đầy đủ tại https://github.com/phuoctu/docker-ubuntu1204-lamp

 

Có thể thấy rằng việc build docker image không khó và sử dụng cũng rất tiện.

Bài viết cung cấp những kiến thức cở bản để từ đó chúng ta tạo ra các image phức tạp hơn, phục vụ tốt cho yêu cầu công việc.

 

Good luck :)


2 comments

#128
Nguyen Duc Trung
2016-01-18 12:05
Có cách nào tạo 1 file thế nầy cho Centos 6,7 ko bạn?
#123
2015-06-05 15:54
Good tutorial :)

Leave a Comment

Fields with * are required.