Docker là gì?

Xin chào các bạn, hôm nay mình trở lại với một bài viết chia sẻ cá nhân về Docker theo cách mình hiểu.

Đầu tiên mình nghĩ rằng nếu bình thường có thể dùng các tập tin bash shell để cài đặt cấu hình cho một server, VPS hay máy ảo mà không cần quá nhiều thao tác với các lệnh Linux đau đầu. Nhưng rồi theo gợi ý của anh giám đốc kỹ thuật giới thiệu mình đến với Docker. Sau một tuần tham khảo ví dụ và bài viết trên mạng mình rút ra một số hiểu biết sau.

Đầu tiên chúng ta sẽ phải cài đặt Docker lên máy chủ:

# sudo yum install -y docker

Khởi động docker:

# sudo service docker start

Sau khi khỏi động xong chúng ta có thể kiểm tra docker hoạt động được chưa bằng cách tải về một ảnh (image) Centos 7

# sudo docker pull centos 

Kiểm tra xem Server Centos đã được tải về chưa bằng lệnh 

# docker ps images

Nếu thấy có ảnh của Centos rồi thì chúng ta sẽ khởi động Centos lần đầu tiên bằng lệnh sau:

# docker run -it centos bash

Trong đó lệnh docker run để khởi động ảnh centos với tham số là it và lệnh bash ở cuối là câu lệnh sẽ chạy sau khi khởi động server centos. Nếu bạn chạy thành công thì chúng ta sẽ vào trong server centos của docker. Để trở về chúng ta dùng lệnh sau:

$ exit

Tiếp theo chúng ta sẽ tạo một image cài đặt sẵn server nginx của riêng mình. Đầu tiên chúng ta dùng trình soạn thảo nano tạo 1 tệp có tên là "Dockerfile"

# nano Dockerfile

Sau đó chúng ta copy nội dung theo phần dưới đây:

FROM centos

MAINTAINER techmaster.vn

RUN rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release- centos-7-0.el7.ngx.noarch.rpm

# Install base stuff.
RUN yum -y install nginx unzip
RUN echo "daemon off;" >> /etc/nginx/nginx.conf 

CMD /usr/sbin/nginx
# Define mountable directories.
VOLUME ["/etc/nginx/sites-enabled","/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]

USER root

# Define working directory.

WORKDIR /etc/nginx

# Expose ports.
EXPOSE 80


RUN echo "Success"

Phân tích cấu trúc tệp Docker có bốn phần chính như sau:

- Thứ nhất là phần khai báo để docker tải về ảnh một hệ điều hành cơ sở cho image mình sẽ cài đặt. Ở đây mình dùng server centos bằng lệnh FROM centos. Lưu ý tên image bắt buộc phải viết chữ thường không được đặt tên bằng chữ hoa.

- Phần thứ hai là phần cài đặt bằng các lệnh mà ta phải chạy khi cài đặt.

Lệnh "RUN rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release- centos-7-0.el7.ngx.noarch.rpm "

Sẽ cài đặt thông tin cài đặt nginx phiên bản mới nhất được cập nhật.

Lệnh "RUN yum -y install nginx " dùng để cài đặt nginx.

Lệnh "CMD /usr/sbin/nginx" sẽ là lệnh mặc định khi bạn chạy docker nếu không nhập lệnh vào cuối lệnh docker run như ví dụ trước.

- Phần thứ ba sẽ là các lệnh cấu hình cho server nginx.

Lệnh "USER root" là chuyển tài khoản người dùng sang tài khoản root tương đương với lệnh su - root nhưng bạn không cần phải nhập mật khẩu.

Lệnh VOLUME ["/etc/nginx/sites-enabled","/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"] để khai báo các thư mục nginx sẽ sử dụng.

Lệnh "WORKDIR /etc/nginx" sẽ chuyển đến thư mục /etc/nginx khi chạy tương đương lệnh cd /etc/nginx.

Lệnh "EXPOSE 80" khai báo cho docker biết bạn sẽ dùng cổng nào.

Sau đó chúng ta sẽ dùng lệnh sau để build ra một ảnh (image) mới. 

# docker build –t nginx .

Lệnh này sẽ thông báo cho docker tìm trong thư mục hiện tại "." xem có tệp Dockerfile không. Nếu có hãy tạo một ảnh mới theo các lệnh trong tệp đó. 

Chạy lệnh sau 

# docker run --name <tên phiên> -p 80:80 -d –it nginx

Để khởi động server nginx. Trong đó --name là không bắt buộc, tham số -p 80:80 là khai báo cổng docker và cổng máy chủ sẽ mở ở đây là cổng 80.

Vậy còn phần thứ tư là ở đâu? Ở đây bạn nhé. 

Nếu thêm tham số -v /path/on/host:/path/in/container thì docker sẽ dùng thư mục /path/on/host tương ứng với /path/in/container.

Sau khi build xong và chạy thành công chúng ta có thể đăng ký một tài khoản trên docker tại đây. https://docs.docker.com/docker-hub/ rồi tải lên đó ảnh chứa server centos và cài đặt sẵn nginx. 

# docker push yourname/newimage

Ở đây khi bạn build một image bạn nên build theo tên_tài_khoản/tên_image theo đúng đường dẫn trên docker-hub. Sau này bạn có thể tải về ảnh của bạn bằng lệnh:

# docker pull yourname/newimage

Khi chúng ta tạo quá nhiều image thì chúng ta cần dọn dẹp đĩa bằng hai lệnh sau:

# docker rm -f $(docker ps -a -q)    

//  Delete all images

# docker rmi –f $(docker images -q) 

Mình có đăng nội dung tệp Dockerbuild có chứa cài đặt nginx, postgresql và nodeJS tại đây. 

https://github.com/hidephong/demodocker

Trên đây là chút chia sẻ về những gì mình cảm nhận được từ thực hành của mình.