docker 學習總結


Docker 是一個容器工具,提供虛擬環境。解決了軟件的環境配置和依賴問題,讓軟件可以帶環境和依賴的安裝。

Docker 將應用程序與該程序的依賴,打包在一個文件里面。運行這個文件,就會生成一個虛擬容器。程序在這個虛擬容器里運行,就好像在真實的物理機上運行一樣。有了 Docker,就不用擔心環境問題。

1. 注冊 docker 賬號

想要使用docker,先注冊一個docker賬號,注冊docker賬號
注冊完成后,登錄到 docker hub 就能看到自己的 docker 鏡像了,docker hub 是 docker 官方存放 docker 鏡像的倉庫。如我的 hub 下列出了我push的鏡像lxj327460773賬號下的docker鏡像

2. docker 的安裝

注冊完docker賬號,然后安裝docker:
window 10
Mac OS
window 10 安裝 docker 19.03.2 百度網盤地址
安裝完成后可以通過命令docker version來查看docker的版本號

C:\Users\lixinjie>docker version
Client: Docker Engine - Community
 Version:           19.03.2
 API version:       1.40
 Go version:        go1.12.8
 Git commit:        6a30dfc
 Built:             Thu Aug 29 05:26:49 2019
 OS/Arch:           windows/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.2
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.8
  Git commit:       6a30dfc
  Built:            Thu Aug 29 05:32:21 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

出現版本號,證明安裝成功。

下面使用 Mac OS 系統來演示命令,和輸出結果。

3. image文件

docker主要有三部分核心內容,image 文件,容器文件和 Dockerfile 文件。image文件也稱為鏡像。

運行這些 docker 命令行前,需要打開 docker 終端,也就是上一步下載的 docker app。否則將會報錯

➜  ~ docker images
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

3.1. 列出所有 image 文件

  • 列出所有鏡像,不包含中間層鏡像

docker image lsdocker images

➜  ~ docker images
REPOSITORY                                               TAG                       IMAGE ID            CREATED             SIZE
count-web_web                                            latest                    b9f43a85e594        4 days ago          106MB
dockerhub.datagrand.com/datagrand/text_similarity_html   dev_20191022_103543       be10d00a971c        4 days ago          134MB
redis                                                    alpine                    6f63d037b592        4 days ago          29.3MB
python                                                   3.6-alpine                6ddaac33408f        4 days ago          95MB
ubuntu                                                   18.04                     cf0f3ca922e0        7 days ago          64.2MB
  • 上面鏡像只截取了部分
  • REPOSITORY 表示鏡像名
  • TAG 表示鏡像標記,通常是版本號,或者其他可以區別鏡像不同版本的標記
  • IMAGE ID 表示鏡像 ID,鏡像可以通過<REPOSITORY>:<TAG>來識別,也可以通過<IMAGE ID>來識別
  • CREATED 表示這個鏡像制作的時間
  • SIZE 表示這個鏡像的大小
  • 列出所有虛懸鏡像

docker image ls -f dangling=true

➜  ~ docker images -f dangling=true
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
  • 表示沒有虛空鏡像
  • 列出所有鏡像,包含中間層鏡像

docker image ls -adocker images -a

➜  ~ docker images -a
REPOSITORY                                               TAG                       IMAGE ID            CREATED             SIZE
count-web_web                                            latest                    b9f43a85e594        4 days ago          106MB
<none>                                                   <none>                    a1f88c27d11b        4 days ago          106MB
<none>                                                   <none>                    a16622d4261d        4 days ago          95MB
<none>                                                   <none>                    bff6538a770e        4 days ago          95MB
dockerhub.datagrand.com/datagrand/text_similarity_html   dev_20191022_103543       be10d00a971c        4 days ago          134MB
<none>                                                   <none>                    664a0ea6f623        4 days ago          126MB
<none>                                                   <none>                    349fc9312606        4 days ago          134MB
redis                                                    alpine                    6f63d037b592        4 days ago          29.3MB
python                                                   3.6-alpine                6ddaac33408f        4 days ago          95MB
ubuntu                                                   18.04                     cf0f3ca922e0        7 days ago          64.2MB

出現了很多無標簽的鏡像,與之前的虛空鏡像不同,這些無標簽的鏡像很多都是中間層鏡像,是其他鏡像的依賴對象,只要刪除了這些中間層鏡像,這些依賴他們的鏡像也將會被刪除。

  • 列出指定鏡像

