logo

Thông báo

Icon
Error

Chia sẻ
Tùy chọn
Xem
Xem bài viết cuối
Offline admin  
#1 Đã gửi : 28/10/2019 lúc 09:43:24(UTC)
admin

Danh hiệu: Administration

Chức danh:

Nhóm: Administrators
Gia nhập: 23-07-2013(UTC)
Bài viết: 6,113
Man
Viet Nam
Đến từ: Vietnam

Cảm ơn: 10 lần
Được cảm ơn: 2 lần trong 2 bài viết

Các khái niệm trong Docker

1. Docker là gì?

Theo nguồn wikipedia: "Docker là một dự án mã nguồn mở giúp tự động triển khai các ứng dụng Linux và Windows vào trong các container ảo hóa."

Theo các trang mạng: "Docker là một open platform cung cấp cho người sử dụng những công cụ và service để người sử dụng có thể đóng gói và chạy chương trình của mình trên các môi trường khác nhau một cách nhanh nhất."

Lại có định nghĩa rằng: "Docker là một phương thức để đóng gói và sắp xếp phần mềm."

Docker bao gồm các thành phần chính:

  • Docker Engine: dùng để tạo ra Docker image và chạy Docker container.
  • Docker Hub: dịch vụ lưu trữ giúp chứa các Docker image.

Một số khái niệm khác:

  • Docker Machine: tạo ra các Docker engine trên máy chủ.
  • Docker Compose: chạy ứng dụng bằng cách định nghĩa cấu hình các Docker container thông qua tệp cấu hình
  • Docker Images:  They are OS boxes that contain some pre-installed and configured software. Đó là một dạng tập hợp các tệp của ứng dụng, được tạo ra bởi Docker engine. Nội dung của các Docker image sẽ không bị thay đổi khi di chuyển. Docker image được dùng để chạy các Docker container.

docker-images

  • Docker Containers: They are separate instances that we create from images. Đó là một dạng runtime của các Docker image, dùng để làm môi trường chạy ứng dụng.

docker-container-command

docker-container

Docker mang lại những giá trị gì

  • Với Docker, chúng ta có thể đóng gói mọi ứng dụng vd như webapp, backend, MySQL, BigData…thành các containers và có thể chạy ở “hầu hết” các môi trường vd như Linux, Mac, Window…
  • Docker Containers có một API cho phép quản trị các container từ bên ngoài. Giúp cho chúng ta có thể dễ dàng quản lí, thay đổi, chỉnh sửa các container.
  • Hầu hết các ứng dụng Linux có thể chạy với Docker Containers.
  • Docker Containers có tốc độ chạy nhanh hơn hẳn các VMs truyền thống (theo kiểu Hypervisor). Điều này là một ưu điểm nổi bật nhất của Docker

Tóm lại:

Docker là một công cụ tạo môi trường đượ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. Nó giống như virtual machine, chỉ là tiện dụng hơn, dễ dàng sử dụng hơn và độc lập với hệ điều hành máy chủ chúng ta đang sử dụng. Một số developer thường tạo sẵn các môi trường này, và upload lên mạng để mọi người lấy về dùng, và mấy cái này gọi là các Images

Virtualization-Architecture

Khi sử dụng môi trường Vitualization thì chúng ta cần cài các hệ điều hành cùng các tool cần thiết để chạy một ứng dụng có sẵn, nhưng với docker việc đó trở nên đơn giản với việc mình tìm và sử dụng lại các images (tại đây các cài đặt cần thiết để cho việc khởi chạy là có sẵn). Sau đó đóng gói vào trong các Container và chạy thôi. Cài đặt và khởi chạy.

