Ghi chép lại quá trình tìm hiểu Docker
Docker tất cả là về việc lấy ứng dụng và chạy chúng trong container. Quá trình lấy ứng dụng, cấu hình nó để chạy trên container được gọi là containerizing hay Dockerizing.
Ví dụ này sử dụng ứng dụng được clone từ github: https://github.com/nigelpoulton/psweb.git
Clone ứng dụng:
$ git clone https://github.com/nigelpoulton/psweb.git
Cloning into 'psweb'...
remote: Enumerating objects: 15, done.
remote: Total 15 (delta 0), reused 0 (delta 0), pack-reused 15
Unpacking objects: 100% (15/15), done.
$ cd psweb
$ ls -l
total 28
-rw-r--r-- 1 root root 341 Thg 5 3 11:31 app.js
-rw-r--r-- 1 root root 216 Thg 5 3 11:31 circle.yml
-rw-r--r-- 1 root root 338 Thg 5 3 11:31 Dockerfile
-rw-r--r-- 1 root root 421 Thg 5 3 11:31 package.json
-rw-r--r-- 1 root root 370 Thg 5 3 11:31 README.md
drwxr-xr-x 2 root root 4096 Thg 5 3 11:31 test
drwxr-xr-x 2 root root 4096 Thg 5 3 11:31 views
# Test web-app to use with Pluralsight courses and Docker Deep Dive book
# Linux x64
FROM alpine
LABEL maintainer="nigelpoulton@hotmail.com"
# Install Node and NPM
RUN apk add --update nodejs nodejs-npm
# Copy app to /src
COPY . /src
WORKDIR /src
# Install dependencies
RUN npm install
EXPOSE 8080
ENTRYPOINT ["node", "./app.js"]
FROM
. Nó là lớp nền tảng của image để chủ định image nền tảng để chạy ứng dụng.
LABLE
: Lable là những giá trị đơn giản và là cách tốt nhất để thêm siêu dữ liệu vào một image.
- RUN
: để thực thi một câu lệnh trong quá trình build image. Chỉ dẫn RUN apk add --update nodejs nodejs-npm
sử dụng package manager apk
của Alpine để cài đặt nodejs
và nodejs-npm
vào image. RUN
cài một package mới như một lớp mới ở trên cùng của image.
Chỉ dẫn COPY . /src
copy file ứng dụng từ build context. Nó copy file và image như một lớp mới.
WORKDIR
để thiết lập thư mục làm việc. chỉ dẫn này không tạo thêm một lớp mới.Chỉ dẫn RUN npm install
sử dụng npm để cài đặt những thành phần phụ thuộc của ứng dụng được liệt kê trong package.json ở build context.
EXPOSE 8080
để expose ứng dụng ra port 8080. Nó thêm vào image dưới dạng metadata không phải là một lớp của imageENTRYPOINT
để chỉ định ứng dụng chính mà container sẽ chạy. Nó cũng là metadata và không phải một layer.
../psweb# docker image build -t web:latest .
Sending build context to Docker daemon 80.38kB
Step 1/8 : FROM alpine
latest: Pulling from library/alpine
bdf0201b3a05: Pull complete
Digest: sha256:28ef97b8686a0b5399129e9b763d5b7e5ff03576aa5580d6f4182a49c5fe1913
Status: Downloaded newer image for alpine:latest
...
Step 8/8 : ENTRYPOINT ["node", "./app.js"]
---> Running in 4f42b7174ab2
Removing intermediate container 4f42b7174ab2
---> 2acf66ff7a0a
Successfully built 2acf66ff7a0a
Successfully tagged web:latest
# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
web latest 2acf66ff7a0a 3 minutes ago 69MB
# docker login
Username: lamth
Password:
Login Succeeded
# docker image tag web:latest lamth/web:latest
lệnh docker image tag <tag cũ> <tag mới>
là để thêm tag cho image chứ không ghi đè lên tag cũ.
# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
lamth/web latest 2acf66ff7a0a 16 hours ago 69MB
web latest 2acf66ff7a0a 16 hours ago 69MB
# docker image push lamth/web:latest
The push refers to repository [docker.io/lamth/web]
f941dc00b27a: Pushed
6624dbf217ff: Pushed
8dd5da23be75: Pushed
a464c54f93a9: Mounted from library/alpine
latest: digest: sha256:d696c1fceca0367d044a9d9a43ea8630016ba80d0180897b47f1b79b82338ef9 size: 1160
# docker container run -d --name testweb \
-p 80:8080 \
web:latest
# docker container ls
ID IMAGE COMMAND STATUS PORTS
49.. web:latest "node ./app.js" UP 6 secs 0.0.0.0:80->8080/tcp
#
INSTRUCTION argument
. Tên các chỉ dẫn không phân biệt viết HOA hay viết thường, nhung nó thường được viết HOA.docker image build
phân tích Dockerfile thành từng dòng một từ trên xuống dướiFROM, RUN
và COPY
), trong khi các instruction chỉ thêm metadata vào image (Ví dụ: EXPOSE, WORKDIR, ENV
và ENTRYPOINT
). Có thể hiểu là nếu chỉ dẫn thêm nội dung như một file hay một chương trình thì nó sẽ thêm một layer mới, còn nếu chỉ dẫn chỉ thêm các chỉ dẫn để build image thì nó sẽ tạo các metadata.docker image history
.
```bash
$ docker image history web:latest
IMAGE CREATED BY SIZE
c6..18e /bin/sh -c #(nop) ENTRYPOINT [“node” “./a… 0B
334..bf0 /bin/sh -c #(nop) EXPOSE 8080/tcp 0B
b27..eae /bin/sh -c npm install 14.1MB
932..749 /bin/sh -c #(nop) WORKDIR /src 0B
052..2dc /bin/sh -c #(nop) COPY dir:2a6ed1703749e80… 22.5kB
c1d..81f /bin/sh -c apk add –update nodejs nodejs-npm 46.1MB
336..b92 /bin/sh -c #(nop) LABEL maintainer=nigelp… 0B
3fd..f02 /bin/sh -c #(nop) CMD [“/bin/sh”] 0B