├── README.md ├── docs ├── Docker-images-optimized.pdf └── README.MD └── scripts ├── daemon.json.template └── docker-ubuntu.sh /README.md: -------------------------------------------------------------------------------- 1 | ## Docker là gì? 2 | 3 | ### Nội dung bài viết 4 | 5 | - [1. Khái niệm Docker](#1) 6 | 7 | - [2.Cấu trúc và thành phần của Docker](#2) 8 | 9 | - [3. Network trong Docker](#3) 10 | 11 | - [4. Volume trong Docker](#4) 12 | 13 | - [5. Dockerfile](#5) 14 | - [Chia sẻ một số Dockerfile](#5.1) 15 | - [Làm thế nào để tối ưu Docker Image](#5.2) 16 | - [6. Docker Compose](#6) 17 | 18 | ### 1. Khái niệm 19 | 20 | Docker là một nền tảng dành cho các developer và sysadmin để **phát triển, triển khai và chạy** các ứng dụng bằng các **container**. Việc đóng gói thành container này giúp cho việc triển khai các ứng dụng trở nên dễ dàng hơn. 21 | 22 | Công nghệ container ngày càng phổ biến bởi: 23 | - Linh hoạt: Có thể đóng gói từ ứng dụng đơn giản đến phức tạp 24 | - Nhỏ gọn: Các container tận dụng, sử dụng chung tài nguyên; kernel của host. Có thể chạy ở mọi nơi, mọi nền tảng. 25 | - Khả năng thay đổi linh hoạt: Cập nhật và nâng cấp nhanh chóng. 26 | - Khả năng mở rộng: Dễ dàng tăng và phân tán tự động các container 27 | - Phân tầng dịch vụ: Mỗi dịch vụ khi deploy sẽ được phân tầng, nằm trên các dịch vụ đang có sẵn. Như vậy sẽ không làm ảnh hưởng tới dịch vụ đang chạy. 28 | 29 | #### Khái niệm containers và images 30 | 31 | - Một container được khởi chạy từ image. Như vậy, image là một gói thực thi chứa bên trong là tất cả những gì cần thiết, liên quan để chạy ứng dụng như mã nguồn, các thư viện, runtime, các biến môi trường và các file cấu hình liên quan. 32 | - Một container là một instance đang chạy được khởi tạo từ image. 33 | 34 | #### So sánh giữa VM với container 35 | 36 | - Container chạy trực tiếp trên môi trường máy chủ như một tiến trình và chia sẻ phần kernel bên dưới dùng chung với máy chủ chứa nó 37 | - VM tạo ra một môi trường giả lập hoàn toàn tách biệt như 1 máy hoàn chỉnh thông qua việc phân bổ tài nguyên của máy chủ, do đó sẽ tốn tài nguyên nhiều hơn cho hệ điều hành của máy ảo 38 | 39 | 40 | 41 | ### 2. Cấu trúc và thành phần của Docker 42 | 43 | Docker bao gồm: 44 | 45 | - Docker Client: Giao diện để tương tác giữa người dùng với Docker Daemon - HOST 46 | - Docker Daemon (HOST): Lưu trữ image local và khởi chạy container từ những image đó 47 | - Docker Hub (registry): Nơi lưu trữ các images 48 | 49 | 50 | 51 | 52 | #### 2.1 Docker Client 53 | 54 | Docker client dùng để tương tác giữa người dùng và Docker Daemon, Daemon sẽ biên dịch và thực thi các câu lệnh đã tương tác qua Docker client. 55 | 56 | ##### Xem phiên bản đang sử dụng 57 | 58 | > docker version 59 | 60 | Câu lệnh sẽ trả về phiên bản của Docker client và Daemon (server) 61 | 62 | ``` 63 | Client: 64 | Version: 18.09.6 65 | API version: 1.39 66 | Go version: go1.10.8 67 | Git commit: 481bc77156 68 | Built: Sat May 4 02:34:58 2019 69 | OS/Arch: linux/amd64 70 | Experimental: false 71 | 72 | Server: Docker Engine - Community 73 | Engine: 74 | Version: 18.09.6 75 | API version: 1.39 (minimum version 1.12) 76 | Go version: go1.10.8 77 | Git commit: 481bc77 78 | Built: Sat May 4 02:02:43 2019 79 | OS/Arch: linux/amd64 80 | Experimental: false 81 | ``` 82 | 83 | #### Xem thông tin chi tiết về Docker 84 | 85 | Cung cấp thông tin về tài nguyên máy chủ, chi tiết về Docker. 86 | 87 | > docker info 88 | 89 | ``` 90 | Containers: 3 91 | Running: 3 92 | Paused: 0 93 | Stopped: 0 94 | Images: 7 95 | Server Version: 18.09.6 96 | Storage Driver: overlay2 97 | Backing Filesystem: xfs 98 | Supports d_type: true 99 | Native Overlay Diff: true 100 | Logging Driver: json-file 101 | Cgroup Driver: cgroupfs 102 | Plugins: 103 | Volume: local 104 | Network: bridge host macvlan null overlay 105 | Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog 106 | Swarm: inactive 107 | Runtimes: runc 108 | Default Runtime: runc 109 | Init Binary: docker-init 110 | containerd version: bb71b10fd8f58240ca47fbb579b9d1028eea7c84 111 | runc version: 2b18fe1d885ee5083ef9f0838fee39b62d653e30 112 | init version: fec3683 113 | Security Options: 114 | seccomp 115 | Profile: default 116 | Kernel Version: 3.10.0-957.10.1.el7.x86_64 117 | Operating System: CentOS Linux 7 (Core) 118 | OSType: linux 119 | Architecture: x86_64 120 | CPUs: 1 121 | Total Memory: 991.2MiB 122 | Name: minion4 123 | ID: 6BBX:UEEB:SDZ4:LGES:HSFN:WIEY:TASR:5MRK:JMV6:7O7W:CTGY:ATPX 124 | Docker Root Dir: /var/lib/docker 125 | Debug Mode (client): false 126 | Debug Mode (server): false 127 | Registry: https://index.docker.io/v1/ 128 | Labels: 129 | Experimental: false 130 | Insecure Registries: 131 | 127.0.0.0/8 132 | Live Restore Enabled: false 133 | Product License: Community Engine 134 | ``` 135 | 136 | #### Tìm kiếm image trên registry 137 | 138 | > docker search python 139 | 140 | ![a](https://docs.admicro.vn/uploads/images/2019/05/09/nPHvhj6FzEN3ALhKYDkxd3awcOQXLIAQ.png "search") 141 | 142 | - NAME: Tên của Image 143 | - DESCRIPTION: Mô tả về image 144 | - STARS: Số lượt rating. Số này càng cao thì chất lượng của Image càng tốt. 145 | - OFFICIAL: Được cung cấp bởi Hãng hoặc Tổ chức đã được xác nhận trên Registry 146 | 147 | #### Chạy một container từ Image 148 | 149 | > docker run -i -t --name web1 ubuntu 150 | 151 | Khi chạy **docker pull**, mặc định sẽ tìm trên localhost xem có image nào trùng với yêu cầu trong câu lệnh hay không. Nếu image không có sẵn trên localhost, Docker sẽ tìm kiếm và tải về (pull) từ Registry mặc định. 152 | 153 | - `-i`: Vào chế độ tương tác trực tiếp với Container 154 | - `-t`: Hiển thị tty 155 | - `--name`: Đặt tên cho container. Mặc định, nếu không đặt thì sẽ có tên ngẫu nhiên. 156 | 157 | Để thoát ra khỏi chế độ tương tác, thao tác lần lượt `CTRL` + `P` sau đó `CTRL` + `Q` 158 | 159 | #### Khởi động container ở chế độ chạy nền 160 | 161 | > docker run -d --name web1 ubuntu 162 | 163 | #### Liệt kê các container 164 | 165 | > docker ps -a 166 | 167 | ![PS](https://docs.admicro.vn/uploads/images/2019/05/09/FfJkeCZgd7w3SQpuRd3amnPsJ9obru56.png "PS") 168 | 169 | `-a` hoặc `--all`: Hiển thị toàn bộ số container có trên hệ thống 170 | - `CONTAINER ID`: ID của container 171 | - `IMAGE`: Tên của Image khởi tạo 172 | - `COMMAND`: Câu lệnh chính khi khởi động của container/image 173 | - `CREATE`: Thời gian container được tạo 174 | - `STATUS`: Trạng thái của container 175 | - `PORT`: Cổng của container được ánh xạ với host (HOST:CONTAINER) 176 | - `NAMES`: Tên của container 177 | 178 | #### Liệt kê các image 179 | 180 | > docker images 181 | 182 | Hoặc 183 | 184 | > docker image list 185 | 186 | ![Docker Images](https://docs.admicro.vn/uploads/images/2019/05/09/5H3iM0Awh7q8NzzTujpICp1puG9hTqpC.png "Docker Images") 187 | 188 | - `REPOSITORY`: Tên của image 189 | - `TAG`: Phiên bản của image 190 | 191 | #### Dừng hoạt động của container 192 | 193 | > docker stop web1 194 | 195 | #### Khởi động của container 196 | 197 | > docker start web1 198 | 199 | Có thể thêm `-i` để có thể tương tác trực tiếp với container. 200 | 201 | #### Tương tác với Container đang hoạt động 202 | 203 | > docker attach web1 204 | 205 | Hoặc tương tác sử dụng môi trường `/bin/bash` 206 | 207 | > docker exec -it web1 /bin/bash 208 | 209 | #### Xóa container 210 | 211 | Container chỉ bị xóa khi ở trạng thái dừng hoạt động. 212 | 213 | > docker rm web1 214 | 215 | #### Tạo container ánh xạ port với HOST (Máy chủ) 216 | 217 | ##### Ánh xạ port ngẫu nhiên với HOST 218 | 219 | > docker run -d --name db4 -P -e MYSQL_ROOT_PASSWORD=mysql-1 mysql 220 | 221 | `-P`: Ánh xạ ngẫu nhiên 222 | `-e`: Gán biến môi trường của trong container 223 | 224 | Kiểm tra các port ánh xạ của container 225 | 226 | ``` 227 | > docker port db4 228 | 3306/tcp -> 0.0.0.0:32777 229 | 33060/tcp -> 0.0.0.0:32776 230 | ``` 231 | 232 | ##### Chỉ định port ánh xạ giữa container với HOST 233 | 234 | > docker run -d --name db5 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mysql-1 mysql 235 | 236 | 237 | Kiểm tra các port ánh xạ của container 238 | 239 | ``` 240 | > docker port db5 241 | 3306/tcp -> 0.0.0.0:3306 242 | ``` 243 | 244 | ##### Ánh xạ một thư mục trên HOST vào bên trong container 245 | 246 | Để ánh xạ, tùy chọn `-v` được sử dụng khi khởi tạo container. Ví dụ, ánh xạ thư mục lưu trữ dữ liệu của mysql trong container với một thư mục trên host. 247 | 248 | ``` 249 | mkdir -p /opt/mysql_data 250 | docker run -d -v /opt/mysql_data:/var/lib/mysql --name db6 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mysql@123 mysql 251 | ``` 252 | 253 | ##### Liên kết giữa các container với nhau 254 | 255 | Việc liên kết các container để chúng có thể 'trò chuyện' với nhau thường được dùng bằng cách expose các port, điều này vô cùng bất lợi. Docker hỗ trợ liên kết các container với nhau bằng cách sử dụng tham số `--link` khi khởi tạo một container mới. Ví dụ, tạo một container khác để chạy ứng dụng webserver sử dụng database là container `db6` vừa tạo ở bước trên: 256 | 257 | ``` 258 | docker run -d --link db6:db.example.com --name wp1 -p 80:80,443:443 wordpress 259 | ``` 260 | 261 | - `--link db6:db.example.com`: Liên kết với container có tên là `db6` và có alias là `db.example.com` (giá trị này tương đương với FQDN) 262 | 263 | #### To be continued 264 | 265 | #### 2.2 Docker Hub (Registry) 266 | 267 | Docker Hub hay thường được gọi là Registry, nơi lưu trữ các image được cộng đồng hoặc các nhà phát triển đóng góp và cung cấp miễn phí, chúng ta có thể tìm các bản images tại đây. Điều này vô cùng tiện lợi, chúng ta chỉ cần pull (tải xuống) các image phục vụ cho nhu cầu ở mọi lúc mọi nơi. 268 | 269 | Chúng ta cũng có thể dễ dàng tạo ra những bản image của riêng mình phục vụ cho việc học tập, nghiên cứu, làm việc và chia sẻ chúng cho cộng đồng. Các bước để thực hiện được điều đó như sau: 270 | 271 | - Đăng kí một tài khoản tại https://hub.docker.com 272 | - Đưa image của lên Hub 273 | 274 | ##### Các bước đưa (push) lên Hub 275 | 276 | Ở ví dụ này, ta sẽ tạo một image và tạo một vài file trong đó rồi đóng gói lại thành một image. 277 | 278 | - **Bước 1**: Sử dụng một image có sẵn nhỏ gọn là `alpine` 279 | 280 | > docker run -it --name myimage1 alpine 281 | 282 | - **Bước 2**: Sau khi vào chế độ tương tác của container, tạo vài file bất kỳ và thoát khỏi container 283 | 284 | ``` 285 | touch a b c d e f 286 | ls 287 | exit 288 | ``` 289 | 290 | - **Bước 3**: Lưu lại image tại Host local (commit) 291 | 292 | > docker commit myimage1 username/myimage1 293 | 294 | `username`: Tên đăng nhập Hub 295 | `myimage1`: Tên image muốn lưu trên Hub. Có thể kèm theo Tag. VD: `myimage1:latest` để đánh dấu image bản mới nhất. 296 | 297 | - **Bước 4**: Đăng nhập vào Docker Hub 298 | 299 | > docker login 300 | 301 | Nhập user/password để đăng nhập 302 | 303 | - **Bước 5**: Đưa image lên Hub (push) 304 | 305 | > docker push username/myimage1 306 | 307 | ### 3. Network trong Docker 308 | 309 | Một trong những điểm mạnh của Docker đó là khả năng kết nối các container để chúng có thể giao tiếp được với nhau và có thể kết nối các container chạy trên các nền tảng khác nhau. (Linux, Windows,...) 310 | 311 | Để liệt kê danh sách Network ở Docker, ta sử dụng câu lệnh sau: 312 | 313 | > docker network ls 314 | 315 | Để xem các thông tin chi tiết của một Network nào đó, sử dụng câu lệnh: 316 | 317 | > docker network inspect 318 | 319 | #### Các loại Network trong Docker 320 | 321 | Sau khi cài đặt, Docker sẽ tạo mặc định 3 network: `brigde`, `none` và `host`. Khi khởi tạo container, ta có thể chỉ định cho chúng sử dụng network nào thông qua tùy chọn `--network`. 322 | 323 | - `brigde`: Network driver mặc định. Mặc định sử dụng `brigde` khi không khai báo trong lúc khởi tạo container. Nó cho phép các container riêng biệt, đơn lẻ (standalone) có thể giao tiếp được với nhau. Dải IP mặc định được cấp cho `brigde` là 172.17.0.0/16 324 | - `host`: Sử dụng thông tin về Network của host cho container. Được hỗ trợ từ phiên bản Docker 17.06 trở lên. 325 | - `none`: Không sử dụng Network trong container. 326 | - `overlay`: là một network driver cho phép kết nối các container nằm trên các Docker Host khác nhau, kích hoạt Swarm sử dụng để truyền thông. Các `overlay` network làm đơn giản hóa việc truyền thông giữa dịch vụ Swarm với container riêng biệt, đơn lẻ hay việc truyền thông giữa 2 container riêng lẻ nằm trên các Docker deamon (Host) khác nhau. Cách này sẽ xóa bỏ việc phải định tuyến (routing) phức tạp ở mức OS giữa các container với nhau. 327 | 328 | | Giao thức | Cổng | Mục đích | 329 | | -- | -- | -- | 330 | | TCP | 4789 | Truyền dữ liệu (data) | 331 | | TCP/UDP | 7946 | Điều khiển (control) | 332 | 333 | - `macvlan`: Sử dụng để gán địa chỉ MAC cho container với mục đích là cho container có vai trò như một thiết bị vật lý. Docker daemon sẽ định tuyến luồng gói tin tới các container thông qua các địa chỉ MAC này. Cách này vô cùng hữu hiệu cho các ứng dụng cũ /lỗi thời (legacy app) các kết nối sẽ được chuyển trực tiếp tới lớp Vật lý thay vì phải định tuyến thông qua lớp mạng bên trong Docker. 334 | 335 | Tóm tắt về Network trong Docker 336 | 337 | - **User-defined bridge networks**: là sự lựa chọn tốt nhất khi muốn các container trên cùng một host có thể giao tiếp với nhau. (Bridge driver) 338 | - **Host networks**: được sử dụng trong trường hợp muốn sử dụng chung các thông tin về Network trong container nhưng tách biệt các thông tin khác. 339 | - **Overlay network**: Trong trường hợp muốn các container trên các host khác nhau có thể truyền thông qua lại hay muốn nhiều container làm việc cùng nhau khi sử dụng Swarm thì đây là một sự lựa chọn. 340 | - **MACVlan network**: Sử dụng trong trường hợp muốn container có thể giao tiếp như một thiết bị vật lý, mỗi container sẽ có một địa chỉ MAC duy nhất, không trùng lặp. 341 | 342 | ### 4. Volume trong Docker 343 | 344 | *Docker volumes* vô cùng hữu ích với 2 TH muốn lưu trữ và chia sẻ dữ liệu của các container. Điều này vô cùng quan trọng, khi một container bị xóa bỏ có nghĩa rằng mọi dữ liệu bên trong chúng cũng đều bị 'bốc hơi'. Do vậy, để dữ liệu đó không bị mất thì Docker Volume là một tính năng hữu hiệu. 345 | 346 | Để sử dụng Docker volume, khi khởi chạy một container hãy thêm tùy chọn `-v` vào sau câu lệnh `docker run`. 347 | 348 | #### Khi nào cần sử dụng Volume? 349 | 350 | Giả sử, ta có một container làm web server. Khi đó ta sẽ ánh xạ một thư mục trên host để chứa mã nguồn với thư mục `/var/www/html` (thư mục chứa mã nguồn mặc định. Điều này vô cùng hữu ích khi ta muốn cập nhật mã nguồn (thêm xóa dữ liệu) của trang web; thay vì phải vào bên trong container để thao tác, ta có thể thao tác trực tiếp ở thư mục được ánh xạ trên host. 351 | 352 | #### Các loại Volume trong Docker 353 | 354 | Docker hỗ trợ 3 kiểu Volume như sau: 355 | 356 | - Bind mount 357 | - Volume 358 | - tmpfs mount 359 | 360 | ![volume-in-docker](https://docs.docker.com/storage/images/types-of-mounts-volume.png) 361 | 362 | #### Chi tiết 363 | 364 | ##### Bind mount 365 | - **Bind mount**: là một kỹ thuật để ánh xạ trực tiếp một thư mục trên host với một thư mục cụ thể nào đó bên trong container. Khi container bị xóa, dữ liệu bên trong thư mục sẽ không bị ảnh hưởng. 366 | 367 | ##### Volume 368 | - **Volume**: giống với `bind mount` nhưng thư mục ánh xạ sẽ được quản lý bởi Docker. Thư mục chứa mặc dịnh tại `/var/lib/docker/volumes/` 369 | 370 | ##### tmpfs mount 371 | - **tmpfs mounts** được sử dụng trong các trường hợp ta không muốn dữ liệu tồn tại trên Docker host hay containers vì lý do bảo mật hoặc đảm bảo hiệu suất của containers khi ghi một lượng lớn dữ liệu một cách không liên tục. 372 | 373 | ### 5. Dockerfile 374 | 375 | #### 5.1 Khái niệm 376 | 377 | `Dockerfile` là một tập tin dạng text chứa một chuỗi các câu lệnh, chỉ thị để tạo nên một image. Dockerfile bao gồm các câu lệnh liên tiếp thực hiện tự động dựa trên một image có sẵn để tạo ra một image mới. 378 | 379 | #### 5.2 Cú pháp trong Dockerfile 380 | 381 | ``` 382 | # Comment 383 | INSTRUCTION arguments 384 | ``` 385 | Trong đó: 386 | - `INSTRUCTION`: Là các câu lệnh, chỉ thị được Docker quy định và toàn bộ những chỉ thị này phải được viết bằng chữ IN HOA. 387 | - `arguments`: Phần nội dung của chỉ thị 388 | 389 | Ví dụ: 390 | 391 | ``` 392 | RUN echo "Hello world!" 393 | ``` 394 | 395 | #### 5.3 Các câu lệnh/chỉ thị trong Dockerfile 396 | 397 | `Dockerfile` chứa một tập hợp các câu lệnh bao gồm cả của Docker và các câu lệnh của OS. Trước hết, cần tìm hiểu rõ các câu lệnh của Dockerfile. 398 | 399 | - **FROM**: Dựa trên một image có sẵn để tạo ra một image mới. Chỉ thị này phải được đặt ở đầu Dockerfile. 400 | - **MAINTAINER**: (Tùy chọn) Điền thông tin của tác giả, người tạo ra image. 401 | - **RUN**: Chỉ thị dùng để thực thi câu lệnh ở bên trong image 402 | - **ADD**: Dùng để sao chép một file hoặc folder từ Host vào trong image. Có thể sử dụng một URL, Docker sẽ tải về thư mục đích bên trong image. 403 | - **ENV**: Khởi tạo một biến môi trường bên trong image. 404 | - **CMD**: Sử dụng để thực thi một câu lệnh khi tạo container được tạo từ image. 405 | - **ENTRYPOINT**: Chỉ ra một câu lệnh được thực thi khi container chạy. 406 | - **WORKDIR**: Chỉ ra thư mục làm việc khi tạo image hoặc khi khởi chạy container 407 | - **USER**: Xác định user (UID) thực thi các câu lệnh ở các chỉ thị CMD, RUN, ENTRYPOINT,... được xác định ở phía sau nó. 408 | - **VOLUME**: Cho phép truy cập/liên kết thư mục giữa container với host. 409 | - **EXPOSE**: Khai báo các Port Container sử dụng. 410 | - **ARG**: Khai báo sử dụng tham số khi build image sử dụng câu lệnh `docker build` với cờ`--build-arg =` 411 | 412 | #### Chia sẻ một số Dockerfile 413 | 414 | - KMS Server - https://gist.github.com/hoangdh/ed45d2c350a28ed3814e4f08d5fffe71 415 | - NGINX RTMP - https://raw.githubusercontent.com/hoangdh/ghichep-StreamingVideo/master/Dockerfile 416 | 417 | #### Làm thế nào để tối ưu Docker Image 418 | - Slide sơ sài: https://github.com/hoangdh/ghichep-docker/blob/master/docs/Docker-images-optimized.pdf 419 | 420 | ### 6. Docker-compose 421 | Ref: https://docs.docker.com/compose/overview/ 422 | 423 | #### 6.1 Khái niệm 424 | 425 | `docker-compose` là một công cụ để tạo, xác định và chạy nhiều container có mối liên quan với nhau trong cùng một thời điểm; được khai báo trong một file với định dạng YAML. Khởi động tất cả các dịch vụ chỉ với 1 câu lệnh duy nhất. 426 | 427 | Với 3 bước cơ bản như sau: 428 | 429 | - Định nghĩa các ứng dụng thông qua `Dockerfile` 430 | - Định nghĩa các ứng dụng chạy tách biệt và khởi động cùng nhau trong `docker-compose.yml` 431 | - Thực thi câu lệnh `docker-compose up -d` để hoàn tất 432 | 433 | Một file `docker-compose.xml` mẫu: 434 | 435 | ``` 436 | version: '3' 437 | services: 438 | web: 439 | build: . 440 | ports: 441 | - "5000:5000" 442 | volumes: 443 | - .:/code 444 | - logvolume01:/var/log 445 | links: 446 | - redis 447 | redis: 448 | image: redis 449 | volumes: 450 | logvolume01: {} 451 | ``` 452 | 453 | Sử dụng `docker-compose` để quản lý vòng đời ứng dụng cụ thể xem và quản lý trạng thái của các service (Start, stop, rebuild,...); chuyển log của các ứng dụng đang chạy. 454 | 455 | #### 6.2 Tính năng, lợi ích 456 | 457 | - Tạo ra nhiều môi trường riêng biệt trên cùng 1 host 458 | - Dữ liệu được bảo toàn 459 | - Chỉ khởi tạo lại khi có sư thay đổi 460 | - Các thành phần và biến được sử dụng giữa các môi trường 461 | 462 | **To be continued...** 463 | -------------------------------------------------------------------------------- /docs/Docker-images-optimized.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoangdh/ghichep-docker/bdaa2f024d963e4fe9a962319e0609164b446ad9/docs/Docker-images-optimized.pdf -------------------------------------------------------------------------------- /docs/README.MD: -------------------------------------------------------------------------------- 1 | Thư mục chứa tài liệu 2 | -------------------------------------------------------------------------------- /scripts/daemon.json.template: -------------------------------------------------------------------------------- 1 | { 2 | "data-root": "/data/docker", 3 | "insecure-registries": ["registry.hoangdh.internal:8080", "old.registry.hoangdh.internal"], 4 | "dns": ["10.10.10.10", "8.8.8.8"], 5 | "bip": "172.18.0.1/24", 6 | "log-driver": "json-file", 7 | "log-opts": { 8 | "max-size": "100m", 9 | "max-file": "3" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /scripts/docker-ubuntu.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | apt-get update -y 4 | apt-get install -y apt-transport-https ca-certificates curl software-properties-common 5 | 6 | curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 7 | 8 | add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" 9 | apt-get update -y 10 | 11 | apt-get install docker-ce -y 12 | 13 | curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 14 | 15 | chmod +x /usr/local/bin/docker-compose 16 | --------------------------------------------------------------------------------