经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Docker » 查看文章
Docker 最常用的镜像命令和容器命令
来源:cnblogs  作者:贾维斯Echo  时间:2024/3/18 15:22:11  对本文有异议

目录

一、帮助命令

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

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

2.1 运行命令

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

  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]

以下以阿里云举例:

  1. 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
  1. # docker pull docker.io/library/busybox:latest
  2. latest: Pulling from library/busybox
  3. ea97eb0eb3ec: Pull complete
  4. Digest: sha256:bde48e1751173b709090c2539fdf12d6ba64e88ec7a4301591227ce925f3c678
  5. Status: Downloaded newer image for busybox:latest
  6. docker.io/library/busybox:latest
  • 简化:docker pull busybox:latest (不指定则默认仓库)

image-20201206103920171

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

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

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

3.3 查看镜像基本信息

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

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

  • 基本用法:docker images [选项] / docker images ls [选项]
  1. [root@Stupidkid ~]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. busybox latest 219ee5171f80 2 days ago 1.23MB
  4. hello-world latest bf756fb1ae65 11 months ago 13.3kB
  5. 这些镜像都是存储在 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 : 显示所有的镜像(包括临时镜像文件)
  1. [root@Stupidkid ~]# docker images -a
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. busybox latest 219ee5171f80 2 days ago 1.23MB
  4. hello-world latest bf756fb1ae65 11 months ago 13.3kB
-q : 只显示镜像ID
  1. [root@Stupidkid ~]# docker images -q
  2. 219ee5171f80
  3. bc9a0695f571
  4. bf756fb1ae65
--digests : 显示镜像再要信息
  1. [root@Stupidkid ~]# docker images --digests
  2. REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
  3. busybox latest sha256:bde48e1751173b709090c2539fdf12d6ba64e88ec7a4301591227ce925f3c678 219ee5171f80 2 days ago 1.23MB
  4. nginx latest sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3 bc9a0695f571 11 days ago 133MB
  5. hello-world latest sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323 bf756fb1ae65 11 months ago 13.3kB
--digests=true | false:列出镜像的数字摘要值
  1. [root@Stupidkid ~]# docker images --digests=true
  2. REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
  3. busybox latest sha256:bde48e1751173b709090c2539fdf12d6ba64e88ec7a4301591227ce925f3c678 219ee5171f80 2 days ago 1.23MB
  4. nginx latest sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3 bc9a0695f571 11 days ago 133MB
  5. hello-world latest sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323 bf756fb1ae65 11 months ago 13.3kB
  6. [root@Stupidkid ~]# docker images --digests=false
  7. REPOSITORY TAG IMAGE ID CREATED SIZE
  8. busybox latest 219ee5171f80 2 days ago 1.23MB
  9. nginx latest bc9a0695f571 11 days ago 133MB
  10. hello-world latest bf756fb1ae65 11 months ago 13.3kB
--no-trunc : 显示完整的镜像信息
  1. [root@Stupidkid ~]# docker images --no-trunc
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. busybox latest sha256:219ee5171f8006d1462fa76c12b9b01ab672dbc8b283f186841bf2c3ca8e3c93 2 days ago 1.23MB
  4. nginx latest sha256:bc9a0695f5712dcaaa09a5adc415a3936ccba13fc2587dfd76b1b8aeea3f221c 11 days ago 133MB
  5. hello-world latest sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b 11 months ago 13.3kB

