Docker basic
Tags: docker, beginners, tutorial, vietnameseblogs
Published: 2022-08-26 10:28:15

------link: https://devopswithdocker.com/part-1/6-docker-hub
-- install docker using the reposity:
Set up the reposity:
 sudo apt-get update
 sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
Add Docker's GPG key:
sudo mkdir -p /etc/apt/keyrings
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
 Set up the repository:
 echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
 Test installed by running hello-world image:
 docker run hello-world
 -- About docker image and container:
- Docker image chứa source code, thư viện,... và các file cần thiết để chạy 1 ứng dụng.
- Docker image chỉ có tính chất read-only nên hay được gọi là snapshots(không thể start hay run image).
- Docker container là runtime environment. Mỗi container hoạt động độc lập, 1 container lỗi không làm ảnh hưởng đến container khác và không làm ảnh hưởng đến server.
- Image có thể tồn tại mà không cần container, container chạy cần có image trong container đó.

--- From dockerfile to image to container:
 => 3 useful flags. -i (interactive), -t (tty) and -d (detached).
 -it allows you to interact with the container by using the command line.
 Dockerfile như là bản vẽ thiết kế, trong này hướng dẫn các step cụ thể để docker dựa vào và build ra image.
Để tạo image từ dockerfile dùng câu lệnh docker build, để tạo container từ image sử dụng câu lệnh docker create. Để chạy ứng dụng bạn start các service trong container đó.
-- Some cmd about docker:
Attach container
Ý nghĩa: Attach một màn hình cho phép nhập input và hiển thị output 
List images: docker images -a
build image: docker build
run container:docker run 
-- Bắt đầu test container:
Để sử dụng docker exec, bắt buộc phải run docker container.
Để run docker container:
cmd: docker run -d --name container-name alpine watch "date >> /var/log/date.log". Câu lệnh sẽ tạo mới 1 docker container. -d để tách container từ cmd để chạy trên nền docker. alpine là image được dùng trong container đó. watch "date>>/var/log/date.log" là cmd muốn chạy trong container đó. đoạn lệnh này sẽ chạy 2 phút/lần và in ra thời gian hiện tại.
-- Tìm tên docker container:
cmd: docker ps -a
-- execute bash command in docker container:
docker run -it <container> /bin/bash(PATH có thể xem qua docker container ls -a)
-- Docker Exec Multiple Commands:
docker exec <container> bash -c "command1 ; command2 ; command3"

--- Docker-compose:
dùng để chạy multi-container cho docker. Sử dụng file YAML để config các service của phần mềm. Cách làm qua 3 bước:
1. Khai báo app's environment trong Dockerfile.
2. Khai báo các services cần thiết để chạy application trong file docker-compose.yml
3. Chạy docker-compose up để start và run app.
(Notes: Nếu muốn dừng:
# Stop services only
docker-compose stop
# Stop and remove containers, networks..
docker-compose down 
# Down and remove volumes	
docker-compose down --volumes 
# Down and remove images
docker-compose down --rmi <all|local>)
#Theo dõi Logs từ các dịch vụ
docker-compose logs [SERVICES]
 
-- Volume:
Volume chỉ đơn giản là folder có thể chia sẻ giữa các container hay các máy chủ, và nó đồng bộ với nhau. Ví dụ mình muốn sửa code ở ngoài mà vẫn muốn nó thay đổi trong container, ta phải volume để mount nó.
câu lệnh:
docker volume create [volume_name]
docker volume ls
docker volume inspect [volume_name](information volume)
docker volume rm [volume_name][volume_name1]...(remove)
docker volume prune(remove all)
(ngoài ra còn có backup and restore container sử dụng volume)
-- env (FROM, RUN, ENV, CMD, ENTRYPOINT, ARG)
*FROM ImageName:
*RUN : thực thi các lệnh command line, thường được sử dụng để cài đặt các gói phần mềm.
*CMD : thực hiện lệnh mặc định khi khởi tạo container từ image(có thể ghi đè dòng lệnh)
*ENTRYPOINT : Khá giống CMD đều dùng để thực hiện lệnh khi khởi tạo container nhưng không ghi đè dòng lệnh cũ. 
*ARG : chỉ khả dụng trong quá trình build docker image (như trong câu lệnh RUN), không khả dụng sau khi image được tạo ra và các container được khởi động từ nó (ENTRYPOINT, CMD). Bạn cũng có thể sử dụng giá trị ARG để set giá trị ENV để làm việc trong đó.
*ENV : là các giá trị ENV có sẵn trong container, nhưng cũng có các lệnh RUN được chạy trong quá trình Docker build, bắt đầu xuất hiện và khả dùng từ dòng lệnh mà chúng được khai báo.
*COPY : sao chép dữ liệu
*ENV : thiết lập biến môi trường. Ví dụ: PATH
*VOLUME : thêm ổ đĩa, thư mục là volume chia sẻ giữa các container
*USER : tên user
*WORKDIR : thư mục làm việc
*EXPOSE : thiết lập cổng mà container lắng nghe(EXPOSE port 3210)

-- 
* env Dockerfile: sử dụng file .env
Dùng để thiết lập môi trường sẽ được dùng trong quá trình docker build image. VD env Dockerfile sau câu lệnh build:
"FROM ubuntu
 ARG BUILD_TIME =abc
 ENV RUN_TIME=123
 RUN touch /env.txt
 RUN printenv > /env.txt"
Có thể override env Dockerfile qua câu lệnh docker build -t temp --build-arg BUILD_TIME=def . và file docker sẽ có dạng như sau: 
"docker run temp cat /env.txt
HOSTNAME=b18b9cafe0e0                                                                                                  
RUN_TIME=123                                                                                                           
HOME=/root                                        
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
BUILD_TIME=def
PWD=/"

* env Docker-compose: sử dụng file docker-compose.yml

-- Different between env Dockerfile and env Docker-compose