docker images <image-name>根據鏡像名來列出鏡像

➜  ~ docker images ubuntu
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               cf0f3ca922e0        7 days ago          64.2MB
ubuntu              latest              2ca708c1c9cc        5 weeks ago         64.2MB
ubuntu              15.10               9b9cb95443b5        3 years ago         137MB
ubuntu              13.10               7f020f7bf345        5 years ago         185MB
  • latest 表示當前最新版本的鏡像

3.2. 刪除指定 image 文件

刪除image文件前,要先刪除容器文件

  • 通過文件名:標簽刪除

docker image rm <image name>:<tag>docker rmi <image name>:<tag>

標簽名缺省是latest,如果標簽名是latest,則不用添加標簽名

docker rmi <image name>:latest 等價於 docker rmi <image name>

➜  ~ docker image rm ubuntu:13.10
Untagged: ubuntu:13.10
Untagged: ubuntu@sha256:403105e61e2d540187da20d837b6a6e92efc3eb4337da9c04c191fb5e28c44dc
Deleted: sha256:7f020f7bf34554411031ec0d4f2ab46a2976dad403e1c26bc21dc1bf4c48c8aa
Deleted: sha256:2aac093d13faafda4d0da3534d30274bcc4e5475b1e126c84b9d670862f5e4ef
Deleted: sha256:c676fe3dd3ceb6442e8b23350de88adc6546a52f75bd92dbb1a789b7c6de0fcf
Deleted: sha256:7c6a37fb8fe6a41aaf7c6c7a2cc3d448c01df026b2056a9f35e490e7bf6285cc
Deleted: sha256:b0e8be8278c28daa541ad564fc91dbea99263caa6e5e68db033061c5e08f0315
Deleted: sha256:78dcbd700c6678a7af4422e0ad516628852973a255526f4b617f33db218e1075
Deleted: sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef
  • Untagged,刪除鏡像是會先將滿足我們要求的所有鏡像標簽都取消
  • Deleted,該鏡像的所有的標簽都被取消了,該鏡像就失去了存在的意義,因此會觸發刪除行為。鏡像是多層存儲結構,因此刪除的時候也是從上層向基礎層依次進行判斷刪除。並且給出了完整的sha256的摘要
  • 通過文件ID刪除

docker image rm <image ID>docker rmi <image ID>

➜  ~ docker image rm cf0f3ca922e0
Untagged: ubuntu:18.04
Untagged: ubuntu@sha256:a7b8b7b33e44b123d7f997bd4d3d0a59fafc63e203d17efedf09ff3f6f516152
Deleted: sha256:cf0f3ca922e08045795f67138b394c7287fbc0f4842ee39244a1a1aaca8c5e1c
Deleted: sha256:c808877c0adcf4ff8dcd2917c5c517dcfc76e9e8a035728fd8f0eae195d11908
Deleted: sha256:cdf75cc6b4d28e72a9931be2a88c6c421ad03cbf984b099916a74f107e6708ff
Deleted: sha256:b9997ded97a1c277d55be0d803cf76ee6e7b2e8235d610de0020a7c84c837b93
Deleted: sha256:a090697502b8d19fbc83afb24d8fb59b01e48bf87763a00ca55cfff42423ad36

刪除了 ubuntu TAG 為 18.04 的鏡像,之后在列出 ubuntu 鏡像,就沒有這個鏡像了。

➜  ~ docker images ubuntu
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              2ca708c1c9cc        5 weeks ago         64.2MB
ubuntu              15.10               9b9cb95443b5        3 years ago         137MB
ubuntu              13.10               7f020f7bf345        5 years ago         185MB

3.3. 抓取 image 文件

docker pull <image name>docker image pull <image name>

抓取剛刪除的 ubuntu:13.10 鏡像。

