docker 學習總結

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

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

1. 註冊 docker 帳號

想要使用docker,先註冊一個docker帳號,註冊docker帳號
註冊完成後,登陸到 docker hub 就能看到本身的 docker 鏡像了,docker hub 是 docker 官方存放 docker 鏡像的倉庫。如個人 hub 下列出了我push的鏡像lxj327460773帳號下的docker鏡像node

2. docker 的安裝

註冊完docker帳號,而後安裝docker:
window 10
Mac OS
window 10 安裝 docker 19.03.2 百度網盤地址
安裝完成後能夠經過命令docker version來查看docker的版本號python

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

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

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

3. image文件

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

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

➜  ~ 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 imagesdocker

➜  ~ 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=trueshell

➜  ~ 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 定義匿名卷

相關文章
相關標籤/搜索