Docker系列(二):镜像和容器的操作

Docker的命令主要围绕镜像容器来进行操作,另外就是查看Docker信息的命令操作。参考官方文档-CN, 官方文档-EN

Docker信息

查看Docker详细信息

该命令可以查看Docker的详细信息,如容器数量、运行中的数量、暂停的数量、停止的数量;镜像量;服务器版本 等等。

docker info

查看Docker版本

显示Docker客户端和服务器的版本信息。

docker version

操作镜像

搜索镜像

  1. 语法和示例

    语法:TERM 指要搜索的目标
    docker search TERM
    示例:
    docker search tomcat

  2. 参数

    -f - -filter # 输出过滤

    is-automated=true|false //仅显示自动创建的镜像,默认否。
    stars=X //仅显示指定星级及以上的镜像,默认为0,即输出所有。

    带参搜索示例:
    docker search -f is-automated=true -f stars=10 tomcat

拉取镜像

  1. 语法和示例
    一个镜像需要包括名称+标签name是镜像仓库名称;Tag是镜像的标签,一般用来表示版本信息。如果不显示指定Tag,则默认会选择latest标签,即最新版本的镜像,但可能是非稳定版本。Tag需要在仓库网站(docker hub阿里容器HubDaoCloud)去中查看,搜索镜像并不能看到镜像的版本号。
    下载镜像默认是使用Docker Hub服务,仓库地址是:registry.hub.docker; 也可以添加其它仓库地址从指定仓库下载。

    语法:
    docker pull name[:Tag]
    示例:
    docker pull tomcat:8.0
    **从指定仓库下载:**从阿里容器 Hub 下载
    docker pull registry.cn-zhangjiakou.aliyuncs.com/cytong/redis
    docker pull daocloud.io/library/redis:3.2.9

查看镜像

  1. docker images
    docker images 可以列出本机上已有镜像的基本信息,包括来自于那个仓库、镜像标签、镜像 ID、创建时间和镜像大小。
    基中镜像ID是镜像的唯一标识

    语法:默认是列出所有的镜像文件,等于带-a参数。
    docker images

    更多参数及使用,可通过docker images --helpman docker-images来查看。

  2. docker tag
    docker tag 为本地镜像添加定制标签,再查看时会存在2份,一份是原生的镜像,另一份是添加定制标签的镜像,但实际上指向同一个镜像文件,镜像的 ID 是相同的,添加标签相当于类似链接的作用。

    示例:
    docker tag redis:latest myredis:latest

  3. docker inspect
    docker inspect命令镜像的详细信息,包括制作者,创建时间,容器配置信息,各层数据摘要等等。

    示例:
    docker inspect redis
    docker inspect daocloud.io/library/redis:3.2.9

  4. docker history
    docker history命令查看镜像历史,可以查看镜像各层的创建信息。

    示例:
    docker history redis
    docker history daocloud.io/library/redis:3.2.9

  5. docker run images_name env
    docker run images_name env调用 env 查看镜像的环境变量。

    docker run ubuntu env

删除镜像

docker rmi可以删除镜像,删除镜像有两种方式。

  1. 根据标签删除镜像:当镜像只有一个标签时,该命令是彻底删除镜像,删除镜像的所有层。当一个镜像有多个标签时,该命令只是删除该镜像指定的标签,并不影响镜像文件。

  2. 根据镜像唯一ID删除镜像:当此 ID 的镜像只有一个标签时,则彻底删除该镜像;当有多个标签时,则会报存在多个引用的错误,可以使用-f来强行删除。

    删除有容器正常运行的镜像,同样使用-f来强制删除,但一般不推荐这么使用,容易出现人为的操作错误就麻烦了,推荐先停止容器,再删除容器,再删除镜像。

    语法:
    docker rmi REPOSITORY[:TAG] | IMAGE_ID
    示例:
    使用标签删除镜像
    docker rmi redis:latest
    使用镜像ID删除镜像
    docker rmi c5355f8853e4
    强行删除镜像(可删除多个标签或有容器正在运行的镜像)
    docker rmi -f c5355f8853e4

创建镜像

创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。
详细见Docker:创建镜像文章。

导出镜像

docker save命令导出镜像到本地文件,这样该镜像就可复制共享了。

语法:
docker save -o xxx.rar REPOSITORY[:TAG] | IMAGE_ID
示例:
docker save -o redis.rar 3459037fcc3a
docker save -o redis_3.2.9.rar daocloud.io/library/redis:3.2.9

载入镜像

docker load将导出的镜像tar文件再导入到本地镜像库。

示例:
docker load < redis_3.2.9.rar
docker load - -input redis_3.2.9.rar //input前面是个-
可以使用docker images查看镜像列表是否有导入的镜像。

上传镜像

docker pust命令上传镜像到仓库,默认上传到Docker Hub官方仓库,需要先注册官方仓库的账号。

语法:
docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
示例:
docker tag test:latest user/test:latest
docker push user/test:latest
第一次上传时,会提示输入登录入信息。

操作容器

查看容器

docker ps命令可查看本机存在的容器。

语法:
docker ps [OPTIONS]

**- - a, -a:**显示所有容器,包括未运行的。
**- -latest, -l:**显示最近创建的容器。
**- -last, -n:**显示最近创建的 n 个容器, 默认是 -1。
**- -quiet, -q:**只显示最近运行的容器ID。
**- -size, -s:**显示容器总的文件大小。