➜  ~ docker pull ubuntu:13.10
13.10: Pulling from library/ubuntu
[DEPRECATION NOTICE] registry v2 schema1 support will be removed in an upcoming release. Please contact admins of the docker.io registry NOW to avoid future disruption.
a3ed95caeb02: Pull complete
0d8710fc57fd: Pull complete
5037c5cd623d: Pull complete
83b53423b49f: Pull complete
e9e8bd3b94ab: Pull complete
7db00e6b6e5e: Pull complete
Digest: sha256:403105e61e2d540187da20d837b6a6e92efc3eb4337da9c04c191fb5e28c44dc
Status: Downloaded newer image for ubuntu:13.10
docker.io/library/ubuntu:13.10
  • 默認抓取的地址是官方的 hub,docker hub,官方存放鏡像的位置默認在 library 目錄下
  • 在抓取的時候,先有一個下載的過程,鏡像是多層存儲所構成,分層下載,並非單一文件,下載過程中給出了每一層的前 12 位 ID
  • 下載結束后,顯示 pull complete,並給出該鏡像的完整 sha256摘要

3.4. 運行 image 文件

  • 通過文件名運行

docker run <image name>:<tag>docker container run <image name>:<tag>

如果文件名不加標簽,會使用 latest 標簽

docker run <image name>等價於docker run <image name>:latest

➜  ~ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

運行最簡單的 hello-world, 運行完之后,自動停止了。

  • 通過文件ID運行

docker run <image ID>docker container run <image ID>

3.5. 創建 image 文件

docker image build

docker image build -t <image name>:<tag> .
-t 指定 image 文件,最后的 . 表示上下文環境,Dockerfile 在當前路徑

docker build -t dockerhub.datagrand.com/datagrand/text_similarity_html:dev_${TIMENOW} -f docker/Dockerfile .
  • 上面鏡像名字中包含了鏡像存儲的地址,還包含了${TIMENOW}這個是一個變量,表示當前時間 TIMENOW=date +%Y%m%d_%H%M%S
  • -f 表示過濾條件

3.6. 發布 image 文件

當 image 文件創建成功后,就可以把它 push 到 hub 上,供其他人使用了。
首先登錄 hub,不指定 hub 時,將會登錄到 docker hub。

➜  ~ docker login dockerhub.datagrand.com
Username: lxj327460773
Password:
  • 登錄到 dockerhub.datagrand.com
  • 沒有帶參數時,會單獨要求輸入 Username 和 Password
  • 登錄成功后會顯示 Login Succeeded

可以帶參數登錄,一次性輸入賬號和密碼

➜  ~ docker login dockerhub.datagrand.com -u lixinjie@datagrand.com -p <password>
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded

不過這樣不安全,因為直接把密碼明文顯示了,所以才會提示“通過CLI使用密碼是不安全的”。

登錄成功后,可以 psuh 到 hub 了。

docker push dockerhub.datagrand.com/datagrand/text_similarity_html:dev_${TIMENOW}

完成發布后,可以退出。