3.4 查看镜像详细信息

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

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

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

  • 示例:

    1. nginx:latest none
    2. [root@Stupidkid ~]# docker inspect nginx:latest
    3. [
    4. {
    5. "Id": "sha256:bc9a0695f5712dcaaa09a5adc415a3936ccba13fc2587dfd76b1b8aeea3f221c",
    6. "RepoTags": [
    7. "nginx:latest"
    8. ],
    9. "RepoDigests": [
    10. "nginx@sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3"
    11. ],
    12. "Parent": "",
    13. "Comment": "",
    14. "Created": "2020-11-25T00:30:19.011398516Z",
    15. "Container": "279e6916c4aaaf5d61e468508abd96933f4e48194bd979dc692e0196cde2d59d",
    16. ...

3.4.2 docker inspect 命令选项

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

3.5 为镜像添加tag

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

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

    或者如下:

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

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

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

3.6 查看镜像构建历史

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

  • 示例:

    1. [root@Stupidkid ~]# docker history nginx:latest
    2. IMAGE CREATED CREATED BY SIZE COMMENT
    3. bc9a0695f571 11 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
    4. <missing> 11 days ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
    5. <missing> 11 days ago /bin/sh -c #(nop) EXPOSE 80 0B
    6. <missing> 11 days ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B
    7. <missing> 11 days ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB
    8. <missing> 11 days ago /bin/sh -c #(nop) COPY file:08ae525f517706a5… 1.95kB
    9. <missing> 11 days ago /bin/sh -c #(nop) COPY file:e7e183879c35719c… 1.2kB
    10. <missing> 11 days ago /bin/sh -c set -x && addgroup --system -… 63.6MB
    11. <missing> 11 days ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~buster 0B
    12. <missing> 11 days ago /bin/sh -c #(nop) ENV NJS_VERSION=0.4.4 0B
    13. <missing> 11 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.19.5 0B
    14. <missing> 2 weeks ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
    15. <missing> 2 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B
    16. <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 [所搜索的镜像名称] [选项]

  • 示例:

    1. [root@Stupidkid ~]# docker search python
    2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
    3. python Python is an interpreted, interactive, objec 5661 [OK]
    4. django Django is a free web application framework, 1024 [OK]
    5. pypy PyPy is a fast, compliant alternative implem 256 [OK]
    6. nikolaik/python-nodejs Python with Node.js 55 [OK]
    7. joyzoursky/python-chromedriver Python with Chromedriver, for running automa 54 [OK]
    8. arm32v7/python Python is an interpreted, interactive, objec 53
    9. circleci/python Python is an interpreted, interactive, objec 41
    10. centos/python-35-centos7 Platform for building and running Python 3.5 38
    11. centos/python-36-centos7 Platform for building and running Python 3.6 30
    12. hylang Hy is a Lisp dialect that translates express 28 [OK]
    13. arm64v8/python Python is an interpreted, interactive, objec 24
    14. centos/python-27-centos7 Platform for building and running Python 2.7 17
    15. bitnami/python Bitnami Python Docker Image 10 [OK]
    16. publicisworldwide/python-conda Basic Python environments with Conda. 6 [OK]
    17. dockershelf/python Repository for docker images of Python. Test 5 [OK]
    18. clearlinux/python Python programming interpreted language with 4
    19. d3fk/python_in_bottle Simple python:alpine completed by Bottle+Req 4 [OK]
    20. i386/python Python is an interpreted, interactive, objec 3
    21. centos/python-34-centos7 Platform for building and running Python 3.4 2
    22. ppc64le/python Python is an interpreted, interactive, objec 2
    23. amd64/python Python is an interpreted, interactive, objec 1
    24. saagie/python Repo for python jobs 0
    25. s390x/python Python is an interpreted, interactive, objec 0
    26. ccitest/python CircleCI test images for Python 0 [OK]
    27. 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 :过滤
  1. # 搜索被收藏超过 300 个的并且关键词包括 Python 的镜像
  2. docker search -f stars=300 python
  3. # 搜索官方提供的带有 Redis 关键字的镜像
  4. docker search -f is-official=true redis
  5. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  6. 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]

示例:

  1. [root@Stupidkid ~]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. busybox latest 219ee5171f80 2 days ago 1.23MB
  4. registry.cn-shanghai.aliyuncs.com/python16-shawn/busybox v1 219ee5171f80 2 days ago 1.23MB
  5. nginx latest bc9a0695f571 11 days ago 133MB
  6. nginx_1 v1 bc9a0695f571 11 days ago 133MB
  7. registry-vpc.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid/nginx v1 bc9a0695f571 11 days ago 133MB
  8. hello-world latest bf756fb1ae65 11 months ago 13.3kB
  9. [root@Stupidkid ~]# docker rmi nginx:v1
  10. Error: No such image: nginx:v1
  11. [root@Stupidkid ~]# docker images
  12. REPOSITORY TAG IMAGE ID CREATED SIZE
  13. busybox latest 219ee5171f80 2 days ago 1.23MB
  14. registry.cn-shanghai.aliyuncs.com/python16-shawn/busybox v1 219ee5171f80 2 days ago 1.23MB
  15. nginx latest bc9a0695f571 11 days ago 133MB
  16. nginx_1 v1 bc9a0695f571 11 days ago 133MB
  17. registry-vpc.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid/nginx v1 bc9a0695f571 11 days ago 133MB
  18. hello-world latest bf756fb1ae65 11 months ago 13.3kB
(一)、docker rmi命令选项
-f : 强制删除。镜像已经运行为容器则无法删除,可以使用-f强制删除。

示例:删除单个

  1. [root@localhost ~ ]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 9bf5ef44a314 nginx "/docker-entrypoint.…" 51 minutes ago Up 51 minutes 0.0.0.0:32770->80/tcp funny_northcutt
  4. [root@localhost ~ ]# docker rmi nginx:latest
  5. Error response from daemon: conflict: unable to remove repository reference "nginx:latest" (must force) - container b1bc639c450e is using its referenced image bc9a0695f571
  6. [root@localhost ~ ]# docker rmi -f nginx:latest
  7. Untagged: nginx:latest
  8. [root@localhost ~ ]# docker images
  9. REPOSITORY TAG IMAGE ID CREATED SIZE
  10. nginx_2 v1 2c45f814f15b 38 minutes ago 131MB
  11. <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. 先登录私有仓库。

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

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

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

3.11 构建镜像

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

1、保存容器为镜像

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

示例:

  1. [root@localhost ~ ]# docker commit -a 'chirou' -m 'nginx_demo' -p 50cf6c577510
  2. sha256:94738e2585944aa455e0c3e1bb174fba02dc18ea17135811d1b874ea0beaab7e
  3. [root@localhost ~ ]# docker images
  4. REPOSITORY TAG IMAGE ID CREATED SIZE
  5. <none> <none> 94738e258594 4 seconds ago 133MB
  6. # 使用inspect查看详细信息。
  7. [root@localhost ~ ]# docker inspect 94738e258594 | grep chirou
  8. "Author": "chirou",
  9. [root@localhost ~ ]# docker inspect 94738e258594 | grep nginx_demo
  10. "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 [文件名称] [自定义镜像名称]:[版本号]

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

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

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

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

  1. docker run -dit import_nginx:v1 sh

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

3、导入和导出镜像

save和load

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

格式:

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

实例:

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

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

格式:

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

实例:

  1. [root@localhost ~ ]# docker save dc3bacd8b5ea bc9a0695f571 > box_nginx.tar
  2. # 将原镜像删除
  3. [root@localhost ~ ]# docker rmi bc9a0695f571 dc3bacd8b5ea
  4. # 载入镜像
  5. [root@localhost ~ ]# docker load < box_nginx.tar
  6. Loaded image ID: sha256:bc9a0695f5712dcaaa09a5adc415a3936ccba13fc2587dfd76b1b8aeea3f221c
  7. Loaded image ID: sha256:dc3bacd8b5ea796cea5d6070c8f145df9076f26a6bc1c8981fd5b176d37de843
  8. # 此时ID还是原来的,但tag信息都为none
  9. [root@localhost ~ ]# docker images
  10. <none> <none> bc9a0695f571 10 days ago 133MB
  11. <none> <none> dc3bacd8b5ea 11 days ago 1.23MB

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

4.1 docker ps查看容器

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

示例:

  1. [root@localhost ~ ]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 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: 查看所有容器(包括运行和停止)

  1. docker ps -a

-f:查看停止的容器

  1. docker ps -f status=exited

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

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

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

  1. docker ps -n 5

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

  1. docker ps -l

inspect

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

  1. [root@localhost ~ ]# docker inspect b1a13dfe7105
  2. [
  3. {
  4. "Id": "b1a13dfe71056d8c02fb90e52a503bbedc60301f62e9c49604fa86c2258fd310",
  5. "Created": "2020-12-05T12:18:17.241753416Z",
  6. "Path": "/docker-entrypoint.sh",
  7. "Args": [
  8. "nginx",
  9. "-g",
  10. "daemon off;"
  11. 。。。省略行。。。

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

  1. [root@localhost ~ ]# docker inspect -f '{{.Id}}' b1a13dfe7105
  2. 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条容器日志。

示例:

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

显示时间戳:

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

仅显示三条日志:

  1. # 仅查看3条日志。
  2. [root@localhost ~ ]# docker logs --tail 3 b1a13dfe7105
  3. 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" "-"
  4. 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" "-"
  5. 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日之后的日志:

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

4.3 运行容器

4.3.1 docker run 运行容器

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

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

4.3.2 docker run 命令常用选项

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

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

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

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

  1. docker run -d -P nginx:1.19.2

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

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

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

  1. docker run -d --rm nginx:1.19.2

-i : 表示运行容器

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4.5.1 匿名挂载

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

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

/resources/articles/docker/image-20200813201808718.png

4.5.2 具名挂载

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

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

/resources/articles/docker/image-20200813202118346.png

4.5.3 指定目录挂载

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

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

4.5.4 查看目录挂载关系

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

  1. [root@localhost ~]# docker volume inspect docker_centos_data
  2. [
  3. {
  4. "CreatedAt": "2020-08-13T20:19:51+08:00",
  5. "Driver": "local",
  6. "Labels": null,
  7. "Mountpoint": "/var/lib/docker/volumes/docker_centos_data/_data",
  8. "Name": "docker_centos_data",
  9. "Options": null,
  10. "Scope": "local"
  11. }
  12. ]

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

/resources/articles/docker/image-20200813203856160.png

4.5.5 只读/读写

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

4.5.6 volumes-from(继承)

  1. # 容器 centos7-01 指定目录挂载
  2. docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7
  3. # 容器 centos7-04 和 centos7-05 相当于继承 centos7-01 容器的挂载目录
  4. docker run -di --volumes-from centos7-01:ro --name centos7-04 centos:7
  5. 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] [命令]

示例:

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

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

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

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

4.12.6 守护式方式创建容器

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

4.12.7 登录守护式容器方式

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

4.12.8 退出当前容器

  1. exit

4.13 停止与启动容器

  1. # 停止容器
  2. docker stop 容器名称|容器ID
  3. # 启动容器
  4. docker start 容器名称|容器ID

4.14 复制文件

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

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

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

示例

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

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

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

  • 示例:

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

4.15 删除容器

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

格式:

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

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

实例:

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

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

  1. # 停止所有正在运行的容器
  2. docker stop $(docker ps)
  3. # 删除所有容器,包括正在运行的容器
  4. docker rm -f $(docker ps -a)

4.16 查看容器IP地址

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

  1. docker inspect 容器名称|容器ID

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

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

原文链接:https://www.cnblogs.com/taoxiaoxin/p/18080487

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号