https://xuanthulab.net/chia-se-du-lieu-giua-docker-host-va-container.html
https://topdev.vn/blog/docker-la-gi-kien-thuc-co-ban-ve-docker/
Chạy các lệnh để cài đặt:
$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
$ sudo apt update
$ apt-cache policy docker-ce
$ sudo apt install docker-ce
$ sudo systemctl status docker
Sau khi cài đặt, bạn có thể cho user hiện tại thuộc group docker, để khi gõ lệnh không cần xin quyền "sudo"
sudo usermod -aG docker $USER
Logout sau đó login lại để có hiệu lực.
============================================================================
$ docker Liệt kê tất cả các lệnh con trong docker
$ docker image --help Đưa ra các hướng dẫn trợ giúp về các lệnh con có trong image, và tương tự với các lệnh khác
Image trong docker là những phần mềm được đóng gói và quản lý bởi docker. VD như image đóng gói phần mềm php, image đóng gói hệ điều hành ubuntu...vv. Trong docker các image "chỉ có thể đọc không thể sửa đổi". Khi image được docker khởi chạy thì phiên bản thực thi của image được gọi là các container. Các container thì "có thể ghi được các dữ liệu vào trong đó'. Như vậy là để có container để chạy các ứng dụng thì chúng ta phải có image trước
image là một gói phần mềm trong đó chứa những thứ cần như thư viện, các file cấu hình, biến môi trường để chạy mội ứng dụng nào đó. Nó giống như cái USB chứa bộ cài đặt hệ điều hành Windows!
Khi một phiên bản của image chạy, phiên bản chạy đó gọi là container - (vậy muốn có container phải có image). Bất ký lúc nào bạn cũng có thể kiểm tra xem có bao nhiêu container đang chạy và nó sinh ra từ image nào.
Bước đầu, để có image nào đó bạn tải về từ https://hub.docker.com/search?q=&type=image, tại đó có đủ các loại phù hợp với công việc của bạn!
- REPOSITORY : là tên của image
- TAG : là phiên bản của image, với giá trị latest có nghĩa là bản cuối. Muốn tải về bản khác latest vào mục TAGS trên https://hub.docker.com/search?q=&type=image tìm bản phù hợp.
- IMAGE ID : là một chuỗi định danh duy nhất của image trên hệ thống của bạn.
$ docker search ubuntu Tìm kiếm các phiên bản trực tiếp bằng lệnh docker
$ docker --version
Hoặc thông tin chi tiết hơn:
$ docker info
docker images
docker images -a
docker pull repository:tag VD: docker pull ubuntu:20.04
Hoặc tải về bản mới nhất
docker pull repository (Mặc định sẽ tải phiên bản mới nhất )
docker container ls -a
docker container ls --all
- CONTAINER ID : một con số (mã hash) gán cho container, bạn dùng mã này để quản lý container này, như xóa bỏ, khởi động, dừng lại ...
- IMAGE : cho biết container sinh ra từ image nào.
- COMMAND : cho biết lệnh, ứng dụng chạy khi container chạy (/bin/bash là terminate)
- STATUS : cho biết trạng thái, (exit - đang dừng)
docker image rm imageid Chỉ cần ghi ký tự đầu của IMAGE ID docker vẫn hiểu và tự xóa
docker image rm repository:tag Thêm -f là bắt buộc xóa
docker container rm containerid
docker rm -f NAME
docker rm -f ID
docker run -it repository:tag
docker run -it imageid
- -i có nghĩa duy trì mở stdin để nhập lệnh.
- -t nó có nghĩa là console, cho phép kết nối với terminal để tương tác
Kiểm tra thông tin phiên bản của image ubuntu:
cat /etc/*release
Cấu trúc: docker run -it --name "CONTAINER NAME" -h HOSTNAME image
docker run -it --name "ABC" -h ubuntu1 repository:tag
docker ps
Nếu muốn liệt kê tất cả các container kể cả những container không chạy gõ lệnh
docker ps -a
docker attach containerid
docker container attach containerid
docker start containerid
docker container start -i containerid
docker exec -it containerid command
CTRL + P, CTRL + Q
CRT + P rồi Q
docker stop containerid
docker stop name
exit
docker exec CONTAINER lệnh VD: $ docker exec U1 ls
docker exec -it CONTAINER lệnh
- (tham số -it: nhận input và kết nối terminal + Tên container + lệnh thực thi ) ~ Lệnh này tương tự như lệnh attch
VD : docker exec -it U1 bash ---> (lệnh bash kết nối luôn với terminal)
Muốn commit CONTAINER nào trở thành IMAGE thì CONTAINER đó phải ở trạng thái "dừng"
docker commit CONTAINER IMAGE:TAG VD: $ docker commit U1 ubuntu-nano:version1
docker save --output name.tar IMAGE_ID
docker load -i file.tar
docker tag IMAGE_ID name:tag VD: $ docker tag b5 ubuntu1:version2
==================================================
Cách mount thư mục máy Host hoặc tạo ổ đĩa để chia sẻ dữ liệu vào Container cũng như chia sẻ dữ liệu các container với nhau. cách chia sẻ dữ liệu giữa máy Host và Container, giữa các Container với nhau bằng cách sử dụng một thư mục trên máy Host làm nơi lưu trữ tập trung. Máy Host là hệ thống bạn đang chạy Docker Engine. Một thư mục của máy Host có thể chia sẻ để các Container đọc, lưu dữ liệu.
'Khởi tạo' và 'chạy' một container mới và đồng thời 'chia sẻ dữ liệu của máy host vào container'
docker run -it -v pathHost:pathContainer ImageID VD: $ docker run -it -v ~/Desktop/dulieu:/home/dulieu b5a2
'Khởi tạo' và 'đặt tên' và 'chạy' một container mới và đồng thời 'chia sẻ dữ liệu của máy host vào container'
docker run -it -v pathHost:pathContainer --name "ABC" ImageID VD: $ docker run -it -v ~/Desktop/dulieu:/home/dulieu --name C1 b5
echo "Hello" > 2.txt
Tạo thêm file 2.txt trong container, nếu xóa đi container thì dữ liệu này vẫn tồn tại trên máy host
docker run -it --volumes-from OtherContainer ImageID VD: $ docker run -it --name C4 --volumes-from C3 fb
touch 3.txt
Tạo thêm file 3.txt
Chia sẽ dữ liệu thông qua, 'tạo' hoặc 'quản lý' các ổ đĩa
- Kiểm tra xem có Volume nào đang tồn lại
docker volume ls
- Tạo Volume
docker volume creat NAMEDISK VD: $ docker volume create D1
- Kiểm tra thông tin ổ đĩa
docker volume inspect VOLUME_NAME
- Xóa ổ đĩa Volume
docker rm volume VOLUME_NAME
- Tạo và quản lý ỗ đĩa
- Gán ổ đĩa VOLUME_NAME vào container để container lưu dữ liệu cố định ở trong đó. Ổ đĩa này container có thể lưu trữ các dữ liệu của nó vào đó mà những dữ liệu này ko mất đi khi chúng ta xóa container
docker run -it --name "ABC" --mount source=VOLUME_NAME,target=pathContainer ImageID
VD: $ docker run -it --name C1 --mount source=D2,target=/home/disk2 ubuntu:latest
- Tạo ra ổ đĩa mà nó ánh xạ dữ liệu đến 1 thư mục cụ thể nào đó mà ta ấn định ra ở trong máy host
- Nếu muốn ổ đĩa bind(trói buộc) dữ liệu đến một thư mục cụ thể của máy HOST thì tạo ổ đĩa với tham số như sau:
docker volume create --opt device=pathHOST --opt type =none --opt o=bind VOLUME_NAME
VD: $ docker volume create --opt device=~/Desktop/dulieu/ --opt type=none --opt o=bind DISK1 (DISK1: tên VOLUME_NAME muốn đặt)
VD: $ docker volume create --opt device=/home/tan/Desktop/dulieu --opt type=none --opt o=bind DISK1 (DISK1: tên VOLUME_NAME muốn đặt)
- Sau đó ổ đĩa này gán vào container với tham số -v (không dùng --mount)
docker run -it -v VOLUME_NAME:pathContainer ImageID
VD: $ docker run -it -v DISK1:/home/disk ubuntu:latest
- Xóa tất cả các ổ đĩa không được sử dụng bởi container nào:
docker volume prune
================================================================
'Busybox' là một Image rất nhỏ gọn nhưng trong đó có chứa rất nhiều công cụ dựa trên nền tảng linux https://busybox.net/downloads/BusyBox.html và chứa hàng trăm lệnh linux thông dụng. Tải Busybox docker pull busybox
- Tạo container busybox và tự xóa khi kết thúc
docker run -it --rm busybox
- Kiểm tra lệnh busybox
ls /bin/ -la
Kiểm tra xem trong docker có mạng nào
docker network ls (đây là 3 network mặc định khi tạo ngay khi cài đặt docker)
Mạng bridge được các container khi tạo ra mặc định nó kết nối vào nếu chúng ta ko chỉ định 1 mạng cụ thể nào đó. Muốn tra cứu thông tin về 1 network nào đó, cũng như kiểm tra xem network đó đang có container nào kết nối vào thì chúng ta sử dụng lệnh
docker network inspect bridge
docker inspect B1
docker inspect ContainerID
Kiểm tra xem 2 container B1 và B2 đã liên mạng được với nhau hay chưa
ping 172.17.0.3
Trong image busybox nó có sẵn 1 công cụ để tạo máy chủ 'http'. Ví dụ ở đây chúng ta sẽ cho container B2 chạy máy chủ 'http'.
docker attach B2
Vào thư mục 'cd /var/www' chúng ta vào thư mục 'www' và bây giờ ta sẽ chạy lệnh để máy chủ 'http' làm việc trên thư mục này.
httpd
Như vậy là máy chủ 'http' đang làm việc và mặc định và nó đang lắng nghe các yêu cầu các requirest gửi đến ở cổng 80 của container. Tạo file index.html
vi index.html
Như vậy là hiện tại container B2 đang có 1 máy chủ 'http' chạy và đang lắng nghe cổng 80. Thì như chúng ta đã biết container B1 và B2 đang cùng 1 mạng. Như vậy là từ B1 có thể gữi yêu cầu được đến B2 thông qua địa chỉ IP và cổng 80 của B2. Bây giờ sẽ vào container B1 requirest đến container B2
docker attach B1
wget -o - 172.17.0.3
Như vậy là web server của B2 đã gửi trả về nội dung file index.html và B1 đã đọc được đó là file index.html với nội dung 'web server is running ...'. Như vậy là container B1 truy cập được đến B2 thông qua cổng 80
Đang từ ngoài mạng của máy Host muốn truy cập đến container B2 thông qua địa chỉ IP của máy host 127.0.0.1 thì chúng ta phải ánh xạ cái cổng 80 của B2 vào 1 cái cổng nào đó theo cái địa chỉ IP của máy Host. Bây giờ chúng ta sẽ thiết lập truy cập tới cổng 80 của container B2 thông qua cổng 8888 của IP máy host 127.0.0.1 Thì để làm điều đó thì khi tạo container thì chúng ta phải ánh xạ cổng của container vào cái cổng nào đó của máy host. Thì chúng ta làm điều đó như sau chúng ta xóa đi container B2 tạo lại container B2 có ánh xạ cổng 80 vào cổng 8888. Để thiết lập ánh xạ cổng giữa container và máy host thì chúng ta sử dụng tham số '-p'và cổng muốn ánh xạ từ máy host vào container
docker run -it --name B2 -p 8888:80 busybox
- Ngoài những network mặc định mà docker đã tạo ra thì chúng ta cũng có thể tạo thêm nhiều mạng cầu bridge khác áp dụng cho trường hợp chúng ta ko muốn tất cả container nối vào 1 mạng, mà chúng ta muốn tạo ra những mạng khác nhau để chúng ta cách ly một số container với nhau
- Tạo mạng bride
docker network create --driver bridge network1
Xóa một network
docker network rm Name
Tạo một container mới và cho thiết lập với mạng muốn thiết lập từ ban đầu
docker run -it --name B3 --network mynetwork busybox
Tạo container B4 có ánh xạ cổng 9999 của máy Host vào cổng 80 của B4 và kết nối vào bridge mynetwork vừa tạo
docker run -it --name B4 --network mynetwork -p 9999:80 busybox
Và mạng của chúng ta sẽ như sau:
Để cho container B3 kết nối được với cả 2 network mynetwork và bridge thì thực hiện lệnh
docker network connect bridge B3
Như vậy là B3 đã có thể kết nối 2 network mynetwork và bridge Thử ping đến cổng 80 của B2
wget -O - 172.17.0.3
wget -O - B4
ping B4
Tạo và chạy container, container tự xóa khi kết thúc thì thêm vào tham số --rm
docker run -it --rm ubuntu
Tạo và chạy container - khi container chạy thi hành ngay một lệnh nào đó, ví dụ ls -la
docker run -it --rm debian ls -la
Tạo và chạy container - ánh xạ một thự mục máy host vào một thư mục container, chia sẻ dữ liệu
docker run -it --rm -v path-in-host:path-in-container debian
Vào container đang đang chạy
Kiểm tra xem bằng lệnh docker ps, nếu có một container với ID là containerid đang chạy, để quay quay trở lại terminal của nó dùng lệnh:
docker container attach containerid
Chạy một container đang dừng
docker container start -i containerid
Nếu cần xóa bỏ hẳn một container thì dùng lệnh
docker container rm containerid
- Docker Client: là cách mà bạn tương tác với docker thông qua command trong terminal. Docker Client sẽ sử dụng API gửi lệnh tới Docker Daemon.
- Docker Daemon: là server Docker cho yêu cầu từ Docker API. Nó quản lý images, containers, networks và volume.
- Docker Volumes: là cách tốt nhất để lưu trữ dữ liệu liên tục cho việc sử dụng và tạo apps.
- Docker Registry: là nơi lưu trữ riêng của Docker Images. Images được push vào registry và client sẽ pull images từ registry. Có thể sử dụng registry của riêng bạn hoặc registry của nhà cung cấp như : AWS, Google Cloud, Microsoft Azure.
- Docker Hub: là Registry lớn nhất của Docker Images ( mặc định). Có thể tìm thấy images và lưu trữ images của riêng bạn trên Docker Hub ( miễn phí).
- Docker Repository: là tập hợp các Docker Images cùng tên nhưng khác tags. VD: golang:1.11-alpine.
- Docker Networking: cho phép kết nối các container lại với nhau. Kết nối này có thể trên 1 host hoặc nhiều host.
- Docker Compose: là công cụ cho phép run app với nhiều Docker containers 1 cách dễ dàng hơn. Docker Compose cho phép bạn config các command trong file docker-compose.yml để sử dụng lại. Có sẵn khi cài Docker.
- Docker Swarm: để phối hợp triển khai container.
- Docker Services: là các containers trong production. 1 service chỉ run 1 image nhưng nó mã hoá cách thức để run image — sử dụng port nào, bao nhiêu bản sao container run để service có hiệu năng cần thiết và ngay lập tức.