➜  ~ docker logout dockerhub.datagrand.com
Removing login credentials for dockerhub.datagrand.com
WARNING: could not erase credentials: error erasing credentials - err: exit status 1, out: `error erasing credentials - err: exit status 1, out: `The specified item could not be found in the keychain.`

退出成功后會提示“刪除登錄憑證”。

4. 容器文件(container)

容器的實質是進程,容器進程運行於屬於自己的獨立的命名空間。容器也是分層存儲,每一個容器運行時,是以鏡像為基礎層,在其上創建一個當前容器的存儲層。

4.1. 列出容器文件

  • 列出正在運行的容器文件

docker container lsdocker ps

➜  ~ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
667e9e3802fb        nginx               "nginx -g 'daemon of…"   15 minutes ago      Up 15 minutes       80/tcp              vigilant_ardinghelli
  • CONTAINER ID 表示容器 ID
  • IMAGE 表示運行的鏡像,鏡像和容器的關系,就像是面向對象程序設計中實例一樣,鏡像是靜態的定義,容器是運行時的實體
  • CREATED 表示運行的時間
  • STATUS UP表示運行
  • PORTS 表示可以通過指定的端口號來訪問
  • NAMES 表示對鏡像容器的描述
  • 列出所有的容器文件(包括停止運行的容器)

docker ps -adocker ps --alldocker container ls -adocker container ls --all

➜  ~ docker ps -a
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS                      PORTS                  NAMES
abb2922a4208        hello-world            "/hello"                 11 minutes ago      Exited (0) 11 minutes ago                          lucid_gauss
667e9e3802fb        nginx                  "nginx -g 'daemon of…"   16 minutes ago      Up 16 minutes               80/tcp                 vigilant_ardinghelli
42f7edad7bfd        php                    "docker-php-entrypoi…"   16 minutes ago      Exited (0) 16 minutes ago                          elegant_mestorf
4441f09a1cc1        httpd                  "httpd-foreground"       17 minutes ago      Exited (0) 16 minutes ago                          jolly_agnesi
6a7f573b8164        ubuntu                 "/bin/bash"              4 days ago          Exited (0) 4 days ago                              nervous_pascal
  • COMMAND 表示表示容器啟動后運行的命令
  • STATUS UP表示運行,Exited表示已經停止運行了

4.2. 終止容器文件

  • 通過容器ID終止

docker stop <container ID>docker kill <container ID>docker container stop <container ID>docker container kill <container ID>

➜  ~ docker stop 667e9e3802fb
667e9e3802fb

終止容器會顯示容器 ID。

  • 通過容器名終止

docker stop <container name>docker kill <container name>docker container stop <container name>docker container kill <container name>

4.3. 刪除容器文件

刪除容器前,必須先終止容器

  • 使用容器ID刪除容器

docker rm <container ID>

➜  ~ docker rm 667e9e3802fb
667e9e3802fb

刪除容器也會顯示容器 ID。

  • 使用容器名刪除容器

docker rm <container>

4.4. 生成容器

docker container run

攜帶一些參數指明容器運行的端口和啟動后執行的命令,如:

docker container run -p 8000:3000 -it <image name>:<tag> /bin/bash

  • -p參數:容器的 3000 端口映射到本機的 8000 端口。
  • -it參數:容器的 Shell 映射到當前的 Shell,然后你在本機窗口輸入的命令,就會傳入容器。
  • /bin/bash:容器啟動以后,內部第一個執行的命令。這里是啟動 Bash,保證用戶可以使用 Shell。
➜  ~ docker images koa-demos
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
koa-demos           v1                  0e9ae611c443        10 days ago         675MB

➜  ~ docker container run -p 8000:3000 -it koa-demos:v1 /bin/bash
root@4e165e3a70a7:/app# pwd
/app
root@4e165e3a70a7:/app# ls
Dockerfile  README.md  demos  logo.png	node_modules  package-lock.json  package.json
root@4e165e3a70a7:/app#

我先查找了我的鏡像,然后運行了它,並啟動了 bash,保證了 shell 命令可用。

5. Dockerfile文件

Dockerfile 中的每一條指令都會建立一個層。

FROM nginx:stable
RUN mkdir -p web/logs
COPY docker/nginx.conf /etc/nginx/conf.d/default.conf
COPY dist web/dist
EXPOSE 80

如上的 Dockerfile 文件中

  • FROM 指定基礎鏡像為 nginx,版本為 stable
  • RUN 運行命令,新創建文件夾 web,並在其下創建文件logs
  • COPY 把 docker 下的 nginx.conf 文件,和 dist 文件夾拷貝到指定位置,這里因為項目使用的 angular 所以,build 之后的文件就存儲在 dist 目錄下
  • EXPOSE 申明容器使用 80 端口

5.1.FROM指定基礎鏡像

基礎鏡像必須指定,FROM指令指定基礎鏡像,因此一個 Dockerfile 文件中 FROM 是必備指令,而且是第一個指令。

FROM scratch指定一個空白鏡像,scratch 不以任何鏡像為基礎,接下來寫的指令將作為鏡像第一層開始存在。

5.2. RUN執行命令行

  • RUN 是用來執行命令行命令的指令

5.3. COPY復制文件

COPY指令將從構建上下文中目錄中<原路徑>的文件/目錄復制到新一層鏡像的的<目標路徑>位置

5.4. ADD更高級的復制文件

僅在需要自動解壓縮的情況下才使用ADD指令,如果只是復制文件就使用COPY指令

5.5. CMD容器啟動命令

用於指定默認的容器主進程的啟動命令

5.6. EXPOSE聲明容器使用端口

-p <宿主端口>:<容器端口>

  • -p,是映射宿主端口和容器端口,換句話說,就是將容器的對應端口服務公開給外界訪問
  • EXPOSE 僅僅是聲明容器打算使用什么端口而已,並不會自動在宿主進行端口映射。

5.7. ENTRYPOINT入口點

5.8. WORKDIR指定工作目錄

5.9. VOLUME 定義匿名卷


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM