目录

一、帮助命令

  • docker version : 查看Docker版本信息
  • docker info : 查看Docker信息
  • docker --help : 查看帮助信息

二、运行第一个容器:hello-world

2.1 运行命令

在命令行中输入以下命令并执行:

docker run hello-world

通过运行 hello-world 镜像来验证 Docker Engine 是否已正确安装。

2.2 命令执行流程图

docker run hello-world 命令执行流程图如下。

三、镜像相关命令及其基本操作

官方文档:https://docs.docker.com/reference/

3.1 登录私有镜像仓库

  • 命令格式docker login [选项] [镜像仓库URL]

以下以阿里云举例:

sudo docker login --username=你的阿里云用户名 registry.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid

3.2 拉取镜像

  • 格式:docker pull [镜像仓库URL]/[命名空间名称]/[仓库名称]:[镜像版本号]

  • 示例 : docker pull docker.io/library/busybox:latest

  • 字段说明

    URL 命名空间 仓库名称 版本号
    docker.io library busybox latest
# docker pull docker.io/library/busybox:latest
latest: Pulling from library/busybox
ea97eb0eb3ec: Pull complete 
Digest: sha256:bde48e1751173b709090c2539fdf12d6ba64e88ec7a4301591227ce925f3c678
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
  • 简化:docker pull busybox:latest (不指定则默认仓库)

  • 可以直接使用docker run,如果本地没有镜像会自动去仓库拉取。

    [root@localhost ~ ]# docker run hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    0e03bdcc26d7: Pull complete 
    Digest: sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323
    Status: Downloaded newer image for hello-world:latest
    ...
    

    下载的时候,我们可以看到有若干层组成,像 0e03bdcc26d7 这样的字符串是层的唯一 ID(实际上,完整的 ID 包括 256 比特, 64 个十六进制字符组成)。使用 docker pull 命令下载中会获取并输出镜像的各层信息。当不同的镜像包括相同的层的时候,本地仅存一份内容,减小存储空间。

3.3 查看镜像基本信息

3.3.1 docker images 命令查看镜像基本信息

使用docker images docker images ls 命令可以列举本地主机上已有镜像的基本信息。

  • 基本用法:docker images [选项] / docker images ls [选项]
