Giới thiệu về Docker

Giới thiệu về Docker

I. DOCKER LÀ GÌ?

Docker là một nền tảng mở dành cho phát triển, triển khai, vận chuyển và chạy các ứng dụng. Docker cho phép bạn tách các ứng dụng khỏi cơ sở hạ tầng để bạn có thể phân phối phần mềm một cách nhanh chóng. Với Docker, bạn có thể quản lý cơ sở hạ tầng của mình giống như cách bạn quản lý các ứng dụng của mình. Bằng cách tận dụng các phương pháp luận của Docker để vận chuyển, kiểm thử và triển khai code một cách nhanh chóng, bạn có thể giảm đáng kể độ trễ giữa việc viết code và chạy code trong môi trường thật.

II. LỢI ÍCH CỦA DOCKER

Không như máy ảo, Docker start và stop chỉ trong vài giây.

Bạn có thể khởi chạy container trên mỗi hệ thống mà bạn muốn.

Container có thể build và loại bỏ nhanh hơn máy ảo.

Dễ dàng thiết lập môi trường làm việc. Chỉ cần config 1 lần duy nhất và không bao giờ phải cài đặt lại các dependencies.

Nó giữ cho không gian làm việc của bạn sạch sẽ hơn khi bạn xóa môi trường mà ảnh hưởng đến các phần khác.

III. CÀI ĐẶT

Xem hướng dẫn theo link: https://docs.docker.com/get-docker/

IV. IMAGE

Một Docker Image là một read-only template dùng để tạo ra các containers. Image được cấu tạo theo dạng layer và tất cả các layer đều là read-only. Một image có thể được tạo ra dựa trên một image khác với một số tùy chỉnh bổ sung. Nói ngắn gọn, Docker Image là nơi lưu trữ các cài đặt môi trường như OS, package, phần mềm cần chạy, …

V. CONTAINER

Docker Container được tạo ra từ Docker Image, là nơi chứa mọi thứ cần thiết để có thể chạy ứng dụng. Là ảo hóa nhưng Container lại rất nhẹ, có thể coi như là một quy trình của hệ thống. Chỉ mất vài giây để start, stop hoặc restart một Container. Với một máy chủ vật lý, thay vì chạy được vài cái máy ảo truyền thống thì ta có thể chạy vài chục, thậm chí vài trăm cái Docker Container.

VI. SO SÁNH CONTAINER VÀ MÁY ẢO

CONTAINER MÁY ẢO
Tài nguyên Quy trình trong container sử dụng trực tiếp tài nguyên thật, nhưng HĐH có thể quy định mỗi process một mức giới hạn tài nguyên khác nhau (hoặc không giới hạn). Mọi thứ đều bị giới hạn bởi phần cứng ảo.
Thực thi HĐH thật chạy phần mềm. HĐH thật → HĐH ảo → HĐH ảo chạy phần mềm. (Đối với VPS, Hypervisor type 1 thay thế cho HĐH thật)
Sự tối ưu Phần mềm thật chạy trên phần cứng thật. Tốc độ khởi động gần như một phần mềm bình thường. Phần cứng thật phải gánh cả một HĐH ảo. Từ khi máy tính khởi động lên, cho tới khi sử dụng được phần mềm rất mất thời gian.
Tính bảo mật Process trong cùng container vẫn có thể ảnh hưởng tới nhau. Nhưng thông thường mỗi container chỉ nên chạy một process. Process khác container không thể gây ảnh hưởng cho nhau. Phần mềm có mã độc có thể ảnh hưởng tới tài nguyên của process khác trong cùng VM.
Phần mềm hỗ trợ Docker Engine, LXC Linux Container, Apache Mesos, CRI-O (Kubernetes)… VirtualBox, VMWare, Microsoft Hyper-V, Parallels, Linux KVM, Docker Machine…

 

VII. DOCKERFILE

Dockerfile là file config cho Docker để build ra image. Nó dùng một image cơ bản để xây dựng class image khởi tạo. Một số image cơ bản: python, ubuntu and alpine. Sau đó nếu có các layer bổ sung thì nó được xếp chồng lên layer cơ bản.

Các config :

  • FROM — Chỉ định image gốc: python, ubuntu, alpine…
  • LABEL — Cung cấp metadata cho image. Có thể sử dụng để thêm thông tin bảo trì. Để xem các label của images, dùng lệnh docker inspect.
  • ENV — Thiết lập một biến môi trường.
  • RUN — Có thể tạo một lệnh khi build image. Được sử dụng để cài đặt các package vào container.
  • COPY — Sao chép các file và thư mục vào container.
  • ADD — Sao chép các file và thư mục vào container.
  • CMD — Cung cấp một lệnh và đối số cho container thực thi. Các tham số có thể được ghi đè và chỉ có một CMD.
  • WORKDIR — Thiết lập thư mục đang làm việc cho các chỉ thị khác như: RUN, CMD, ENTRYPOINT, COPY, ADD,…
  • ARG — Định nghĩa giá trị biến được dùng trong lúc build image.
  • ENTRYPOINT — Cung cấp lệnh và đối số cho một container thực thi.
  • EXPOSE — Khai báo port của image.
  • VOLUME — Tạo một điểm gắn thư mục để truy cập và lưu trữ data.

