├── Books ├── Docker+Deep+Dive-Leanpub(2018).pdf ├── Docker.Docker.Tutorial.for.Beginners.Build.Ship.and.Run.pdf ├── Nigel_Poulton_Docker_Deep_Dive_Zero_to_Docker_in_a_single_book,.pdf └── Packt.Docker.Cookbook.1783984864.pdf └── docs ├── 01.Introduction.md ├── 02.Docker.md ├── 03.installation.md ├── 04.example-tongquan.md ├── 05.Docker-Engine.md ├── 06.Image.md ├── 07.Container.md ├── 08.Containerizing-an-app.md ├── 09.Docker-compose.md ├── 10.Docker-Swarm.md ├── 11.Docker-Networking.md ├── 12.Docker-Internal.md ├── 13.Docker-Volume.md ├── 14.Logging.md ├── 15.Cgroup-and-resource-limit.md ├── 16.Unionfs.md ├── 17.OverlayFS.md ├── 18.Docker-registry.md ├── 19.portainer.md ├── Note-Docker.md ├── Readme.md └── _config.yml /Books/Docker+Deep+Dive-Leanpub(2018).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamth/tailieu-Docker/3d0af9e14209e4d6540da16c5408a7ac8eb476ca/Books/Docker+Deep+Dive-Leanpub(2018).pdf -------------------------------------------------------------------------------- /Books/Docker.Docker.Tutorial.for.Beginners.Build.Ship.and.Run.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamth/tailieu-Docker/3d0af9e14209e4d6540da16c5408a7ac8eb476ca/Books/Docker.Docker.Tutorial.for.Beginners.Build.Ship.and.Run.pdf -------------------------------------------------------------------------------- /Books/Nigel_Poulton_Docker_Deep_Dive_Zero_to_Docker_in_a_single_book,.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamth/tailieu-Docker/3d0af9e14209e4d6540da16c5408a7ac8eb476ca/Books/Nigel_Poulton_Docker_Deep_Dive_Zero_to_Docker_in_a_single_book,.pdf -------------------------------------------------------------------------------- /Books/Packt.Docker.Cookbook.1783984864.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lamth/tailieu-Docker/3d0af9e14209e4d6540da16c5408a7ac8eb476ca/Books/Packt.Docker.Cookbook.1783984864.pdf -------------------------------------------------------------------------------- /docs/01.Introduction.md: -------------------------------------------------------------------------------- 1 | # Giới thiệu 2 | 3 | ## Quá khứ tồi tệ. 4 | Ứng dụng rất quan trọng đối với các doanh nghiệp. 5 | Hầu như tất cả ứng dụng đều chạy trên các server. Các hệ điều hành chỉ dùng để chạy một ứng dụng. 6 | Khi cần triển khai bất kì ứng dụng nào đêu cần mua một server mới mà không biết chính xác phần cứng yêu cầu cho ứng dụng. 7 | Vì vậy dẫn đến sự lãng phí lớn về tài nguyên phần cứng, điện năng,...cho các công ty. 8 | ## Hello VMware! 9 | VMware giới thiệu công nghệ ảo hóa virtual machine(VM)- công nghệ giúp chạy đa ứng dụng một cách an toàn 10 | và bảo mật trên một server vật lý 11 | IT không cần mua một server mới khi công ty yêu cầu một ứng dụng mới nữa. Họ hoàn toàn có thể triển khai chúng trên server sẵn có với một máy ảo mới 12 | Điều này giúp giảm sự lãng phí về tài nguyên, ch 13 | ## VMwarts 14 | Tuy nhiên, VM vẫn không hoàn hảo: 15 | - Cần một hệ điều hành riêng cho mỗi VM, dẫn đến sự tốn kém về tài nguyên, license, bảo hành, theo dõi cho mỗi VM đó. 16 | - Vm boot chậm và không có tính di động - sao lưu hay di chuyển VM giữa các đều rất khó khăn. 17 | ## Hello Containers! 18 | Trong một khoảng thời gian dài, các công ty lớn sử dụng công nghệ container để khắc phục những thiếu sót của VM. 19 | Container không cần hệ điều hành riêng như VM mà các container chia sẻ hệ điều hành với HostOS. Dẫn đến giảm tiêu tốn tài nguyên cũng như chi phí cho công ty. 20 | Container có tính di động cao - việc di chuyển container giữa laptop, cloud, hay VM là một việc đơn giản 21 | ## Linux containers 22 | Container hiện đại thì bắt đầu trên LInux. Được phát triển và đóng góp rất nhiều từ rất nhiều người, công ty lớn để có được công nghệ container ngày nay. 23 | Một số công nghệ giúp containter pát triển mạnh bao gồm: Kernel namespaces, cgroup, union filesystem, và đương nhiên Docker. 24 | Tuy vậy, container vẫ khá phức tạp và khó tiếp cận với hầu hết các công ty cho đến khi Docker xuất hiện. 25 | ## Hello Docker! 26 | Có thể nói Docker như một phép màu mà khiến cho Linux container có thể được sử dụng bởi những người dùng thông thường. 27 | Nói cách khác, Docker, Inc. khiến container trở nên dễ dàng hơn. 28 | ## Windows containers 29 | Trong một vài năm trở lại đây, Microsoft đã làm việc cực kì khó khăn để đưa docker lên nển tảng Windown. 30 | Ở thời điểm này, Window container đã có trên Window 10 và Windown Server 2016. 31 | Công nghệ Window container gần như giống hoàn toàn với Linux container. Những người sử dụng quen với Docker trên nền tảng Linux thì sẽ có thể làm quen dễ dàng trên nền tảng Window. 32 | ## Windows containers vs Linux containers 33 | Vì container dùng chung kernel với host OS nên là các container chạy với kernel Window không thể chạy trên Linux host. Do đó, Window container cẩn chạy trên Window host, Linux container cần chạy trên Linux host. Nhưng không đơn giản như vậy... 34 | Hiện tại, hoàn toàn có thể chạy Linux container trên Window host, ví dụ, Với *Docker for Window*, ta có thể chuyển chế độ giữa Linux container và Window container. 35 | *Linux container có thể chạy trên Window host là nhờ công nghệ Hyper-V, nó yêu cầu tối thiểu một kernel Linux và phân vùng chứa tiến trình của các container* 36 | ## What about Mac containers? 37 | Ở thời điểm viết bài này chưa có cái gì là Mac container. 38 | Tuy nhiên, bạn vẫn có thể chạy Linux container trên Mac sử dụng phần mềm *Docker for Mac*. 39 | Nó cũng giống với cách mà Linux container có thể chạy trên Window host, nó chạy các container của bạn trong một máy ảo Linux nhẹ trên Mac của bạn. 40 | ## What about Kubernetes? 41 | 42 | *Kubernetes is an important piece of software that helps us deploy our containerized apps and keep them running* 43 | Kubernetes là một mã nguồn mở được dùng để tự động triển khai hệ thống, scaling, quản lý các container. Nó thực sự là một hệ thống mạnh mẽ, được phát triển bởi Google. Google sử dụng Kubernetes để quản lý hàng tỉ docker container mà họ đang quản lý. 44 | Kubernetes sử dụng Docker là container runtime mặc định. 45 | ## Tóm tắt 46 | 47 | ![](http://i.imgur.com/tMsnEkQ.png) 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | > Written with [StackEdit](https://stackedit.io/). 56 | -------------------------------------------------------------------------------- /docs/02.Docker.md: -------------------------------------------------------------------------------- 1 | # Docker 2 | ## Docker - The TLDR. 3 | Docker là phần mềm chạy trên Window và Linux. Nó tạo, quản lý và điều phối các container. 4 | Docker là một phần của dự án mã nguồn mở Moby trên Github. Docker, Inc. là một công ty duy trì tổng thể cho dự án mã nguồn mở này. 5 | ## Docker, Inc. 6 | Docker, Inc. là công ty khởi nghiệp có trụ sở ở San Francisco được thành lập bởi nhà phát triển và doanh nhân người Mỹ gốc Pháp **Solomon Hykes**. 7 | ![](http://i.imgur.com/vb4DMi7.png) 8 | Docker, Inc. ban đầu là nhà cung cấp dịch vụ cloud platform as a service (PaaS), được gọi là dotCloud. Nền tảng dotCloud tận dụng Linux container. Docker được tạo ra như một công cụ nội bộ giúp họ tạo và quản lý container của họ. 9 | Năm 2013, dotCloud khủng hoảng. Do đó họ tuyển Ben Golub làm CEO mới, đặt lại tên công ty là Docker, thoát khỏi nền tảng dotCloud Paas, và bắt đầu nhiệm vụ mang Docker và Container ra thế giới. 10 | Hầu như tất cả các quỹ đầu tư đều tăng sau khi công ty đổi tên và đổi hướng đi tập trung vào Docker. 11 | Docker có một hội nghị thưởng niên là Dockercon, với mục đích cùng nhau phát triển hệ sinh thái container và thúc đẩy sử dụng công nghệ Docker và container. 12 | *NOTE: * Từ "Docker" có nghĩa là 13 | **dock work-er **: là người tải và bốc dỡ hàng hóa từ tàu. 14 | ## Docker runtime và engine 15 | Docker thường được nhắc đến là để chỉ Docker Engine. 16 | 17 | ![](http://i.imgur.com/pPaHR9V.png) 18 | Docker Engine là container runtime core dùng để chạy container. 19 | Các ứng dụng khác của Công ty Docker hoặc các công ty bên thứ 3 đều phát triển các sản phẩm phát triển thêm vào Docker Engine hoặc phát triển sung quanh Docker Engine. 20 | Docker Engine có thể tải trên trang chủ của Docker hoặc có thể built từ source trên Github. 21 | Tại thời điểm viết bài có 2 phiên bản docker engine chính: 22 | - Enterprise Edition (EE) 23 | - Là phiên bản thương mại của Docker Engine với thời gian hỗ trợ là 12 tháng cho mỗi bản phân phối. 24 | - Community Edition (CE) 25 | - Là phiên bản cộng đồng, mỗi bản phân phối có thời gian hỗ trợ là 4 tháng 26 | ## The Docker open-source project (Moby) 27 | Thuật ngữ Docker cũng để chỉ dự án mã nguồn mở Docker. Đây là một bộ công cụ mà hợp thành những thứ như Docker deamon or client mà bạn tải trên docker.com. Dự án này sau đó được đổi tên thành Moby và có cả logo riêng. 28 | ![](http://i.imgur.com/ILqFLDu.png) 29 | Mục tiêu của Moby là trở thành thượng nguồn của Docker, và cũng là để chia Docker thành các module nhỏ hơn và làm nó dưới dạng mở. 30 | Moby được đặt trên Github, repository của nó đặt ở https://github.com/moby 31 | Vì là một dự án mã nguồn mở, mã nguồn của nó được công khai. Bạn có thể tải về, đóng góp và chỉ sửa tuân theo Apache License 2.0 32 | 33 | ## The container ecosystem 34 | Bạn hoàn toàn có thể thay thế rất nhiều module đi kèm với docker bằng các module của bên thứ 3. 35 | Ở những ngày đầu, các module của các bên thứ 3 có khi còn tốt hơn nhiều so với module gốc của Docker. Điều này đem đến một số bất lợi kinh doanh cho công ty Docker, do đó, Docker biến các công ty phát triển mạnh tại một thời điểm nào đó thành đối tác lâu dài. 36 | Kết quả là các module ngày càng được phát triển tốt hơn. Cuối cùng thì các module vẫn có thể thay thế nhưng chúng ngày càng ít cần phải thay thế. 37 | Mặc dù vậy thì hệ sinh thái của container vẫn đang phát triển mạnh mẽ với sự hợp tác và cạnh tranh lành mạnh. 38 | ## The Open Container Initiative (OCI) 39 | OCI là công cụ để chuẩn hóa định dạng của runtime và image: 40 | - The *image-spec* 41 | - The *runtime-spec* 42 | OCI giúp tiêu chuẩn hóa runtime và image tạo sự phát triển tốt hơn từ cộng đồng, nhưng tiêu chuẩn thì luôn đi chậm đổi mới, mà công nghệ thì lại phát triển một cách chóng mặt. 43 | OCI được bảo hộ bởi Quỹ Linux, công ty Docker và CoreOS. 44 | 45 | 46 | -------------------------------------------------------------------------------- /docs/03.installation.md: -------------------------------------------------------------------------------- 1 | # Cài đặt Docker 2 | 3 | Trên Linux, sử dụng câu lệnh sau: 4 | ``` 5 | curl -sSL https://get.docker.com/ | sh 6 | ``` 7 | Bật dịch vụ: 8 | ``` 9 | systemctl start docker 10 | systemctl enable docker 11 | ``` 12 | Xác nhận cài đặt thành công nếu lệnh sau hiển thị phiên bản của docker đã được cài đặt: 13 | ``` 14 | docker --version 15 | ``` 16 | 17 | Hoặc có một lệnh khác dễ nhớ hơn khá nhiều khi cài trên Ubuntu: 18 | ``` 19 | sudo apt install docker.io -y 20 | ``` 21 | 22 | 23 | -------------------------------------------------------------------------------- /docs/04.example-tongquan.md: -------------------------------------------------------------------------------- 1 | # Cái nhìn tổng quan 2 | Mục tiêu của bài này là vẽ ra bức tranh tổng quan về những gì Docker nói về trước khi "lặn sâu hơn" trong những bài sau. 3 | Chúng ta sẽ chia bài thành 2 phần chính: 4 | - The Ops Perspective 5 | - Chúng ta sẽ tải image, start một container, log in vào container mới này, chạy lệnh bên trong container, và sau đó phá hủy nó. 6 | - The Dev Perspective 7 | - Chúng ta sẽ tập trung vào ứng dụng. chúng ta sẽ chạy thử một vài app-code từ github, kiểm tra một Dockerfile, đóng gói ứng dụng và chạy ứng dụng đó như một container. 8 | Khuyến nghị rằng bạn nên đọc cả hai phần, để có cái nhìn về Dev và Ops. DevOps anyone??? :blush: 9 | ## The Ops Perspective 10 | Khi bạn cài Docker, nó sẽ có 2 thành phần chính: 11 | - Docker client 12 | - Docker daemon ( hay còn được gọi là "server"hoặc "engine"). 13 | Docker daemon thực hiện Docker Engine API 14 | Ở bản cài đặt mặc định trên Linux, client giao tiếp với daemon qua một socket IPC/UNIX ở */var/run/docker.sock*. Trên Window nó làm qua một đường ống có tên được đặt ở *npipe:////./pipe/docker_engine*. 15 | Bạn có thể sử dụng lệnh `docker version ` để kiểm tra xem client và server (daemon) đang chạy và giao tiếp với nhau. 16 | ![](http://i.imgur.com/yUK3uU4.png) 17 | nếu chỉ trả về mục Client thì bạn thử chạy câu lệnh trên với `sudo`: `sudo docker version` 18 | Nếu không muốn dùng sudo thì bạn có thể thêm tài khoản hiện tại vào nhóm *docker*: sudo usermod -aG docker $USER 19 | ### Images 20 | Có thể coi Docker Image như là một vật mà chứa một OS filesystem và một ứng dụng. 21 | Như một template máy ảo trong môi trường ảo hóa, Docker Image trong thế giới Docker như là trạng thái dừng của một container.Nếu bạn là một dev, bạn có thể nghĩ rằng image như là một class. 22 | Để liệt kê các image, ta dùng lệnh: `docker image ls` 23 | ![](http://i.imgur.com/9SVofgf.png) 24 | Như hình là đang không có imge nào trong máy. Việc lấy một imang từ docker host được gọi là "pulling". Dùng lệnh `docker pull ubuntu ` để pull image ubuntu từ docker host. 25 | ![](http://i.imgur.com/8gOoTPN.png) 26 | Chạy lệnh `docker image ls` lần nữa để kiểm tra lại: 27 | ![](http://i.imgur.com/eeTxZaK.png) 28 | Chúng ta sẽ tìm hiểu chi tiết về nơi chứa docker image và bên trong docker image có gì ở những bài sau. Bây giờ chỉ cần hiểu là một image chứa hệ điều hành cũng như là tất cả code và những thứ yêu cầu để chạy một ứng dụng. 29 | Ví dụng như bạn pull image như nginx thì bạn sẽ có một image chứa hệ điều hành và code, môi trường sẵn sàng để chạy nginx. 30 | 31 | ### Containers 32 | Bây giời chúng ta đã có image đươc pull về local, chúng ta có thể dụng lệnh `docker container run` để chạy một container từ image: 33 | ```bash 34 | $ docker container run -it ubuntu:latest /bin/bash 35 | root@dbbe7440c855:/# 36 | ``` 37 | Câu lệnh trên để chạy một container từ image ubuntu và đưa terminal hiện tại thành terminal của container bằng cờ -it. 38 | Để thoát container mà không tắt nó thì ta sử dụng *Ctrl + PQ* . 39 | ![](http://i.imgur.com/S8gTg5W.png) 40 | ### Attaching to running containers 41 | Để truy cập vào terminal của container đang chạy dùng lệnh `docker container exec`. 42 | ví dụ: 43 | `docker container exec -it zealous_mcclintock bash` 44 | ![](http://i.imgur.com/tOEw7oY.png) 45 | *Ctrl + PQ* để thoát khỏi terminal của container. 46 | Để dừng và xóa container dùng lệnh `docker container stop`, `docker container rm` với tên/ID của container. 47 | ví dụ: 48 | ![](http://i.imgur.com/ysxJnko.png) 49 | ![](http://i.imgur.com/eVvgVyu.png) 50 | Chạy lênh `docker container ps -a` như hình trên, cờ -a để xem tất cả các container kể cả các container đã stop. 51 | 52 | ## The Dev Perspective 53 | Ở mục này chúng ta sẽ clone một ứng dụng từ github, kiểm tra Dockerfile của nó, đóng gói nó, và chạy nó như một container. 54 | Chạy các lệnh như dưới đây( trên Linux): 55 | 56 | `git clone https://github.com/nigelpoulton/psweb.git` 57 | ![](http://i.imgur.com/1ArNrZK.png) 58 | - chuyển tới thư mục psweb vừa clone về 59 | ```bash 60 | cd psweb 61 | ls -l 62 | ``` 63 | ![](http://i.imgur.com/iaAfr3D.png) 64 | Đây là một ứng dụng web nodejs đơn giản 65 | *Dockerfile* trong thư mục này là file văn bản mô tả cách dựng một ứng dụng thành Docker Image. 66 | - Đọc mội dung file này: 67 | `cat Dockefile` 68 | ![](http://i.imgur.com/D9yzux5.png) 69 | - Sử dụng lệnh `docker image build` để tạo image mới từ hướng dẫn trong Dockerfile. Chạy câu lệnh trong thư mục chứa app code và Dockerfile. 70 | `docker image build -t test:lastest . ` 71 | 72 | ![](http://i.imgur.com/YFF1cyp.png) 73 | sau khi build xong, kiểm tra image test:lastest trên host: 74 | `docker image ls` 75 | ![](http://i.imgur.com/y7pGYSq.png) 76 | - Chạy container từ image vừa tạo 77 | ```bash 78 | docker container run -d \ 79 | --name web1 \ 80 | --publish 8080:8080 \ 81 | test:latest 82 | ``` 83 | - Mở trình duyệt và localhost, DNS name hoặc ip ở port 8080 của host chứa container để kiểm tra xem web chạy từ container đã chạy chưa 84 | ![](http://i.imgur.com/hc6w72b.png) 85 | done. 86 | 87 | 88 | -------------------------------------------------------------------------------- /docs/05.Docker-Engine.md: -------------------------------------------------------------------------------- 1 | # Docker Engine 2 | Để sử dụng Docker thì bạn có thể bở qua bài này.Để thực sự *master* một thứ gì đó, bạn cần hiểu rõ cơ chế hoạt động của nó. 3 | Đây là bài lý thuyết, không có bài tập thực hành. 4 | ## Docker Engine 5 | - Docker engine là nhân phần mềm để chạy và quản lý container. Nó gần giống với ESXi ở VMware. Docker engine là thiết kế module với nhiều bộ phận có thể thay đổi. 6 | - Docker engine như là một động cơ xe ô tô- đều được tạo bởi nhiều bộ phận chuyên biêt: 7 | - Động cơ ô tô được tạo từ nhiều phần chuyên biệt hoạt động cùng nhau để xe có thể đi đươc - Động cơ xi lanh, Bugi, van, trục cam,.... 8 | - Docker engine cũng được tạo từ các tool chuyên biệt mà chạy cùng nhau để chạy và quản lý container - APIs, runtime, shim, ..... 9 | - Các thành phần chính cấu tạo nên Docker Engine là : Docker Client, Docker daemon, containerd, runc. 10 | ![](http://i.imgur.com/wKfiCGz.png) 11 | 12 | ## Docker Engine - The Deep Dive 13 | - Bản phân phối đầu tiên của Docker engine có 2 phần chính: 14 | - Docker daemon 15 | - LXC 16 | - Docker daemon là một khối nhị phân thống nhất chứa tất cả code của Docker client, Docker API, container runtime, image build, và nhiều thứ khác. 17 | - LXC cung cấp cho Docker daemon quyền truy cập vào các building-block cơ bản của container mà tồn tại trong Linux Kernel như Cgroup và namespace. 18 | ![](http://i.imgur.com/D5wAUSW.png) 19 | ### Bỏ LXC 20 | - Thứ nhất, LXC dành riêng cho Linux nên nó trở thành vấn đề lớn với dự án đa nền tảng của Docker. 21 | - Thứ hai, việc phụ thuộc vào một công cụ bên ngoài cho một phần cốt lõi của dự án là một rủi ro lớn có thể ảnh hưởng đến sự phát triển của dự án. 22 | - Do đó, công ty Docker đã phát triển công cụ riêng của họ là libcontainer để thay thế LXC. Mục tiêu của libcontainer là một công cụ không cần biết nền tảng, cung cấp cho Docker quyền truy cập vào các container building-block thay thế LXC trong Docker 0.9. 23 | ### Bỏ Docker daemon nguyên khối. 24 | - Bản chất nguyên khối của Docker deamon dẫn có những hạn chế: 25 | - Khó phát triển. 26 | - Ngày càng chậm hơn. 27 | - Nó không phải là những gì mà thệ sinh thái Docker mong muốn 28 | - Docker .Inc tiến hành mô-dun hóa nó. Mục đích của họ là tách docker daemon ra thành nhiều chức năng nhất có thể và rồi thực hiện các chức năng đó qua các công cụ chuyên dụng nhỏ hơn. Các công cụ nhỏ có thể tháo lắp 29 | ![](http://i.imgur.com/0AWAVu9.png) 30 | ### Sự ảnh hưởng của Open Container Initiative (OCI) 31 | OCI định nghĩa hai thông số liên quan đến container: 32 | - Image spec 33 | - Container runtime spec 34 | Docker sử dụng *runc* để chứa container runtime code. runc là bản phân phối tham chiếu cho OCI container-runtime-spec. 35 | runc và containerd đều là các thành phần của Docker engine với mục đích là phù hợp với các thông số OCI. 36 | 37 | ### runc 38 | - Docker inc tham gia rất nhiều để xác định các thông số và phát triển *runc* theo các thông số đó 39 | - *runc* được coi là một trình command-line wrapper nhỏ, nhẹ cho libcontainer. 40 | - *runc* dùng để tạo container nhanh, là một công cụ container runtime độc lập. Nó tạo, chạy contaner tốt nhưng lại không có nhiều chức năng. 41 | - *runc* là low-level container runtime 42 | ### containerd 43 | - *containerd* (phát âm container-dee) là một công cụ dùng để quản lý vòng đời của các container: `start | stop | pause | rm ...`. 44 | - *containerd* có sẵn như một daemon cho Linux và Window. 45 | - *containerd* nằm giữa Docker daemon và runc trong các tầng OCI. 46 | - *containerd* không chỉ quản lý vòng đời của container, sau này nó được phát triển để làm được nhiều nhứ khác, như là quản lý image. Lý do là để containerd dễ sử dụng trong các sự án khác. Tuy nhiên, các chức năng khác của containerd là dạng mô đun có thể dùng hoặc không. 47 | - *containerd* là high-level container runtime 48 | ### Start một container ( ví dụ). 49 | - Lệnh `docker container run`sau chạy một container từ `alpine` image: 50 | `docker container run --name vidu -it alpine sh` 51 | - Khi bạn gõ lệnh như trên vào Docker CLI, Docker client sẽ convert chúng thành API payload phù hợp và post chúng vào các API endpoint đúng, 52 | - API được triển khai trên Docker daemon sau khi nhận lệnh tạo một container, nó liên hệ đến *containerd* thông qua *CRUD-style API* qua *gRPC*. Lưu ý, Docker daemon không chứa bất kì một đoạn code nào để chạy container. 53 | - *containerd* không thể tạo container mà nó convert image thành một gói OCI và yêu cầu *runc* dùng nó để tạo container. 54 | - *runc* giao tiếp với OS kernel để tập hợp các cấu trúc cần thiết để tạo một container( namespace, cgroup,... ). Container process sẽ khởi động như một process con của *runc* và ngay sau khi nó hoạt động, runc sẽ thoát. 55 | - quá trình tạo container được tóm tắt ở hình sau. 56 | 57 | ![](http://i.imgur.com/X0fLc9G.png) 58 | ### Lợi ích của mô hình này. 59 | - Container runtime tách biệt với Docker daemon nên có thể bảo trì và nâng cấp Docker daemon mà không ảnh hưởng đến những container đang chạy 60 | - Trước đây khi mà container runtime được triển khai trên daemon thì mỗi khi cập nhật Docker (cập nhật thường xuyên), docker daemon cập nhật sẽ kill hết các container đang chạy. 61 | ### shim. 62 | - shim quan trọng trong quá trình tách biệt một container đang chạy với daemon. 63 | - Khi tạo một một container nghĩa là tạo ra một runc process mới để chạy container process như process con của runc. Nhưng ngay sau khi container được tạo thì runc process sẽ thoát. 64 | - Khi runc thoát, container shim process thay thế runc trở thành process cha cho container. Nhiệm vụ của shim: 65 | - giữ bất kì STDIN và STDOUT mở cho đến khi daemon khởi động lại, do đó container không bị đóng 66 | - báo cáo trạng thái thoát của container cho daemon 67 | ### Nó triển khai trên Linux ntn 68 | - dockerd (the Docker daemon) 69 | - docker-containerd (containerd) 70 | - docker-container-shim (shim) 71 | - docker-runc (runc) 72 | 73 | 74 | ## Chapter summary 75 | The Docker engine is modular in design and based heavily on open-standards from the OCI. 76 | The Docker daemon implements the Docker API which is currently a rich, versioned, HTTP API that has developed alongside the rest of the Docker project. 77 | Container execution is handled by containerd. containerd was written by Docker, Inc. and contributed to the CNCF. You can think of it as a container supervisor that handles container lifecycle operations. It is small and lightweight and can be used by other projects and third-party tools. For example, it’s poised to become the default, and most common, container runtime in Kubernetes. 78 | containerd needs to talk to an OCI-compliant container runtime to actually create containers. By default, Docker uses runc as its default container runtime. runc is the de facto implementation of the OCI container-runtime-spec and expects to start containers from OCI-compliant bundles. containerd talks to runc and ensures Docker images are presented to runc as OCI-compliant bundles. 79 | runc can be used as a standalone CLI tool to create containers. It’s based on code from libcontainer, and can also be used by other projects and third-party tools. 80 | There is still a lot of functionality implemented in the Docker daemon. More of this may be broken out over time. Functionality currently still inside of the Docker daemon include, but is not limited to: the API, image management, authentication, security features, core networking, and volumes. 81 | The work of modularizing the Docker engine is ongoing 82 | -------------------------------------------------------------------------------- /docs/06.Image.md: -------------------------------------------------------------------------------- 1 | # Image 2 | Trong bài viết sẽ nói đến Docker image là gì, và thực hiện các hoạt động cơ bản với Image. Cách build một image sẽ được đề cập ở một bài viết khác. 3 | 4 | ## Tổng quan Docker Image. 5 | - **Docker image** được coi là một container đã dừng, nó gần giống như một VM template ( stopped VM) 6 | - Khi bạn *pull* một image thì nó sẽ tải image về host từ một *image registry*. Registry phổ biến nhất là [Docker Hub](https://hub.docker.com/) 7 | - Docker image được tạo bởi nhiều lớp xếp lên nhau và được biểu diễn như một đối tượng. Trong image là một hệ điều hành được cắt giảm, tất cả file và những yêu cầu phụ thuộc để chạy một ứng dụng. 8 | ## Docker Image 9 | - Image như là một container đã dừng. Thực tế, bạn hoàn toàn có thể stop một container và build image từ nó. 10 | - **Image** như cấu trúc **build-time** còn **container** được coi như cấu trúc **run-time**. 11 | ![](http://i.imgur.com/pxFCA4V.png) 12 | ### Image và container 13 | Khi tạo một container từ một image, chúng sẽ chở nên phụ thuộc vào nhau. Bạn không thể xóa một image mà không dừng và xóa container mà chạy từ image đó, nó sẽ xuất hiện lỗi: 14 | ![](http://i.imgur.com/hE59BuA.png) 15 | ### image thường nhỏ. 16 | - Vì container hướng đến sự nhanh chóng, nhẹ để chạy ứng dụng, do đó, image cũng được xây dựng nhỏ gọn và loại bỏ những thứ không cần thiết. 17 | - Docker image không chứa kernel, container sẽ dùng chung kernal với host. 18 | - Image chứa một hệ điều hành chỉ đủ cho ứng dụng.( Các file liên quan đến hệ điều hành và filesystem). 19 | - Ví dụ: 20 | - Docker image *Alpine Linux* chỉ có kích thước khoảng 4MB là một ví dụ cho thấy docker image nhỏ như thế nào. 21 | - Image *Ubuntu* có kích thước lớn hơn, khoảng 110MB tuy nhiên, nó đã là rất nhỏ vì nó đã loại bỏ hầu hết những thành phần không thiết yếu trong hệ điều hành. 22 | - Image dựa trên nền Window có xu hướng lơn hơn so với trên nền Linux vì cách mà hệ điều hành Window hoạt động. 23 | ### Pulling Image 24 | - Một host mới cài Docker sẽ không có bất cứ image nào trong local repository của nó. 25 | - Local repository trên Linux host thường đặt ở `/var/lib/docker/:) do có image mới lấy tag giống image cũ. 85 | - *before*: đưa ra tên hay ID của một image để làm mốc, liệt kê các image tạo trước nó. 86 | - *since* : ngược với *before* 87 | - *label* : lọc dựa trên sự xuất hiện của nhãn, nhãn và giá trị 88 | Flag `--format` cũng là một flag để lọc đầu ra nhưng là các cột giá trị của đầu ra. 89 | Ví dụ 90 | Dùng lệnh sau sẽ chỉ hiển thị các giá trị repo, tag, size của các image: 91 | `docker image ls --format "{{.Repository}}: {{.Tag}}: {{.Size}}"` 92 | 93 | ![](http://i.imgur.com/8QpoTly.png) 94 | 95 | Cũng có thể sử dụng các công cụ để lọc có sẵn như grep hay awk trên Linux. 96 | 97 | ### Searching Docker Hub from the CLI. 98 | Lệnh `docker search` dùng để tìm kiếm Docker hub bằng dòng lệnh. 99 | Cũng có thể dùng lệnh trên với các option như lọc( lọc official image, lọc image được build automated). 100 | Lệnh `docker search` mặc định chỉ hiển thị 25 kết quả, có thể thay đổi giá trị này bằng cờ `--limit` và cao nhất là 100. 101 | 102 | ### Image và các lớp của nó. 103 | Image là một loạt các lớp read-only kết nối với nhau. 104 | 105 | ![](http://i.imgur.com/0tGlnOI.png) 106 | 107 | thử pull một image về để xem các lớp của nó: 108 | 109 | ``` 110 | $ docker image pull ubuntu:latest 111 | latest: Pulling from library/ubuntu 112 | 952132ac251a: Pull complete 113 | 82659f8f1b76: Pull complete 114 | c19118ca682d: Pull complete 115 | 8296858250fe: Pull complete 116 | 24e0251a0e2c: Pull complete 117 | Digest: sha256:f4691c96e6bbaa99d...28ae95a60369c506dd6e6f6ab 118 | Status: Downloaded newer image for ubuntu:latest 119 | ``` 120 | 121 | Mỗi dòng có Pull complete là tượng trưng cho một layer của image đã được pull về thành công. Image này có 5 layer. 122 | 123 | ![enter image description here](http://i.imgur.com/k9OGrRE.png) 124 | 125 | Một cách khác để xem các layer của một image là dùng lệnh `docker image inspect` 126 | ví dụ: 127 | 128 | ![](http://i.imgur.com/VFK1iPX.png) 129 | 130 | - lệnh `docker history` hiển thị lịch sử build image, không hiển thị các lớp của image. 131 | - Tất cả docker image đều bắt đầu với một base layer, khi có các thay đổi, nội dung mới thêm vào, một layer mới sẽ được thêm vào ở trên đầu. 132 | - ví dụ ( một ví dụ được đơn giản hóa cho mục đích trình diễn): 133 | - Build một image dựa trên base là ubuntu 16.04, thì image sẽ có một layer đầu tiên là ubuntu 16.04 134 | - nếu bạn thêm Python package và sercurity pack vào image thì nó sẽ thêm lần lượt các layer lên trên layer đầu tiên. 135 | - ![](http://i.imgur.com/yXsWXjh.png) 136 | - Với mỗi layer được thêm vào thì image sẽ kết hợp tất cả các layer với nhau. 137 | 138 | ![](http://i.imgur.com/jmmNWtT.png) 139 | 140 | Ví dụ trong hình 6.6 trên, image có hai layer, mỗi layer có 3 file, tức là image có 6 file. 141 | 142 | ![](http://i.imgur.com/tRPshtN.png) 143 | 144 | Ví dụ ở hình 6.7 phức tạp hơn với 3 layer. Image ở trong hình này có tổng 6 file tất cả vì, file 7 ở layer 3 là một bản cập nhật cho file 5 ở layer 2. Đây là cơ chế để cập nhật các file trong một image. 145 | Docker sử dụng storage driver mà nó có trách nhiệm xếp các layer và biểu diễn chúng như môt file system thống nhất. trên Linux có các storage driver là AUFS, overlay2, devicemapper, btrfs and zfs. 146 | Hình 6.8 biểu diên image trong hình 6.7 dưới dạng sẽ suất hiện ở trong hệ thống. 147 | 148 | ![](http://i.imgur.com/0VYtOYL.png) 149 | 150 | ### Chia sẻ các image layer. 151 | Các image có thể sử dụng và chia sẻ các layer với nhau, làm tăng sự hiệu quả trong không gian lưu trữ và hiệu năng. 152 | Khi pull các image mà đã có các layer có thể sử dụng trung trên local sẽ có thông báo `Already exists` ở layer đó. 153 | ### Pulling images by digest 154 | Các pull image bằng tag là cách phổ biến nhất. Nhưng tag thì có thể thay đổi dẫn đến việc có thể đánh dấu một thể với sai tag. 155 | Vì vậy *image digests* ra đời. Từ bản docker 1.10, các image đều có một mật mã băm của nội dung - *digest*. 156 | Vì digest là mã băm của nội dung của image nên nếu thay đổi nội dung image thì chắc chắn sẽ thay đổi digest của image đó. Nó giúp tránh các nhầm lẫn như với tag. 157 | Khi pull image về sẽ có kèm theo digest, hoặc có thể dùng `docker image ls --digest` để xem digest. 158 | 159 | ![](http://i.imgur.com/HoAp9yx.png) 160 | 161 | **Ghi chú** digest lại để nếu sau này cần pull đúng chính xác image này. hiện tại không có các nào để xem số digest của các image trên docker hub trừ khi pull về local. 162 | 163 | ![](http://i.imgur.com/rupcvqo.png) 164 | 165 | ## Image đa kiến trúc. 166 | Docker hướng tới sự đơn giản. 167 | Tuy nhiên, vì Docker phát triển, mọi thứ cũng bắt đầu trở nên phức tạp, đặc biệt khi các nền tảng và kiến trúc như Window, ARM, s390x được thêm vào. Lúc này, khó có thể biết được image pull về có thể chạy trên cấu trúc đang dùng hay không. 168 | Vì vậy, **Image đa kiến trúc** ra đời! 169 | Docker giờ đã hộ trợ image đa kiến trúc, nghĩa là một image tag có thể hỗ trợ nhiều nền tảng và kiến trúc. 170 | Để làm được điều đó, Registry API hỗ trợ hai cấu trúc quan trọng: 171 | - **manifest list** 172 | - **manifest** 173 | **manifest list** là để liệt kê các nền tảng và kiến trúc mà image hỗ trợ. mỗi nền tảng mà image hộ trợ đều có **manifest** riêng của nó. 174 | Ví dụ trong hình 6.9 là ví dụ về image đa nền tảng *golang*. **manifest list** chỉ ra các nền tảng hỗ trợ, các nền tảng hỗ trợ lại có các manifest chứa cấu hình của image và các dữ liệu layer. 175 | ![](http://i.imgur.com/fI3LH9j.png) 176 | Giả sử bạn dùng Docker trên Linux chạy trên cấu trúc ARM. Khi bạn pull một image, Docker client sẽ call đến Docker Registry API. Nếu image có **manifest list**, nó sẽ được phân tích xem có mục cho Linux on ARM không. Nếu có thì **manifest** của image cho Linux on ARM sẽ được truy xuất và phân tích. Sau đó từng lớp của manifest này được pull về. 177 | **manifest list** là một tùy chọn - nếu nó không có trong một image thì registry sẽ trả về manifest bình thường. 178 | ### Deleting Images. 179 | Không cần thì xóa, nhưng làm sao xóa. Lệnh `docker image rm` hoặc `docker rmi` là các lệnh dùng để xóa image. 180 | Xóa một image sẽ xóa image đó và tất cả các layer của nó trên host, các directory chỉ chứa layer data cũng sẽ bị xóa. Tuy nhiên, nếu một layer đang được share với nhiều image thì layer này sẽ không bị xóa trừ khi tất cả các image sử dụng nó bị xóa hết. 181 | Nếu đang có một container đang chạy từ image nào đó, không thể xóa được image này. 182 | stop và delete container trước khi xóa image. 183 | Cách xóa tất cả những image là dùng `docker image remove $(docker image ls -q)`. 184 | `docker image ls -q` là để liệt kê ra ID của các image. nếu thêm flag `-f` sau lệnh xóa image thì image sẽ bị xóa kể cả có container đang chạy trên image này, container này sẽ bị kill và delete. 185 | 186 | ## Image - the commands 187 | - `docker image pull` là lệnh để tải image từ một registy về. Registry mặc định của Docker là Docker Hub. Cấu trúc câu lệnh như sau: 188 | `docker pull image [OPTIONS [RegistryDNS/]NAME[:TAG|@DIGEST] ` 189 | - `docker image ls` - liệt kê các docker image lưu trong Docker host. Đê xem SHA256 digest thì thêm flag `--digest` . 190 | - `docker image inspect` show chi tiết về image - layer data, metadata. 191 | - `docker image rm` để xóa image. xóa image mà có container đang chạy thì phải tắt và xóa container trước hoặc thêm flag `-f`. 192 | ## Chapter summary 193 | 194 | In this chapter, we learned about Docker images. We learned that they are like virtual machine templates and are used to start containers. Under the hood they are made up one or more read-only layers, that when stacked together, make up the overall image. 195 | We used the docker image pull command to pull some images into our Docker host’s local registry. 196 | We covered image naming, official and unofficial repos, layering, sharing, and crypto IDs 197 | We looked at how Docker supports multi-architecture and multi-platform images, and we finished off by looking at some of the most common commands used to work with images. 198 | In the next chapter we’ll take a similar tour of containers — the runtime cousin of images. 199 | 200 | 201 | 202 | -------------------------------------------------------------------------------- /docs/07.Container.md: -------------------------------------------------------------------------------- 1 | # Container 2 | ## Tổng quan Docker container 3 | - Container là một trường hợp (instance) đang chạy của một image. Như khi chạy VM( máy ảo) từ một VM template, chúng ta có thể chạy một hay một vài container với một image. Khác nhau giữa VM và container có lẽ là container nhanh và nhẹ hơn - thay vì chạy cả một hệ điều hành đầy đủ, container dùng chung os/kernel với host mà nó đang chạy trên. 4 | ![Các container chạy từ một image](http://i.imgur.com/4sQTkWm.png) 5 | - Cách đơn giản nhất để chạy một container là dùng lệnh: `docker container run `. 6 | - Ví dụ: Lệnh sau chạy container Ubuntu để chạy ứng dụng Bash shell: `docker container run -it ubuntu /bin/bash`. flag`-it` để truy cập luôn từ terminal hiện tại của bạn vào shell của container. 7 | Container chạy cho đến khi app mà nó thực thi thoát. Ở ví dụ trên, Linux container sẽ thoát sau khi Bash shell thoát. 8 | - Bạn có thể tắt container thủ công với lệnh `docker container stop` và chạy nó lại với lệnh `docker container start`. Bạn cũng có thể xóa một container vĩnh viễn bằng lệnh `docker container rm`. 9 | ## Docker container - the deep dive 10 | ### Container vs VM 11 | - Container và VM (máy ảo ) đều chạy trên một host. Nó có thể là Laptop của bạn, một server vật lý, hoặc là một instance trên public cloud. 12 | - Ví dụ sau đây, chúng ta sử dụng một server vật lý để chạy 4 ứng dụng. 13 | - Trong mô hình VM, Server được bật lên và hypervisor boot ( chúng ta bỏ qua BIOS and bootloader,..). Sau đó, hypervisor yêu cầu tất cả tài nguyên phần cứng của hệ thống như CPU, RAM, storage, và NIC. Hypervisor sau đó chia những tài nguyên phần cứng này các phiên bản ảo. Chúng sau đó được đóng gói và một cấu trúc phần mềm được gọi là virtual machine (VM). Sau đó dùng các VM để cài hệ điều hành và ứng dụng. Vì cần cài 4 ứng dụng nên chúng ta cần tạo 4 Vm, cài hệ điều hành và ứng dụng cho 4 VM đó. 14 | ![](http://i.imgur.com/TNDuMUM.png) 15 | - Trong mô hình container, khi máy chủ bật, hệ điều hành khởi động và nó yêu cầu các tài nguyên phần cứng. Trên cùng của hệ điều hành, chún ta cài một container engine như Doker. Container engine lấy các tài nguyên hệ điều hành như process tree, filesystem, network và cô lập thành một cấu trúc cô lập bảo mật là container. Các container giống như một OS. Vì cần chạy 4 ứng dụng nên chúng ta chạy 4 ứng dụng trên 4 container 16 | ![](http://i.imgur.com/9T57vQL.png) 17 | - Tổng quan, có thể nói *hypervisor* là ảo hóa phần cứng còn *container* là ảo hóa hệ điều hành. 18 | ## Kiểm tra docker daemon 19 | - kiểm tra phiên bản docker: 20 | ```bash 21 | docker version 22 | 23 | 24 | root@lamth-Precision-M4700:~# docker version 25 | Client: 26 | Version: 18.09.4 27 | API version: 1.39 28 | Go version: go1.10.8 29 | Git commit: d14af54266 30 | Built: Wed Mar 27 18:35:44 2019 31 | OS/Arch: linux/amd64 32 | Experimental: false 33 | 34 | Server: Docker Engine - Community 35 | Engine: 36 | Version: 18.09.4 37 | API version: 1.39 (minimum version 1.12) 38 | Go version: go1.10.8 39 | Git commit: d14af54 40 | Built: Wed Mar 27 18:01:48 2019 41 | OS/Arch: linux/amd64 42 | Experimental: false 43 | 44 | ``` 45 | - Nếu lệnh trên không chạy được thì rất có thể docker daemon của bạn không chạy, hoặc bạn chưa có quyền. 46 | - Để kiểm tra trạng thái của docker daemon: 47 | ``` 48 | service doker status 49 | 50 | 51 | root@lamth-Precision-M4700:~# service docker status 52 | ● docker.service - Docker Application Container Engine 53 | Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: en 54 | Active: active (running) since Sat 2019-04-20 12:48:15 +07; 46min ago 55 | Docs: https://docs.docker.com 56 | Main PID: 2354 (dockerd) 57 | Tasks: 19 58 | CGroup: /system.slice/docker.service 59 | └─2354 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containe 60 | 61 | Thg 4 20 12:48:14 lamth-Precision-M4700 dockerd[2354]: time="2019-04-20T12:48:14. 62 | Thg 4 20 12:48:14 lamth-Precision-M4700 dockerd[2354]: time="2019-04-20T12:48:14. 63 | Thg 4 20 12:48:14 lamth-Precision-M4700 dockerd[2354]: time="2019-04-20T12:48:14. 64 | Thg 4 20 12:48:14 lamth-Precision-M4700 dockerd[2354]: time="2019-04-20T12:48:14. 65 | Thg 4 20 12:48:15 lamth-Precision-M4700 dockerd[2354]: time="2019-04-20T12:48:15. 66 | Thg 4 20 12:48:15 lamth-Precision-M4700 dockerd[2354]: time="2019-04-20T12:48:15. 67 | Thg 4 20 12:48:15 lamth-Precision-M4700 dockerd[2354]: time="2019-04-20T12:48:15. 68 | Thg 4 20 12:48:15 lamth-Precision-M4700 dockerd[2354]: time="2019-04-20T12:48:15. 69 | Thg 4 20 12:48:15 lamth-Precision-M4700 dockerd[2354]: time="2019-04-20T12:48:15. 70 | Thg 4 20 12:48:15 lamth-Precision-M4700 systemd[1]: Started Docker Application Co 71 | lines 1-19/19 (END) 72 | 73 | ``` 74 | - Hoặc `systemctl is-active docker` 75 | ## Chạy một container đơn giản. 76 | - Chạy một container sử dụng `docker container run`: 77 | ```bash 78 | docker container run -it ubuntu:latest /bin/bash 79 | 80 | 81 | root@lamth-Precision-M4700:~# docker container run -it ubuntu:latest /bin/bash 82 | root@a40bfb90337e:/# 83 | root@a40bfb90337e:/# 84 | ``` 85 | - Cấu trúc câu lệnh `docker container run