[root@Stupidkid ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              219ee5171f80        2 days ago          1.23MB
hello-world         latest              bf756fb1ae65        11 months ago       13.3kB
这些镜像都是存储在 Docker 宿主机的 /var/lib/docker 目录下。
  • 字段说明
REPOSITORY TAG IMAGE ID CREATED SIZE
仓库名称 版本号(又称镜像标签)(latest:表示最新版本) 镜像ID 镜像创建时间到现在 镜像文件的体积

同一仓库源可以有多个”TAG”,代表这个仓库源的不同个版本,我们使用” REPOSITORY:TAG” 来定义不同的镜像

如果你不指定一个镜像的版本标签,例如你只使用”ubuntu”,”docker”将默认使用”ubuntu:latest”镜像

其中镜像的 ID 信息十分重要,它唯一标识了镜像。在使用镜像 ID 的时候,一般可以使用该 ID 的前若干个字符组成的可区分串来替代完整的 ID。

TAG 信息用于标记来自同一个仓库的不同镜像。TAG 在同一个仓库中是唯一的。

镜像大小信息只是表示了该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存储一份,物理上占用 的存储空间会小于各镜像逻辑体积之和。

(一)、docker images命令常用选项

-a : 显示所有的镜像(包括临时镜像文件)
[root@Stupidkid ~]# docker images -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              219ee5171f80        2 days ago          1.23MB
hello-world         latest              bf756fb1ae65        11 months ago       13.3kB

-q : 只显示镜像ID
[root@Stupidkid ~]# docker images -q
219ee5171f80
bc9a0695f571
bf756fb1ae65
--digests : 显示镜像再要信息
[root@Stupidkid ~]# docker images --digests
REPOSITORY          TAG                 DIGEST                                                                    IMAGE ID            CREATED             SIZE
busybox             latest              sha256:bde48e1751173b709090c2539fdf12d6ba64e88ec7a4301591227ce925f3c678   219ee5171f80        2 days ago          1.23MB
nginx               latest              sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3   bc9a0695f571        11 days ago         133MB
hello-world         latest              sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323   bf756fb1ae65        11 months ago       13.3kB

–digests=true | false:列出镜像的数字摘要值
[root@Stupidkid ~]# docker images --digests=true
REPOSITORY          TAG                 DIGEST                                                                    IMAGE ID            CREATED             SIZE
busybox             latest              sha256:bde48e1751173b709090c2539fdf12d6ba64e88ec7a4301591227ce925f3c678   219ee5171f80        2 days ago          1.23MB
nginx               latest              sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3   bc9a0695f571        11 days ago         133MB
hello-world         latest              sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323   bf756fb1ae65        11 months ago       13.3kB
[root@Stupidkid ~]# docker images --digests=false
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              219ee5171f80        2 days ago          1.23MB
nginx               latest              bc9a0695f571        11 days ago         133MB
hello-world         latest              bf756fb1ae65        11 months ago       13.3kB

--no-trunc : 显示完整的镜像信息
[root@Stupidkid ~]# docker images --no-trunc
REPOSITORY          TAG                 IMAGE ID                                                                  CREATED             SIZE
busybox             latest              sha256:219ee5171f8006d1462fa76c12b9b01ab672dbc8b283f186841bf2c3ca8e3c93   2 days ago          1.23MB
nginx               latest              sha256:bc9a0695f5712dcaaa09a5adc415a3936ccba13fc2587dfd76b1b8aeea3f221c   11 days ago         133MB
hello-world         latest              sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b   11 months ago       13.3kB

3.4 查看镜像详细信息

3.4.1 使用 docker inspect 命令获取镜像的详细信息

使用 docker inspect 命令获取镜像的详细信息,包括 PID、作者、架构等等。

  • 基本格式:docker inspect [镜像ID] / [镜像名称:版本号]

  • 示例:

    nginx:latest  none          
    [root@Stupidkid ~]# docker inspect nginx:latest 
    [
        {
            "Id": "sha256:bc9a0695f5712dcaaa09a5adc415a3936ccba13fc2587dfd76b1b8aeea3f221c",
            "RepoTags": [
                "nginx:latest"
            ],
            "RepoDigests": [
                "nginx@sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3"
            ],
            "Parent": "",
            "Comment": "",
            "Created": "2020-11-25T00:30:19.011398516Z",
            "Container": "279e6916c4aaaf5d61e468508abd96933f4e48194bd979dc692e0196cde2d59d",
    ...
    

3.4.2 docker inspect 命令选项

-f : 可以使用golang的语言模板语法获取所需信息。
[root@Stupidkid ~]#  docker inspect -f '{{.Id}}' nginx
sha256:bc9a0695f5712dcaaa09a5adc415a3936ccba13fc2587dfd76b1b8aeea3f221c

3.5 为镜像添加tag

为了方便后续工作中使用特定的镜像,还可以使用 docker tag 命令来为本地的镜像添加标签、修改镜像名称和版本号。

  • 格式 : docker tag [原镜像仓库url]/[原镜像命名空间]/[原镜像仓库名称]:[版本号] [新镜像仓库url]/[新镜像命名空间]/[新镜像仓库名称]:[版本号]

    或者如下:

    docker tag [原镜像仓库url]/[原镜像命名空间]/[原镜像仓库名称]:[版本号] \
    					[新镜像仓库url]/[新镜像命名空间]/[新镜像仓库名称]:[版本号]  
    
  • 示例

    [root@Stupidkid ~]# docker tag nginx:latest registry-vpc.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid/nginx:v1
    
    # 修改镜像名与TAG
    [root@Stupidkid ~]#  docker tag nginx:latest nginx_1:v1
    [root@Stupidkid ~]# docker images
    REPOSITORY                                                          TAG                 IMAGE ID            CREATED             SIZE
    busybox                                                             latest              219ee5171f80        2 days ago          1.23MB
    registry.cn-shanghai.aliyuncs.com/python16-shawn/busybox            v1                  219ee5171f80        2 days ago          1.23MB
    nginx                                                               latest              bc9a0695f571        11 days ago         133MB
    nginx_1                                                             v1                  bc9a0695f571        11 days ago         133MB
    registry-vpc.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid/nginx   v1                  bc9a0695f571        11 days ago         133MB
    hello-world                                                         latest              bf756fb1ae65        11 months ago       13.3kB
    
    

修改tag后,源镜像还会存在,ID则为同一个,在删除镜像时若指定的是ID则会删除所有匹配到ID的镜像,若指定的是镜像名称:版本则仅删除指定名称的单个镜像。

3.6 查看镜像构建历史

  • 格式 : docker history [镜像名字:镜像版本号] / [镜像ID]

  • 示例:

    [root@Stupidkid ~]# docker history nginx:latest 
    IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
    bc9a0695f571        11 days ago         /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B                  
    <missing>           11 days ago         /bin/sh -c #(nop)  STOPSIGNAL SIGQUIT           0B                  
    <missing>           11 days ago         /bin/sh -c #(nop)  EXPOSE 80                    0B                  
    <missing>           11 days ago         /bin/sh -c #(nop)  ENTRYPOINT ["/docker-entr…   0B                  
    <missing>           11 days ago         /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7…   1.04kB              
    <missing>           11 days ago         /bin/sh -c #(nop) COPY file:08ae525f517706a5…   1.95kB              
    <missing>           11 days ago         /bin/sh -c #(nop) COPY file:e7e183879c35719c…   1.2kB               
    <missing>           11 days ago         /bin/sh -c set -x     && addgroup --system -…   63.6MB              
    <missing>           11 days ago         /bin/sh -c #(nop)  ENV PKG_RELEASE=1~buster     0B                  
    <missing>           11 days ago         /bin/sh -c #(nop)  ENV NJS_VERSION=0.4.4        0B                  
    <missing>           11 days ago         /bin/sh -c #(nop)  ENV NGINX_VERSION=1.19.5     0B                  
    <missing>           2 weeks ago         /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B                  
    <missing>           2 weeks ago         /bin/sh -c #(nop)  CMD ["bash"]                 0B                  
    <missing>           2 weeks ago         /bin/sh -c #(nop) ADD file:d2abb0e4e7ac17737…   69.2MB           
    

3.7 搜索镜像

3.7.1 docker search 搜索镜像

在 docker 中搜索镜像主要使用 Search 子命令,默认只搜索 Docker Hub 官方镜像仓库中的镜像。

  • 格式 : docker search [所搜索的镜像名称] [选项]

  • 示例:

    [root@Stupidkid ~]# docker search python
    NAME                             DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
    python                           Python is an interpreted, interactive, objec…   5661                [OK]                
    django                           Django is a free web application framework, …   1024                [OK]                
    pypy                             PyPy is a fast, compliant alternative implem…   256                 [OK]                
    nikolaik/python-nodejs           Python with Node.js                             55                                      [OK]
    joyzoursky/python-chromedriver   Python with Chromedriver, for running automa…   54                                      [OK]
    arm32v7/python                   Python is an interpreted, interactive, objec…   53                                      
    circleci/python                  Python is an interpreted, interactive, objec…   41                                      
    centos/python-35-centos7         Platform for building and running Python 3.5…   38                                      
    centos/python-36-centos7         Platform for building and running Python 3.6…   30                                      
    hylang                           Hy is a Lisp dialect that translates express…   28                  [OK]                
    arm64v8/python                   Python is an interpreted, interactive, objec…   24                                      
    centos/python-27-centos7         Platform for building and running Python 2.7…   17                                      
    bitnami/python                   Bitnami Python Docker Image                     10                                      [OK]
    publicisworldwide/python-conda   Basic Python environments with Conda.           6                                       [OK]
    dockershelf/python               Repository for docker images of Python. Test…   5                                       [OK]
    clearlinux/python                Python programming interpreted language with…   4                                       
    d3fk/python_in_bottle            Simple python:alpine completed by Bottle+Req…   4                                       [OK]
    i386/python                      Python is an interpreted, interactive, objec…   3                                       
    centos/python-34-centos7         Platform for building and running Python 3.4…   2                                       
    ppc64le/python                   Python is an interpreted, interactive, objec…   2                                       
    amd64/python                     Python is an interpreted, interactive, objec…   1                                       
    saagie/python                    Repo for python jobs                            0                                       
    s390x/python                     Python is an interpreted, interactive, objec…   0                                       
    ccitest/python                   CircleCI test images for Python                 0                                       [OK]
    openshift/python-33-centos7      DEPRECATED: A Centos7 based Python v3.3 imag…   0                                       
    
    
  • 字段说明:

    • NAME:镜像名称
    • DESCRIPTION:镜像描述
    • STARS:用户评价,反映一个镜像的受欢迎程度(收藏个数)
    • OFFICIAL:是否为官方构建
    • AUTOMATED:自动构建,表示该镜像由 Docker Hub 自动构建流程创建的。

3.7.2 docker search命令常用选项

-f :过滤
# 搜索被收藏超过 300 个的并且关键词包括 Python 的镜像
docker search -f stars=300 python

# 搜索官方提供的带有 Redis 关键字的镜像
docker search -f is-official=true redis
NAME        DESCRIPTION              STARS            OFFICIAL            AUTOMATED
redis      Redis is an open source key-value store that…   8792                [OK]
-s :列出搜藏不小于指定值的镜像
  • 示例:docker search python -s 300
--automated : 只列出 automated build 类型的镜像
  • 示例:docker search python --automated
--limit : 限制输出结果
–no-trunc: 不截断输出结果

3.8 删除镜像

3.8.1 使用docker rmi命令删除镜像

使用docker rmi命令,相当于docker image rm命令。

  • 格式 : docker rmi [镜像名称:版本号] / [镜像ID]

示例:

[root@Stupidkid ~]# docker images
REPOSITORY                                                          TAG                 IMAGE ID            CREATED             SIZE
busybox                                                             latest              219ee5171f80        2 days ago          1.23MB
registry.cn-shanghai.aliyuncs.com/python16-shawn/busybox            v1                  219ee5171f80        2 days ago          1.23MB
nginx                                                               latest              bc9a0695f571        11 days ago         133MB
nginx_1                                                             v1                  bc9a0695f571        11 days ago         133MB
registry-vpc.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid/nginx   v1                  bc9a0695f571        11 days ago         133MB
hello-world                                                         latest              bf756fb1ae65        11 months ago       13.3kB
[root@Stupidkid ~]# docker rmi nginx:v1
Error: No such image: nginx:v1
[root@Stupidkid ~]# docker images
REPOSITORY                                                          TAG                 IMAGE ID            CREATED             SIZE
busybox                                                             latest              219ee5171f80        2 days ago          1.23MB
registry.cn-shanghai.aliyuncs.com/python16-shawn/busybox            v1                  219ee5171f80        2 days ago          1.23MB
nginx                                                               latest              bc9a0695f571        11 days ago         133MB
nginx_1                                                             v1                  bc9a0695f571        11 days ago         133MB
registry-vpc.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid/nginx   v1                  bc9a0695f571        11 days ago         133MB
hello-world                                                         latest              bf756fb1ae65        11 months ago       13.3kB

(一)、docker rmi命令选项
-f : 强制删除。镜像已经运行为容器则无法删除,可以使用-f强制删除。

示例:删除单个

[root@localhost ~ ]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
9bf5ef44a314        nginx               "/docker-entrypoint.…"   51 minutes ago      Up 51 minutes       0.0.0.0:32770->80/tcp   funny_northcutt
[root@localhost ~ ]# docker rmi nginx:latest
Error response from daemon: conflict: unable to remove repository reference "nginx:latest" (must force) - container b1bc639c450e is using its referenced image bc9a0695f571
[root@localhost ~ ]# docker rmi -f nginx:latest
Untagged: nginx:latest
[root@localhost ~ ]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx_2             v1                  2c45f814f15b        38 minutes ago      131MB
<none>              <none>              bc9a0695f571        7 days ago          133MB

删除多个:

  • docker rmi -f [镜像名1:TAG] [镜像名2:TAG]...

删除全部:

  • docker rmi -f $(docker images -qa)

3.9 清理镜像

使用一段时间之后,docker 会产生很多临时镜像文件,以及一些没有被使用的镜像, 我们可以通过 docker image prune 命令来进行清理。

  • 格式:docker image prune [选项]
docker image prune命令选项
  • -a:清理所有没有当前使用的镜像,不仅是临时镜像。
  • -f: 强制删除。等同于rmi删除。

3.10 推送镜像

push将本地镜像推送到网上的个人的私有仓库中,例如阿里云的私有仓库。

  • 格式 : docker push [镜像仓库URL]/[命名空间名称]/[仓库名称]:[版本号]

  • 示例:

    1. 先登录私有仓库。

      docker login --username=“登录名,最好纯英文” 仓库URL
      
      [root@Stupidkid ~]# docker login --username="兴欣工作室" registry.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid
      Password: 
      WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
      Configure a credential helper to remove this warning. See
      https://docs.docker.com/engine/reference/commandline/login/#credentials-store
      
      Login Succeeded
      
      
    2. 将镜像改名

      # 私有仓库名最好设置为镜像名,在私有仓库内只能查看版本,而没有镜像名。
      docker tag 本地镜像名 [镜像仓库URL]/[命名空间名称]/[仓库名称]:[版本号]
      
    3. 推送镜像,push一次只能推送一个镜像。

      [root@Centos7 docker]# docker push registry.cn-hangzhou.aliyuncs.com/alvinos/py15-nginx:1.19.2
      The push refers to repository [registry.cn-hangzhou.aliyuncs.com/alvinos/py15-nginx]
      908cf8238301: Pushed 
      eabfa4cd2d12: Pushed 
      60c688e8765e: Pushed 
      f431d0917d41: Pushed 
      07cab4339852: Pushed 
      1.19.2: digest: sha256:794275d96b4ab96eeb954728a7bf11156570e8372ecd5ed0cbc7280313a27d19 size: 1362
      

3.11 构建镜像

构建镜像一般有三种情况,基于容器导入、基于本地模板导入、基于 Dockerfile 创建,本节主讲基于容器保存镜像和本地保存镜像文件导入。

1、保存容器为镜像

  • 格式:docker commit [选项] [容器ID] / [容器名称:版本号]
docker commit命令选项
  • -a : 指定作者。
  • -m : 简介。
  • -p : 保存镜像时,容器暂停运行。

示例:

[root@localhost ~ ]# docker commit -a 'chirou' -m 'nginx_demo' -p 50cf6c577510
sha256:94738e2585944aa455e0c3e1bb174fba02dc18ea17135811d1b874ea0beaab7e
[root@localhost ~ ]# docker images
REPOSITORY               TAG             IMAGE ID            CREATED             SIZE
<none>                  <none>           94738e258594       4 seconds ago		 133MB

# 使用inspect查看详细信息。
[root@localhost ~ ]# docker inspect 94738e258594 | grep chirou
        "Author": "chirou",
[root@localhost ~ ]# docker inspect 94738e258594 | grep nginx_demo
        "Comment": "nginx_demo",

2、导入与导出容器

某些时候,需要将容器或镜像保存成文件从一个系统迁移到另外一个系统,此时可以使用 Docker 的导入和导出功能,这也是Docker 自身提供的一个重要特性。导出的文件是一个tar包,可以通过压缩命令进行压缩,然后进行传输。

exportimport 比较
export

export将容器导出到标准输出,可以使用输出重定向或-o选项至文件中。

  • 格式:docker export [容器名或ID] > [文件名称]

  • 示例:将nginx容器导出

    • docker export nginx > export_nginx.tar
import

import 是将export导出的文件导入为镜像,可以自定义导入的镜像名称和版本号。

import虽然可以导入save保存的文件但是导入后无法运行。

  • 格式:docker import [文件名称] [自定义镜像名称]:[版本号]

  • 示例:将上面导出的文件导入

    [root@localhost ~ ]# docker import export_nginx.tar import_nginx:v1
    87b71baffd0c8e5b2b98884caee97a9d3abcee444e9bad10c865db0daaafa024
    
    [root@localhost ~ ]# docker images
    REPOSITORY             TAG              IMAGE ID            CREATED             SIZE
    import_nginx           v1              87b71baffd0c        44 seconds ago      131MB
    nginx                 latest           bc9a0695f571        10 days ago         133MB
    
    # 通过export导出的文件,使用import导入后无法直接运行。
    [root@localhost mnt ]# docker run -d import_nginx:v1
    docker: Error response from daemon: No command specified.
    

可以看到,通过export导出的容器文件,再使用import导入后,SIZE是要比源镜像小的。这是因为export导出的是容器,并没有源镜像的全部内容,比如会丢失构建历史记录和元数据信息等文件,相当于仅保存容器当时的快照状态,这会导致export导出的文件无法直接通过run命令运行,解决方法:

运行时通过-it选项,给容器分配一个伪终端。

docker run -dit import_nginx:v1 sh

推荐使用commit来保存容器,然后再使用save保存,能避免上述问题。

3、导入和导出镜像

save和load

save能将镜像完整的保存下来,包括镜像ID和构建历史。一样可用输出重定向或-o选项保存至tar包中,并且save支持将多个镜像保存至一个tar包中。

格式:

docker save [镜像名或ID ...] > [压缩包名称]
docker save -o [压缩包名称] [镜像名称或ID ...]

实例:

# 不指定版本号则默认为latest,表示最新版。
[root@localhost ~ ]# docker save busybox nginx > box_nginx.tar
[root@localhost ~ ]# ll
-rw-r--r--  1 root root 138553344 12月  5 19:30 box_nginx.tar

load是将save保存的镜像文件载入为镜像。save保存时若使用镜像ID保存镜像,导入时则没有镜像名称,load在导入时也不能自定义镜像名称,可以在导入后使用docker tag命令修改。

格式:

docker load < [压缩包名称]
<相当于-i选项,指定导入的文件,默认是STDIN。

实例:

[root@localhost ~ ]# docker save dc3bacd8b5ea bc9a0695f571 > box_nginx.tar

# 将原镜像删除
[root@localhost ~ ]# docker rmi bc9a0695f571 dc3bacd8b5ea
# 载入镜像
[root@localhost ~ ]# docker load < box_nginx.tar 
Loaded image ID: sha256:bc9a0695f5712dcaaa09a5adc415a3936ccba13fc2587dfd76b1b8aeea3f221c
Loaded image ID: sha256:dc3bacd8b5ea796cea5d6070c8f145df9076f26a6bc1c8981fd5b176d37de843

# 此时ID还是原来的,但tag信息都为none
[root@localhost ~ ]# docker images
<none>              <none>              bc9a0695f571        10 days ago         133MB
<none>              <none>              dc3bacd8b5ea        11 days ago        1.23MB

四、容器常用命令及基本操作

4.1 docker ps查看容器

ps:该子命令能查看当前正在运行的容器

示例:

[root@localhost ~ ]# docker ps
CONTAINER ID     IMAGE     COMMAND     CREATED      STATUS       PORTS           NAMES
b1a13dfe7105    nginx     "/docker-entrypoint.…"   3 seconds ago    Up 2 seconds        0.0.0.0:32774->80/tcp   reverent_maxwell

字段说明:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
容器 ID 所属镜像 命令 创建时间 状态 端口 容器名称

4.1.1 docker ps常用选项

-a: 查看所有容器(包括运行和停止)

docker ps -a

-f:查看停止的容器

docker ps -f status=exited

-q:静默模式,仅显示ID信息

[root@localhost ~ ]# docker ps -aq
b1a13dfe7105

-n:列出最近创建的 n 个容器。

docker ps -n 5

-l : 查看最后一次运行的容器

docker ps -l

inspect

该命令能够查看该容器详细信息

[root@localhost ~ ]# docker inspect b1a13dfe7105
[
    {
        "Id": "b1a13dfe71056d8c02fb90e52a503bbedc60301f62e9c49604fa86c2258fd310",
        "Created": "2020-12-05T12:18:17.241753416Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        。。。省略行。。。

同样支持 -f 选项过滤指定信息。

[root@localhost ~ ]# docker inspect -f '{{.Id}}' b1a13dfe7105
b1a13dfe71056d8c02fb90e52a503bbedc60301f62e9c49604fa86c2258fd310

4.2 查看容器日志

4.2.1 docker logs查看容器日志

  • 格式:docker logs [option] [容器名称或ID]

4.2.2 docker logs命令选项

  • -f:跟踪日志输出。类似tail -f命令。
  • –since:显示某个开始时间的所有日志。
  • -t:显示时间戳。
  • –tail N:仅列出最新N条容器日志。

示例:

[root@localhost ~ ]# docker logs b1a13dfe7105
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf

显示时间戳:

[root@localhost ~ ]# docker logs -t b1a13dfe7105
2020-12-05T12:18:17.500960288Z /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
2020-12-05T12:18:17.500995723Z /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
。。。省略行。。。

仅显示三条日志:

# 仅查看3条日志。
[root@localhost ~ ]# docker logs --tail 3 b1a13dfe7105
192.168.112.1 - - [05/Dec/2020:13:46:53 +0000] "GET /favicon.ico HTTP/1.1" 404 153 "http://192.168.112.129:32775/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0" "-"
192.168.112.1 - - [05/Dec/2020:13:46:54 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0" "-"
192.168.112.1 - - [05/Dec/2020:13:46:55 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0" "-"

查看2020年12月5日之后的日志:

# 日期格式不能错误。
[root@localhost ~ ]# docker logs --since="2020-12-04" b1a13dfe7105
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
。。。省略行。。。

4.3 运行容器

4.3.1 docker run 运行容器

docker run能将一个镜像运行为容器。容器当中至少有一个进程运行在前台。

  • 格式:docker run [选项] [镜像名称|镜像ID] [容器启动后内部执行的命令]

4.3.2 docker run 命令常用选项

-d : 以守护进程的方式运行(在 run 后面加上 -d 参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加 -i -t 两个参数,创建容器后就会自动进容器里))

-p : 指定端口映射前者是宿主机端口,后者是容器内的映射端口。可以使用多个 -p 做多个端口映射。

# 格式
docker run -p 宿主主机端口:容器向外暴露的端口 [镜像名称:tag | 镜像ID]
docker run -d -p 8899:80 nginx:1.19.2

-P : 随机端口映射,随机使用宿主机的可用端口与容器内暴露的端口映射。

docker run -d -P nginx:1.19.2

–name: 指定容器的名称(为创建的容器命名),同一台宿主主机上的docker名称不能重复。

docker run -d --name 自定义容器名 -P nginx:1.19.2

–rm:当一个容器停止后,就立即删除。

docker run -d --rm nginx:1.19.2

-i : 表示运行容器

-t : 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端;通常和-i连用

# 运行容器后执行bash命令。
docker run -ditP nginx bash

-e : 在容器内设置一个环境变量。

docker run -d -e NGINX_NAME=nginx nginx:1.19.2

–network 指定网络模式,下篇再讲docker网络。

–link:链接到另一个容器。

-h:指定容器内的主机名。

-v: 映射存储卷,可以映射文件及文件夹。表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个 -v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上;映射后在宿主机文件内的修改都会映射到容器内的文件中。

docker run -d -v 宿主机文件路径:容器内文件路径 nginx:1.19.2

4.5 目录挂载(容器数据卷操作)

我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器,而且这个操作是双向绑定的,也就是说容器内的操作也会影响到宿主机,实现备份功能。

但是容器被删除的时候,宿主机的内容并不会被删除。如果多个容器挂载同一个目录,其中一个容器被删除,其他容器的内容也不会受到影响。

        容器与宿主机之间的数据卷属于引用的关系,数据卷是从外界挂载到容器内部中的,所以可以脱离容器的生命周期而独立存在,正是由于数据卷的生命周期并不等同于容器的生命周期,在容器退出或者删除以后,数据卷仍然不会受到影响,数据卷的生命周期会一直持续到没有容器使用它为止。

创建容器添加 -v 参数,格式为宿主机目录:容器目录,例如:

docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7
# 多目录挂载
docker run -di -v /宿主机目录:/容器目录 -v /宿主机目录2:/容器目录2 镜像名

目录挂载操作可能会出现权限不足的提示。这是因为 CentOS7 中的安全模块 SELinux 把权限禁掉了,在 docker run 时通过 --privileged=true 给该容器加权限来解决挂载的目录没有权限的问题。

4.5.1 匿名挂载

匿名挂载只需要写容器目录即可,容器外对应的目录会在 /var/lib/docker/volume 中生成。

# 匿名挂载
docker run -di -v /usr/local/data --name centos7-02 centos:7
# 查看 volume 数据卷信息
docker volume ls

4.5.2 具名挂载

具名挂载就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume 中生成。

# 匿名挂载
docker run -di -v docker_centos_data:/usr/local/data --name centos7-03 centos:7
# 查看 volume 数据卷信息
docker volume ls

4.5.3 指定目录挂载

一开始给大家讲解的方式就属于指定目录挂载,这种方式的挂载不会在 /var/lib/docker/volume 目录生成内容。

docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7
# 多目录挂载
docker run -di -v /宿主机目录:/容器目录 -v /宿主机目录2:/容器目录2 镜像名

4.5.4 查看目录挂载关系

通过 docker volume inspect 数据卷名称 可以查看该数据卷对应宿主机的目录地址。

[root@localhost ~]# docker volume inspect docker_centos_data
[
    {
        "CreatedAt": "2020-08-13T20:19:51+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/docker_centos_data/_data",
        "Name": "docker_centos_data",
        "Options": null,
        "Scope": "local"
    }
]

通过 docker inspect 容器ID或名称 ,在返回的 JSON 节点中找到 Mounts,可以查看详细的数据挂载信息。

4.5.5 只读/读写

# 只读。只能通过修改宿主机内容实现对容器的数据管理。
docker run -it -v /宿主机目录:/容器目录:ro 镜像名
# 读写,默认。宿主机和容器可以双向操作数据。
docker run -it -v /宿主机目录:/容器目录:rw 镜像名

4.5.6 volumes-from(继承)

# 容器 centos7-01 指定目录挂载
docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7
# 容器 centos7-04 和 centos7-05 相当于继承 centos7-01 容器的挂载目录
docker run -di --volumes-from centos7-01:ro --name centos7-04 centos:7
docker run -di --volumes-from centos7-01:rw --name centos7-05 centos:7

4.6 退出容器

  • exit : 容器停止退出
  • Ctrl+P+Q : 容器不停止退出

4.7 重启容器

当修改了容器内某些配置文件后,可以使用此命令使配置生效

  • 格式:docker restart [容器名称 | 容器ID]

4.8 启动容器

  • docker start [容器ID / 容器名]

4.9 停止容器

  • docker stop [容器ID / 容器名]
  • docker stop -f $(docker ps -qa) (所有)

4.10 强制停止容器

  • docker kill [容器ID / 容器名]

4.11 刪除已停止的容器

  • docker rm [容器ID]
  • docker rm -f $(docker ps -qa)

4.12 进入容器

在使用容器的过程中,我们难免需要进入容器进行排查问题。下面来介绍进入容器的四种方式。

4.12.1 attach

通过管道,连接容器内PID=1的进程,容器至少有一个进程运行前台。attach 是最早 docker 官方推出的进入容器的命令了,不过使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作,当所有窗口退出时,容器结束。

  • 格式 :docker attach [容器名或ID]

4.12.2 exec(官方推荐使用)

继attach 之后,exec 是官方推出的有一个新的进入容器的命令,这也是目前推荐使用的进入容器的方式。这个命令相当于在容器中执行一个命令。

  • 格式 : docker exec [参数] [容器名或ID] [命令]

示例:

[root@localhost ~ ]# docker exec -it reverent_maxwell sh
用这种方式相当于进入该容器,并且在退出时不会将容器也停止。

4.12.3 nsenter

进入容器中,但不进入容器内的进程。Nsenter 是 Linux 提供的命令。需要配合 docker inspect 来使用(早期没有 exec 命令时,企业当中最长用的方式之一),Docker 是用 golang 语言开发,所以它也支持 go 语言的模板语法。

  • 配合 docker inspect 来使用
  • 格式示例:nsenter –target $( docker inspect -f {{.State.Pid}} nginxv1 ) –mount –uts –ipc –net –pid

4.12.4 ssh

在镜像(或容器) 中安装 SSH Server,这样就能保证多人进入容器且相互之间不受干扰了,相信大家在当前的生产环境中(没有使用 Docker 的情况)也是这样做的。但是使用了 Docker 容器之后不建议使用 ssh 进入到 Docker 容器内。

  • 在容器里面安装一个 sshd 服务

4.12.5 创建并进入容器

下面这行命令的意思就是通过镜像 AA 创建一个容器 BB,运行容器并进入容器的 /bin/bash

docker run -it --name 容器名称 镜像名称:标签 /bin/bash

注意:Docker 容器运行必须有一个前台进程, 如果没有前台进程执行,容器认为是空闲状态,就会自动退出。

4.12.6 守护式方式创建容器

docker run -di --name 容器名称 镜像名称:标签

4.12.7 登录守护式容器方式

docker exec -it 容器名称|容器ID /bin/bash

4.12.8 退出当前容器

exit

4.13 停止与启动容器

# 停止容器
docker stop 容器名称|容器ID
# 启动容器
docker start 容器名称|容器ID

4.14 复制文件

复制命令类似于 Linux 系统中的 scp 命令,是将宿主主机上的内容上传到容器中,也可能是将容器中的文件下载到宿主主机中。

4.14.1 从容器内复制文件到宿主主机

  • 格式:docker cp [容器ID:容器内文件路径] 宿主主机路径

示例

[root@Stupidkid ~]# docker cp d78575358e04:/usr ./
[root@Stupidkid ~]# ll
总用量 919344
-rw-------.  1 root root      1526 11月 13 20:15 anaconda-ks.cfg
-rw-r--r--.  1 root root         0 12月  6 19:47 export_nginx.tar
-rw-r--r--.  1 root root      2340 12月  6 10:05 pic_spider.py
-rw-r--r--.  1 root root 941396992 12月  4 19:40 python3_django.tar
drwxr-xr-x. 10 root root       105 11月 17 08:00 usr

4.14.2 从宿主机复制文件到容器

  • 格式 : docker cp 宿主主机路径 [容器ID:容器内文件路径]

  • 示例:

    [root@Stupidkid ~]# docker cp ./export_nginx.tar d78575358e04:/home
    [root@Stupidkid ~]# docker exec d78575358e04 ls /home
    export_nginx.tar
    

4.15 删除容器

stop命令仅仅是将容器停止,若要删除容器则使用docker rm命令。

格式:

docker rm [option] [镜像名称或ID]

rm能删除已停止的容器,对于正在运行的容器可以使用-f选项强制删除,一般不推荐直接将一个正在运行的容器强制删除。

实例:

# 查看正在运行的容器。
[root@localhost ~ ]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
1a9b4ae8766b        nginx               "/docker-entrypoint.…"   About an hour ago   Up About an hour    0.0.0.0:80->80/tcp   pedantic_hopper
# 直接使用rm无法删除。
[root@localhost ~ ]# docker rm 1a9b4ae8766b
Error response from daemon: You cannot remove a running container 1a9b4ae8766b9266f0e5256df1ac56b9647483815f60b447ae9f15d6c3355dec. Stop the container before attempting removal or force remove
# 使用-f选项可以强制删除。
[root@localhost ~ ]# docker rm -f 1a9b4ae8766b
1a9b4ae8766b

使用docker ps -a与rm和stop命令配合,可以达到一个批量处理容器的方式:

# 停止所有正在运行的容器
docker stop $(docker ps)

# 删除所有容器,包括正在运行的容器
docker rm -f $(docker ps -a)

4.16 查看容器IP地址

我们可以通过以下命令查看容器的元信息。

docker inspect 容器名称|容器ID

也可以直接执行下面的命令直接输出 IP 地址。

docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器ID