Ví dụ

FROM node:12-alpine
RUN apk add git
RUN mkdir -p /home/node/app
WORKDIR /home/node/app
COPY package*.json ./
RUN npm install
COPY . .
ENV HOST=0.0.0.0 PORT=3334
EXPOSE $PORT
CMD [ "node", "." ]

VIII. MỘT SỐ KHÁI NIỆM KHÁC

Docker Client: 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 các request từ Docker API. Nó quản lý images, containers, networks và volume.

Docker Volumes: là nơi 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 các 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. Ví dụ: node:12-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 môi trường thật. 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.

IX. CÁC LỆNH CƠ BẢN TRONG DOCKER

Hiển thị image/container:

docker image/container ls

Hiển thị toàn bộ container hiện có:

docker ps –a

Dừng một container cụ thể:

$docker stop <tên container>

Chạy container từ image và thay đổi tên container:

docker run –name <tên container> <tên image>

Dừng toàn bộ container:

docker stop $(docker ps –a –q)

Hiển thị log của một container:

docker logs <tên container>

Build một image từ container:

docker build -t <tên container> .

Tạo một container chạy ngầm:

docker run -d <tên image>

Khởi động một container:

docker start <tên container>

Xem thêm: https://docs.docker.com/reference/

X.  CÀI ĐẶT BAN ĐẦU

Bước 1: Truy cập vào EC2 của AWS.

  • Mở  ứng dụng Tera Term để truy cập.
  • Nhập host server vào ô Host.

  • Nhập username và key, sau đó nhấn OK.

  • Màn hình sau khi truy cập vào.

Bước 2: Cài đặt docker

  1. Cập nhật các package trên instance của bạn

    sudo yum update -y
  2. Cài đặt Docker

    sudo yum install docker -y
  3. Start service của docker

    sudo service docker start
  4. Thêm ec2-user vào group docker để bạn có thể thực hiện các lệnh Docker mà không cần sử dụng sudo.

    sudo usermod -a -G docker ec2-user

Bước 3: Cài đặt git và clone/pull source code.

  1.  Cài đặt git.
    sudo yum install git
    
  2. Clone/pull source code.
    git clone https://usernameToken:passwordToken@gitlab.com/<project name>/<git name>.git
    hoặc
    git pull origin develop

**  Với usernameToken là tên deploy token và passwordToken là một chuỗi ký tự random.(Xem thêm tại đây).

XI. DEPLOY

Bước 1: Đi đến thư mục chứa source code

cd <project folder>

file Dockerfile-dev trong source được cấu hình như sau

# Check out https://hub.docker.com/_/node to select a new base image
FROM node:12-alpine
# RUN apk update
RUN apk add git
# Set to a non-root built-in user `node`
USER node
# Create app directory (with user `node`)
RUN mkdir -p /home/node/app
WORKDIR /home/node/app

ENV NODE_ENV="<Tên môi trường>"
ENV PORT="3334"
ENV DEBUG="front:*"
ENV SESSION_SECRET="session-secret"

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)

COPY package*.json ./
RUN npm install

# Bundle app source code
COPY . .

# Bind to all network interfaces so that it can be mapped to the host OS
ENV HOST=0.0.0.0 PORT=3334

EXPOSE $PORT

CMD [ "node", "." ]

Bước 2: Build images của source

docker build --no-cache -t <Tên image> -f Dockerfile.dev . (Đối với development)

* -t: option tags của image.
* . : thư mục source.
* –no-cache: không lưu cache.

Bước 3: Chạy container từ image source

docker run -dp <host port>:<container port> --name <Tên container> <Tên image>

* –name: đặt tên cho container ở đây là  evaluate-system. Name này là duy nhất, nếu không đặt thì docker tự generate.
* -p mở port container.
* -d bật chế độ chạy background.

Bước 4: Đi đến thư mục nginx trong source

cd nginx

Trong thư mục nginx gồm 2 file là default.conf và Dockerfile
– File default.conf

server {
    location / {
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
          proxy_pass http://app:3334;
    }
}
– File Dockerfile
FROM nginx
RUN rm /etc/nginx/conf.d/*
COPY default.conf /etc/nginx/conf.d/

Build image nginx cho source

docker build -t es/nginx .

Chạy container es/nginx

docker run -dp 80:80 --link <Tên Container>:app --name nginx-proxy es/nginx

Bước 5: Hiển thị các image và container.

  • Danh sách image.

  •  Danh sách container.

Bước 6: Truy cập vào web

XII. TÀI LIỆU THAM KHẢO

https://docs.docker.com/get-docker/

https://docs.docker.com/reference/

https://docs.docker.com/

https://egghead.io/lessons/node-js-setup-an-nginx-proxy-for-a-node-js-app-with-docker