Chúng ta sẽ thiết lập cho app của mình các môi trường cần thiết với docker. Khi ai đó muốn chạy app đó thì chỉ cần chạy docker mà không cần phải cài môi trường cho app nữa vì docker đã giúp ta rồi. Bạn không cần phải biết về laravel, ruby on rails hay thậm chí là java cũng như các môi trường của nó mà vẫn chạy được app, thật là đơn giản đúng không nào!

    2. Sự khác biệt giữa Docker và Hypervisors

    Docker-Hypervisors

    Hypervisors là gì?

    - Hypervisor là ảo hỏa nằm ở tầng Hardware (phần cứng), tức là mô phỏng phần cứng và chạy những OS con trên phần cứng đó (Các công cụ Hypervisor như Virtual Box, VMware..)

    Sự khác biệt giữa Docker và Hypervisors

    - Docker: Dùng chung kernel, chạy độc lập trên Host Operating System và có thể chạy trên bất kì hệ điều hành nào cũng như cloud. Khởi động và làm cho ứng dụng sẵn sàng chạy trong 500ms, mang lại tính khả thi cao cho những dự án cần sự mở rộng nhanh.

    Virtual Machine(Hypervisors): Cần thêm một Guest OS cho nên sẽ tốn tài nguyên hơn và làm chậm máy thật khi sử dụng. Thời gian khởi động trung bình là 20s có thể lên đến hàng phút, thay đổi phụ thuộc vào tốc độ của ổ đĩa

    3. Sự khác biệt giữa Docker Image và Docker Container

    Docker Images

    Là một template chỉ cho phép đọc, ví dụ một image có thể chứa hệ điều hành Ubuntu và web app. Images được dùng để tạo Docker container. Docker cho phép chúng ta build và cập nhật các image có sẵn một cách cơ bản nhất, hoặc bạn có thể download Docker images của người khác.

    Docker Container

    Docker container có nét giống với các directory. Một Docker container giữ mọi thứ chúng ta cần để chạy một app. Mỗi container được tạo từ Docker image. Docker container có thể có các trạng thái run, started, stopped, moved và deleted.

    4. Làm thế nào để tạo ra một Docker Image bằng Dockerfile

    Dockerfile là gì?

    - Dockerfile là một tập tin dạng text chứa một tập các câu lệnh để tạo mới một Image trong Docker.

    Một số lệnh trong Dockerfile:

    • FROM <base_image>:<phiên_bản>: đây là câu lệnh bắt buộc phải có trong bất kỳ Dockerfile nào. Nó dùng để khai báo base Image mà chúng ta sẽ build mới Image của chúng ta.
    • MAINTAINER <tên_tác_giả>: câu lệnh này dùng để khai báo trên tác giả tạo ra Image, chúng ta có thể khai báo nó hoặc không.
    • RUN <câu_lệnh>: chúng ta sử dụng lệnh này để chạy một command cho việc cài đặt các công cụ cần thiết cho Image của chúng ta.
    • CMD <câu_lệnh>: trong một Dockerfile thì chúng ta chỉ có duy nhất một câu lệnh CMD, câu lệnh này dùng để xác định quyền thực thi của các câu lệnh khi chúng ta tạo mới Image.
    • ADD <src> <dest>: câu lệnh này dùng để copy một tập tin local hoặc remote nào đó (khai báo bằng <src>) vào một vị trí nào đó trên Container (khai báo bằng dest).
    • ENV <tên_biến>: định nghĩa biến môi trường trong Container.
    • ENTRYPOINT <câu_lệnh>: định nghĩa những command mặc định, cái mà sẽ được chạy khi container running.
    • VOLUME <tên_thư_mục>: dùng để truy cập hoặc liên kết một thư mục nào đó trong Container.

    Ví dụ về Dockerfile

    $ sudo apt-get update

    $ sudo apt-get install docker.io

    • Kiểm tra để chắc chắn đã cài thành công docker

    Mã:
    $ docker -v

    Kết quả hiển thị : Docker version 17.12.0-ce, build c97c6d6

    • Tạo một folder bằng lệnh như bên dưới

    Mã:
    $ mkdir docker-image
    $ cd docker-image
    $ touch Dockerfile
    $ touch script.sh

    • Trong file Dockerfile
    FROM alpine

    MAINTAINER QUY

    COPY script.sh /script.sh

    CMD ["/script.sh"]

    ```shell

    - Trong file script.sh

    Mã:
    #! bin/sh

    echo hello world, from a script file!

    Sau khi đã tạo cái file xong, chạy lệnh sau:

    Mã:
    $ docker build .

    Sending build context to Docker daemon 3.072kB

    Step 1/4 : FROM alpine ---> 3fd9065eaf02

    Step 2/4 : MAINTAINER QUY ---> Using cache ---> 4759e0f7f56d

    Step 3/4 : COPY script.sh /script.sh ---> 420fa86d8721

    Step 4/4 : CMD ["/script.sh"] ---> Running in f03416259b47 Removing intermediate container f03416259b47 ---> 73dfa9b63cd8 Successfully built 73dfa9b63cd8

    Sau khi build thành công, thực hiện run image:

    Mã:
    $ docker run --name test 73dfa9b63cd8.

    hello world, from a script file!

    - Ngoài ra, bạn có thể kiểm tra các images đã build

    Mã:
    $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a3bdcee1a850 73dfa9b63cd8 "/script.sh" 

    7 minutes ago Exited (0) 7 minutes ago quy 4c4d6861c295 6eb882774c34 "/script.sh"

    8 minutes ago Up 8 minutes test 9fefbc7c63b3 ubuntu "/bin/bash"

    9 days ago Exited (0) 9 days ago stupefied_ramanujan

    Vậy là chúng ta đã xây dựng xong 1 Dockerfile build và run một Docker Image đơn giản, tuy nhiên cần tìm hiểu kỹ hơn để áp dụng cho các dự án. ###

    5. Docker Hub là gì? Làm thế nào để tạo một Docker Image trên Docker Hub?

    Docker Hub là gì?

    Docker Hub là dịch vụ đăng ký dựa trên đám mây cho phép bạn liên kết đến các kho lưu trữ mã, tạo hình ảnh(images) và kiểm tra chúng, lưu trữ hình ảnh(images) và liên kết đến Docker Cloud để bạn có thể triển khai các hình ảnh(images) tới máy chủ của mình.

    Làm thế nào để tạo một Docker Image trên Docker Hub?

    • Để sử dụng Docker Hub trước tiên cần phải đăng ký 1 tài khoản: https://hub.docker.com/
    • Sau đó tiến hành đăng nhập:

    • Sau khi đăng nhập và vào trang chủ https://hub.docker.com/ thành công. Click vào Create Repository để tạo mới một repository mới. 

    • Điền các thông tin cần thiết cho repository của bạn:

    • Repository tạo xong sẽ được hiển thị như bên dưới:

    • Sau khi tạo xong một repository, click vào details của repository. Hãy chú ý mục Docker Pull Command , đó cũng là command để push, cũng như pull images cho repository này.

    • Pull repository của mình vừa tạo về, sử dụng lệnh:

    Mã:
    $ docker pull vanquynguyen/docker-test

    Using default tag: latest

    latest: Pulling from vanquynguyen/docker-test

    93d292426ea6: Pull complete

    Digest: sha256:8b0106fe7cc7b92ffd78bd61af913a99316f749091a155b72f7a4166da9ce0dc

    Status: Downloaded newer image for vanquynguyen/docker-test:latest

    • Kiểm tra xem docker của bạn đã có images pull về từ docker hub chưa:

    Mã:
    $ docker images

    REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE

    vanquynguyen/docker-test latest 827277d46f0a 23 hours ago 93.6MB

    • Tạo thử một Dockerfile và build 1 images

    Mã:
    $ docker ps -a

    CONTAINER ID        IMAGE                             COMMAND                  CREATED             STATUS                      PORTS               NAMES

    2b04f88c9f46 73dfa9b63cd8 "/script.sh" 2 minutes ago Exited (0) 2 minutes ago vanquynguyen

    f44562880276 4c26b3b58ce1 "script.sh" 3 minutes ago Created vanquy

    • Commit lại container của image cần push lên
    $ docker commit 2b04f88c9f46

    • Sau khi commit xong container, tiến hành push lại lên repository của mình.
    $ docker push vanquynguyen/docker-test

    Done!

    6. Các câu lệnh thường dùng để thao tác với docker image?

    Cú pháp:

    $ docker images [OPTIONS] [REPOSITORY[:TAG]]

    Options:

    • --all , -a: Hiển thị tất cả các images (mặc định ẩn các intermediate images)
    • --digests: Hiển thị các digests
    • --filter , -f: Lọc dựa trên các điều kiện được cung cấp (dangling=(true|false), (label=<key> or label=<key>=<value>), ( before=(<image-name>[:tag]|<image-id>|image@digest)), (since=(<image-name>[:tag]|<image-id>|image@digest)), (reference=(pattern of an image reference)))
    • --format:
    • --no-trunc:
    • --quiet , -q: Chỉ hiển thị số ID của các images

    Ví dụ:

    • Hiển thị tất cả các images

    Mã:
    $ docker images -a

    REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE

    vanquynguyen/docker-test latest 827277d46f0a 4 hours ago 93.6MB

    dockercompose01_product-service latest de81bdc72e0f 30 hours ago 702MB

    dockercompose02_web latest edcbeb18ae03 30 hours ago 93.2MB

    python 3.4-alpine 5c72717ec319 2 weeks ago 82.8MB

    redis alpine d3117424aaee 2 weeks ago 27.1MB

    ubuntu latest 0458a4468cbc 3 weeks ago 112MB

    alpine latest 3fd9065eaf02 6 weeks ago 4.15MB

          Note: Repository là tên của image mà mình pull về. Tag: Là version tương ứng

    • Hiển thị tất cả các digests:

    Mã:
    $ docker images --digests

    REPOSITORY                        TAG                 DIGEST                                                                    IMAGE ID     CREATED             SIZE

    vanquynguyen/docker-test latest sha256:8b0106fe7cc7b92ffd78bd61af913a99316f749091a155b72f7a4166da9ce0dc 827277d46f0a 4 hours ago 93.6MB

    dockercompose01_product-service latest <none> de81bdc72e0f 30 hours ago 702MB

    dockercompose02_web latest <none> edcbeb18ae03 30 hours ago 93.2MB

    python 3.4-alpine sha256:fe436cb066394d81cf49448a04dec7c765082445a500bc44f1ae5e8a455793bd 5c72717ec319 2 weeks ago 82.8MB

    redis alpine sha256:95a7b91d1e96fa2e4579f439137e5642d3c58d5f8d063d6cea09426d56a22ec0 d3117424aaee 2 weeks ago 27.1MB

    ubuntu latest sha256:e27e9d7f7f28d67aa9e2d7540bdc2b33254b452ee8e60f388875e5b7d9b2b696 0458a4468cbc 3 weeks ago 112MB

    alpine latest sha256:7df6db5aa61ae9480f52f0b3a06a140ab98d427f86d8d5de0bedab9b8df6b1c0 3fd9065eaf02 6 weeks ago 4.15MB

    • Lọc dựa trên các điều kiện được cung cấp: ví dụ lọc các image đang được running

    Mã:
    $ docker images --filter "dangling=false"

    REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE

    dockercompose01_product-service latest a6d6dba4ebbc 6 minutes ago 702MB

    vanquynguyen/docker-test latest 827277d46f0a 24 hours ago 93.6MB

    python 3-onbuild f17a8f3a7ef9 5 days ago 692MB

    php apache 08685253e459 6 days ago 377MB

    • Chỉ hiển thị số ID của các images:

    Mã:
    $ docker images -q

    827277d46f0a

    de81bdc72e0f

    edcbeb18ae03

    5c72717ec319

    d3117424aaee

    0458a4468cbc

    3fd9065eaf02

    7. Các câu lệnh thường dùng để thao tác với docker container?

    Cú pháp:

    Mã:
    $ docker container COMMAND

    Command:

    • rename: Đổi tên một container
    • restart: Khởi động lại một hoặc nhiều containers
    • rm: Loại bỏ một hoặc nhiều containers
    • run: Chạy một lênh trong một container mới
    • start: Khởi động một hoặc nhiều containers đã bị dừng lại trước đó
    • stop: Dừng lại một hoặc nhiều container đang chạy
    • top: Display the running processes of a container
    • update: Update configuration of one or more containers
    • wait: Block until one or more containers stop, then print their exit codes

    Tham khảo thêm tại đây: https://docs.docker.com/engine/reference/commandline/container

    8. Sự khác biệt giữa câu lệnh docker exec và docker run?

    • docker exec: Vận hành container docker hiện có hay đã tồn tại
    • docker run: Thao tác đến các images đã tồn tại hoặc có thể truy xuất từ localhost, mỗi lần chạy command sẽ tạo ra một container mới tương ứng

    Tóm lại:" nói một cách đơn giản, "docker run" có mục tiêu là các hình ảnh giáp của container và "docker exec" đang nhắm mục tiêu đến các container kết nối trước. Sử dụng các nguồn bên trong image hoặc container có ý nghĩa khác nhau. Khi sử dụng "docker run", một container tạm thời được tạo và dừng lại (không chấm dứt) sau khi lệnh đã kết thúc".

    9. Sự khác biệt giữa câu lệnh docker run và docker start?

    • docker run: Thao tác đến các images đã tồn tại hoặc có thể truy xuất từ localhost, mỗi lần chạy command sẽ tạo ra một container mới tương ứng
    • docker start: Bắt đầu lại container và khởi động cho container chạy cho đến lần xử lý dừng tiếp theo

    10. Thế nào là Docker Volume? Tại sao ta lại cần Docker Volume? Ta dùng Docker Volume khi nào?

    Thế nào là Docker Volume?

    Volume trong Docker được dùng để chia sẻ dữ liệu giữa máy chủ và các container. Nó được tạo ra trong suốt quá trình container được chạy và luôn được đồng bộ.

    Ví dụ mình muốn mount /var/www/html trong container tới đường dẫn local trên máy chủ của mình ~/docker-project/lara-new

    Mã:
      docker run -v <local dir>:<container dir>

    Tại sao ta lại cần Docker Volume?

    • Volumes giản hóa việc backup hoặc migrate hơn bind mount.
    • Bạn có thể quản lý volumes sử dụng các lệnh Docker CLI và Docker API.
    • Volumes làm việc được trên cả Linux và Windows container.
    • Volumes có thể an toàn hơn khi chia sẻ dữ liệu giữa nhiều container.
    • Volume drivers cho phép bạn lưu trữ volumes trên remote hosts or cloud providers, để mã hóa nội dung của volumes, hoặc thêm các chức năng khác.
    • Các nội dung của volume mới có thể được điền trước bởi một container.

    Ta dùng Docker Volume khi nào?

    • Sử dụng volume để gắn (mount) một thư mục nào đó trong host với container.
    • Sử dụng volume để chia sẻ dữ liệu giữa host và container
    • Sử dụng volume để chia sẽ dữ liệu giữa các container
    • Backup và Restore volume.

    Để xem cách tạo và quản lý Docker Volume: https://docs.docker.com/storage/volumes/#populate-a-volume-using-a-container

    Expose port

    • Ví dụ mình dùng mysql container, bên ngoài mình cài mysql-workbench để làm việc, mặc định bên trong container sẽ setup cổng đối với mysql là 3306 đúng không, nhưng nếu mà bên ngoài máy local của mình đã sử dụng port 3306 cho mục đích nào đó => Conflict. Và mình sẽ không thể dùng workbench tạo connection tới port 3306 được.
    • Làm việc với docker mình có thể export cổng bên trong container ra cổng bên ngoài tương ứng. Ví dụ trong conatainer port 3306 của mysql thì mình sẽ export nó ra bên ngoài là 3307 chẳng hạn => Vấn đề được giải quyết

    11. Docker Compose là gì?

    Compose là công cụ giúp định nghĩa và khởi chạy multi-container Docker applications.

    Trong Compose, chúng ta sử dụng Compose file để cấu hình application's services. Chỉ với một câu lệnh, lập trình viên có thể dễ dàng create và start toàn bộ các services phục vụ cho việc chạy ứng dụng.

    12. Các câu lệnh thường dùng với docker-compose

    Cú pháp:

    $ docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

    $ docker-compose -h|--help

    Một số câu lệnh thường dùng:

    • Kiểm tra phiên bản docker-compose:

    Mã:
    $ docker-compose version

    docker-compose version 1.8.0, build unknown

    docker-py version: 1.9.0

    CPython version: 2.7.12

    OpenSSL version: OpenSSL 1.0.2g 1 Mar 2016

    • Hiển thị danh sách containers:

    Mã:
    $ docker-compose ps

                  Name                             Command               State    Ports


    dockercompose01_product-service_1 python api.py Exit 1

    dockercompose01_website_1 docker-php-entrypoint apac ... Exit 0

    docker-compose version 1.8.0, build unknown

    docker-py version: 1.9.0

    CPython version: 2.7.12

    OpenSSL version: OpenSSL 1.0.2g 1 Mar 2016

    • Tạo và khởi động containers:
    $ docker-compose up

    • Build hoặc rebuild services

    Mã:
    $ docker-compose build

    Step 1/3 : FROM python:3-onbuild

    # Executing 3 build triggers

    ---> Using cache

    ---> Using cache

    ---> Using cache

    ---> 4de6e4065f4b

    Step 2/3 : COPY . /usr/src/app

    ---> Using cache

    ---> edf44389cbf5

    Step 3/3 : CMD ["python", "api.py"]

    ---> Using cache

    ---> a6d6dba4ebbc

    Successfully built a6d6dba4ebbc

    Successfully tagged dockercompose01_product-service:latest

    website uses an image, skipping

    • Xác nhận hoặc hiển thị file config Compose

    Mã:
    $ docker-compose config

    • Loại bỏ, ngừng containers:

    Mã:
    $ docker-compose rm

    Going to remove dockercompose01_website_1, dockercompose01_product-service_1

    Are you sure? [yN] y

    Removing dockercompose01_website_1 ... done

    Removing dockercompose01_product-service_1 ... done

    Tham khảo chi tiết tại đây: https://docs.docker.com/compose/reference/overview

    13. Docker Network là gì? Có những kiểu Docker Network mặc định nào?

    Docker Network là gì?

    Docker network dùng để gắn địa chỉ ip cho các container thông qua một virtual bridge.

    Có những kiểu Docker Network mặc định nào?

    Sau khi cài đặt xong docker, có 3 loại network tự động sẽ được tạo ra, sử dụng câu lệnh để kiểm tra:

    $ docker network ls

    NETWORK ID NAME DRIVER SCOPE

    04df50d130ed bridge bridge local

    e5275b314ff1 host host local

    006951b13154 none null local

    • Bridge: Network driver mặc đinh. Nếu bạn không chỉ định một driver, đây sẽ là một loại của network mà bạn đang tạo. Bridge Networks thường được sử dụng khi ứng dụng của bạn chạy trong các container độc lập mà chúng cần để giao tiếp, truy cập: https://docs.docker.com/network/bridge để xem chi tiết hơn về Bridge Networks.
    • Host: Với các containers độc lập, xóa network cô lập giữa container và docker host , và sử dụng host's network trực tiếp. Host chỉ có trên swarm services phiên bản Docker 17.06 và cao hơn. Xem cách sử dụng của host network: https://docs.docker.com/network/host.
    • None: Với chính container, ngắt kết nối tất cả các netwoking. Thường sử dụng trong kết hợp với một tùy chỉnh network driver. None cũng chỉ có trên swarm services. Chi tiết về none có tại: https://docs.docker.com/network/none/.

    14. Docker Swam là gì?

    Docker Swam là gì?

    Docker swarm là một công cụ giúp chúng ta tạo ra một clustering Docker. Nó giúp chúng ta gom nhiều Docker Engine lại với nhau và ta có thể "nhìn" nó như duy nhất một virtual Docker Engine.

    Khi số lượng containers tăng lên việc quản lý, triển khai trở nên phức tạp hơn thì không thể không sử dụng Docker Swarm.

    Một vài câu lệnh cơ bản của Docker Swarm

    • docker swarm ca: Hiển thị và xoay root CA

    • docker swarm init: Khởi tạo một swarm

    • docker swarm join: Gia nhập một swarm

    • docker swarm join-token: Quản lý join tokens

    • docker swarm leave: Rời khỏi swarm

    • docker swarm unlock: Unlock swarm

    • docker swarm unlock-key: Quản lý unlock key

    • docker swarm update: Cập nhật swarm

    Nguồn : https://viblo.asia/p/docker-nhung-kien-thuc-co-ban-phan-1-bJzKmM1kK9N

    Ai đang xem chủ đề này?
    OceanSpiders 2.0
    Chủ đề tương tự
    Các khái niệm cần nắm trong quản lý dự án (PMP)
    Bởi admin 10-08-2019 lúc 02:59:21(UTC)
    Gaming - Các khái niệm khởi đầu khi làm game (Gaming)
    Bởi admin 17-03-2015 lúc 09:51:37(UTC)
    Di chuyển  
    Bạn không thể tạo chủ đề mới trong diễn đàn này.
    Bạn không thể trả lời chủ đề trong diễn đàn này.
    Bạn không thể xóa bài của bạn trong diễn đàn này.
    Bạn không thể sửa bài của bạn trong diễn đàn này.
    Bạn không thể tạo bình chọn trong diễn đàn này.
    Bạn không thể bỏ phiếu bình chọn trong diễn đàn này.

    | Cung cấp bởi YAF.NET 2.2.4.14 | YAF.NET © 2003-2020, Yet Another Forum.NET
    Thời gian xử lý trang này hết 0.788 giây.