Docker basic
Tại sao lại chọn Docker Trước khi nghiên cứu về một công nghệ nào đó thì điều đầu tiên mình tìm hiểu là tính ứng dụng của nó. Do đó mình đã lên google và search về tính ứng dụng của docker sau đây mình sẽ tổng hợp lại những lợi ích về docker mà mình tìm được: Docker cho phép giả lập môi ...
Tại sao lại chọn Docker
Trước khi nghiên cứu về một công nghệ nào đó thì điều đầu tiên mình tìm hiểu là tính ứng dụng của nó. Do đó mình đã lên google và search về tính ứng dụng của docker sau đây mình sẽ tổng hợp lại những lợi ích về docker mà mình tìm được:
- Docker cho phép giả lập môi trường trên production ở dưới máy local
- Chia sẻ môi trường lập trình cho nhóm làm việc -> môi trường làm việc của các developer sẽ giống nhau
- Thành viên mới tham gia nhóm phát triển có thể dễ dàng cài đặt môi trường phát triển phần mềm
- Tính mềm dẻo: Docker gồm nhiều tools hỗ trợ, các tools này đều có thể chạy riêng rẽ, nên rất dễ sử dụng
- Dễ dàng kiểm thử với mọi công cụ khác nhau, môi trường khác nhau.
Docker là gì
Docker - là một công cụ tạo môi trường ảo và được "đóng gói" (còn gọi là Container) trên máy tính mà không làm tác động tới môi trường hiện tại của máy, môi trường trong Docker sẽ chạy độc lập. Hay có thể hiểu docker là một hệ điều hành khác chạy độc lập với hệ điều hành hiện tại của máy. Một số developer còn cài đặt các phần mềm hay giao thức để giả lập các môi trường phát triển và upload lên mạng để các developer khác lấy về sử dụng được gọi là images. Đọc đến đây liệu bạn có thắc mắc là nó có khác gì so với một máy ảo VM không? VM model: ta thấy cấu trúc của một VM model trong hình trên bản chất là sự nhân bản ra 3 hệ điều chạy độc lập các ứng dụng trên đó -> không hiệu quả, nặng nề. Container model: các container tuy chạy độc lập nhưng lại chạy chung trên một nền tảng của docker và chia sẻ thư viện, tài nguyên -> hiệu quả hơn, xử lý nhẹ nhàng hơn. Tóm lại:
- Docker là một framework tạo ra container virtualization (container ảo)
- Các container là các linux instance chứa các ứng dụng được cài đặt.
- Khó sử dụng do chỉ làm việc trên môi trường Linux
- Docker là open source và được cộng đồng hỗ trợ
Các lệnh cơ bản trong Docker
Container Tham khảo tại đây: https://docs.docker.com/engine/reference/commandline/docker/ Sau đây là một số câu lệnh được sử dụng phổ biến nhất:
Lệnh cơ bản | Ý nghĩa |
---|---|
docker run | khởi tạo hoặc chạy một container |
docker rm <ID hoặc NAME> | xóa một container(đầu vào sẽ là container ID) |
docker kill <ID hoặc NAME> | trong trường hợp container chạy không như mong muốn, thì có thể bắt buộc để dừng lại |
docker run --rm <ID hoặc NAME> | xóa container sau khi container dừng chạy |
docker ps | liệt kê các container đang chạy |
docker ps -a | liệt kê tất tất cả các container bao gồm cả đang chạy và đã dừng |
docker inspect <ID hoặc NAME> | hiển thị thông tin của container |
Ví dụ: Để tạo một conainer sử dụng câu lệnh docker run hello-world vơi hello-world là một image được tạo sẵn để thử nghiệm
Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://cloud.docker.com/ For more examples and ideas, visit: https://docs.docker.com/engine/userguide/
Chạy lệnh docker ps -a để xem các container hiện tại trên máy
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 703c91e4e0ce hello-world "/hello" 41 seconds ago Exited (0) 40 seconds ago laughing_archimedes cf55f56745ea lerenn/sftp-server "/bin/sh -c /docke..." 10 months ago Exited (255) 8 weeks ago 0.0.0.0:2222->22/tcp sftp
Để xóa container vừa tạo ra ta sử dụng docker rm 703c91e4e0ce
FRAMGIApham.hoang.duong@framgia0130-pc:~/workspace/colantotte$ docker rm 703c91e4e0ce 703c91e4e0ce
Images
Lệnh cơ bản | Ý nghĩa |
---|---|
docker images | hiển thị toàn bộ image |
docker build | tạo một image từ Dockerfile |
docker commit | tạo image từ container |
docker rmi <ID hoặc NAME> | xóa một image |
docker save | lưu một image vào một file nén |
docker import | import một image từ file nén |
docker history | hiển thị lịch sử của image |
docker tag | gán tên cho một image |
ĐỂ có thể khởi động và chạy một conatiner đã tắt ta sẽ chạy lệnh docker ps -a để lấy id hoặc tên của container sau đó chạy lệnh sau
docker start <ID hoặc NAME> docker exec -it <ID hoặc NAME> /bin/bash
Image Docker cho Rails
Phần tiếp theo mình sẽ thực hiện theo một work flow cơ bản để tạo môi trường rails container
- Để tìm các images mong muốn ta sẽ gõ lệnh sau docker search ten_image
duong@duong-Vostro-3460:~$ docker search rails NAME DESCRIPTION STARS OFFICIAL AUTOMATED rails Rails is an open-source web application fr... 721 [OK] redmine Redmine is a flexible project management w... 504 [OK] jonsharratt/rails Ubuntu 12.04 LTS, Rails 4.0, Ruby 2.0.0-p2... 7 bluebu/rails-alpine rails-alpine with different ruby version, ... 7 [OK] bitnami/rails Bitnami Ruby on Rails Docker Image 6 [OK] versioneye/rails_app VersionEye Web App 5 asux/rails Docker base image: Rails + Puma 4 [OK] instedd/nginx-rails nginx rails 3 [OK] ledermann/docker-rails Simple Rails application to demonstrate us... 2 [OK] newsdev/rails The base Ruby image with additions to supp... 2 [OK] opensnp/rails opensnp.org 1 [OK] asux/rails-phantomjs Rails + Puma + PhantomJS 1 [OK] opensnp/rails-sidekiq Sidekiq container for opensnp.org 1 [OK] convox/rails Convox base image for Ruby on Rails 1 [OK] dharmamike/pmx-rails This is a base Rails app meant only for ex... 1 [OK] mikeda/rails-test-with-elasticsearch rails-test-with-elasticsearch 1 [OK]
- Trong các images trên mình sẽ chọn image chính thức do chính đội phát triển rails cung cấp
docker pull rails #Sau khi image được pull về máy ta sẽ kiểm tra lại bằng câu lệnh sau duong@duong-Vostro-3460:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE lerenn/sftp-server latest 468dae2a33b3 10 months ago 154MB rails latest 660f41442a27 11 months ago 840MB
- Tạo container cho image rails vừa được pull về sudo docker run -p 3000:3000 --name vible_server_1 -it rails /bin/bash.Ý nghĩa của câu lệnh:
- docker run : lệnh tạo một container cho Docker
- --name vible_server_1: tên của conatainer
- -p 3000:3000: cho phép binding cổng 3000 từ container ra ngoài localhost
- tham số -it rails /bin/bash: Để chỉ định images cần tạo là rails và tự động chạy lệnh /bin/bash sau khi khởi tạo xong, nhờ đó chúng ta sẽ truy cập được vào chế độ dòng lệnh của container và quản lý nó giống như một máy tính thông thường.
- Sau khi chạy lệnh trên thì trên terminal sẽ hiển thị như sau:
root@073a491482b4:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@073a491482b4:/# cat /etc/*release PRETTY_NAME="Debian GNU/Linux 8 (jessie)" NAME="Debian GNU/Linux" VERSION_ID="8" VERSION="8 (jessie)" ID=debian HOME_URL="http://www.debian.org/" SUPPORT_URL="http://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/" root@073a491482b4:/# ruby -v ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux] root@073a491482b4:/# rails -v Rails 5.0.6
Ta có thể thấy rằng container vừa được tạo chứa hệ điều hành Debian8, ruby phiên bản 2.3.3 và rails 5. 5. Tạo một trang web trên docker Bây giờ ta sẽ thực hiện build một ứng dụng rails ngay trên conatiner bằng lệnh rails new app_name sau khi hệ thống cài đặt các gem cần thiết chạy rails s để khỏi động server. Kết quả như sau
root@073a491482b4:/home/testing# rails s => Booting Puma => Rails 5.0.6 application starting in development on http://localhost:3000 => Run `rails server -h` for more startup options Puma starting in single mode... * Version 3.11.0 (ruby 2.3.3-p222), codename: Love Song * Min threads: 5, max threads: 5 * Environment: development * Listening on tcp://0.0.0.0:3000 Use Ctrl-C to stop
Kết thúc
Bài viết của mình xin được tạm dừng tại đây, cảm ơn các bạn đã đọc bài, nếu có chỗ nào chưa đúng các bạn có thể comment phía để trao đổi. Phần tiếp theo mình sẽ viết về cách xây dựng cho một images để cấu hình container tương tự môi trường của server trên production.