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
Leave a Comment