示例
docker ps //默认只显示正在运行的容器
docker ps -a
docker ps -n 2

创建容器

docker create从镜像中新建一个容器,然后使用docker start来启动容器。

创建并启动

docker run可以直接新建并启动容器,等价于选执行docker create命令,再扫许docker start命令。该命令使用最多。
使用该命令来创建并启动容器,Docker会在后台进行一系列的操作:

  1. 检查本地是否存在指定镜像,不存在则从公有仓库下载。
  2. 利用镜像创建容器,并启动该容器。
  3. 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层。
  4. 从宿主主机配置的网桥中接一个虚拟接口到容器中。
  5. 从网桥的地址池配置一个ID地址给容器。
  6. 执行用户指定的应用程序。
  7. 执行完后容器被自动终止。

语法:
docker run - -name myName -d REPOSITORY[:TAG] | IMAGE_ID
示例:
docker run - -name myRedis -d redis
docker run - -name Aredis -d c5355f8853e4
docker run - -name Bredis -d daocloud.io/library/redis:3.2.9
可以通过docker ps命令查看已运行的容器。

docker run命令有很多的参数选项,可通过docker run --helpman docker-run来查看。

启动容器

  1. docker start命令来启动一个已经创建的容器。

    语法:
    docker start CONTAINER_ID
    示例:
    docker start c5355f8853e4
    可以通过docker ps命令查看已运行的容器。

  2. docker logs CONTAINER_ID查看容器输出信息

    示例:
    docker logs c5355f8853e4

端口映射

Docker 容器中运行的软件所使用的端口,在本机和本机的局域网是不能访问的,需要将Docker容器中的端口映射到当前主机的端口上才能访问。
Docker 端口映射通过一个P参数来实现,如下示例:6378是本机的端口,6379是容器的端口。

语法:docker run -d -p 本地端口:容器端口 –name 新名称 镜像名称
示例:docker run -d -p 6378:6379 –name port-redis redis

重启容器

docker restart重启运行中的容器(将运行态的容器先停止,再启动运行)。

示例:
docker restart c5355f8853e4

停止容器

  1. docker stop停止运行中的容器。
    首 先向容器发送SIGTERM信号,等待一段时间(默认是10稍)后,再发送SIGKILL信号来终止容器。

    语法:
    docker stop [-t|- -time[=10]] [CONTAINER_ID]
    示例:
    docker stop c5355f8853e4

  2. docker kill强止停止运行中的容器。

    示例:
    docker kill c5355f8853e4

删除容器

docker rm命令删除处于停止退出状态的容器,不能删除运行态的容器。

语法:
docker rm [-f|- -force] [-l|- -link] [-v|- -volumes] CONTAINER_ID

-f, - -force=false:是否强行停止并删除一个运行中的容器,添加该参数,会先发送SIGKILL信号给容器终止应用,然后强行删除。
-l, - -link=false:删除容器的连接,但保留容器。
-v, - -volumes=false:删除容器挂载擞据卷。

示例:
docker rm c5355f8853e4
docker rm -f c5355f8853e4

进入容器

  1. 使用nsenter工具进入容器
  2. 要查看容器进程的PId,使用如下两条命令
    1
    2
    3
    4
    5
    6
    # 查看容器进程PID
    docker inspect -f '{{.State.Pid}} {{.Id}}' $(docker ps -a -q) | grep CONTAINER_ID
    docker inspect -f "{{.State.Pid}}" d58c5ae4aa70

    # 进入容器
    nsenter --target pid --mount --uts --ipc --net --pid
    解释 nsenter 指令中进程id之后的参数的含义:
  • –mount参数是进去到mount namespace中
  • –uts参数是进入到uts namespace中
  • –ipc参数是进入到System V IPC namaspace中
  • –net参数是进入到network namespace中
  • –pid参数是进入到pid namespace中
  • –user参数是进入到user namespace中

导出容器

当需要将容器在系统之间迁移时,就需要用到导出/导入功能。
导出容器是指导出一个已经创建的容器到一个文件,不管此时该容器是否处于运行状态。

语法:
docker export [-o|- -output[=””]] CONTAINER_ID

-o,- -output:指定导出的tar文件名。
也可以直接通过重定向来实现导出。

示例:
docker export -o redis.tar 713033b38fde
docker export 713033b38fde > myredis.tar //重定向方式

导入容器

docker import将导出的容器文件导入变成镜像。

语法:
docker import [-c|- -change[=[]]] [-m|- -mesage[=MESSAGE]] file|URL|-[REPOSITORY[:TAG]]

-c,- -change:可以在导入的同时执行对容器进行修改的Dockerfile提令。

示例:
docker import redis.tar test/redis:1.0

备注:操作镜像章节就个导入镜像文件的命令docker load,与docker import十分类似。但两者还是有些不同:
docker import:导入容器快照到本地镜像库,会丢弃所有历史记录和元数据信息,难保存容器当前的快照状态,还可以重新指定标签等元数据信息。
docker load:导入镜像存储文件到本地镜像库,镜像存储文件将保存完整记录,体积更大。

容器日志

查看当前容器的日志:

docker logs container-name/container-id

登录容器

运行中的容器其实是一个功能完备的Linux操作系统,可以像常规的系统一样登录并访问容器。

docker exec -it container-id/container-name bash
sudo docker exec -it container-id/container-name /bin/bash

作者

光星

发布于

2018-04-06

更新于

2021-02-05

许可协议

评论