文章目录
0. 前言
- 本文内容主要包括
- image(镜像)相关概念以及基本操作
- container(容器)相关概念以及基本操作
- 容器(Container)与镜像(Image)的基本概念
- Image 是由若干只读(read-only)的layer组成的
- 每个 Container 的本质就是在一系列 Image 的基础上添加一个读写层
- 一个正在运行的 Contrainer 包含镜像、读写层、隔离的进程空间以及对应的进程
- 下图对比了容器与镜像,出自这里
1. Image 相关命令
- 参考资料:
- 相关基本概念
- Image 的唯一标识是 Image ID。
- 每个镜像可以对应多个TAG。
- 镜像如果没有TAG,很可能标识该镜像没有什么用了。
- 命令分类
- 仓库相关命令:
search/pull/push
- 本地镜像管理命令:
ls/rm/prune/build
等
- 仓库相关命令:
1.1 与镜像仓库相关命令
- 搜索镜像:docker search
- 在 docker hub 搜索别人已经上传了的镜像。
- 命令形式:
docker search [OPTIONS] TERM
- 主要参数(Docs)
-
--no-trunc
:显示镜像的完整描述 -
-f
:可以指定一些条件,过滤搜索结果,比如 starts,详情参考Docs -
--limit
:限制显示数量,默认25 -
--format
:格式化输出
-
- 返回结果:主要包括
NAME/DESCRIPTION/STARS/OFFICIAL/AUTOMATED
五个字段,分别表示镜像仓库名称、镜像描述、start数量、是否是docker官方出品、是否是自动构建。- 其实我不太懂“自动构建镜像”是什么,看了文档也没看懂
- 举例如下
runoob@runoob:~$ docker search -f stars=10 java
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
java Java is a concurrent, class-based... 1037 [OK]
anapsix/alpine-java Oracle Java 8 (and 7) with GLIBC ... 115 [OK]
develar/java 46 [OK]
isuper/java-oracle This repository contains all java... 38 [OK]
lwieske/java-8 Oracle Java 8 Container - Full + ... 27 [OK]
nimmis/java-centos This is docker images of CentOS 7... 13 [OK]
- 下载镜像:docker pull / docker image pull
- 从 docker hub 或其他仓库下载镜像
- 命令形式:
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
- 注意,所谓TAG就是对应的版本。如果不指定,那就下载最新版本。
- 主要参数:
-
-a
:获取所有镜像
-
- 举例如下
$ docker pull debian:jessie
jessie: Pulling from library/debian
fdd5d7827f33: Already exists
a3ed95caeb02: Already exists
Digest: sha256:a9c958be96d7d40df920e7041608f2f017af81800ca5ad23e327bc402626b58e
Status: Downloaded newer image for debian:jessie
- 上传镜像:docker push / docker image push
- 将本地镜像上传到仓库(需要先登录)
- 主要参数:
-
--all-tags
:将所有tag都上传
-
- 形式:
docker push [OPTIONS] NAME[:TAG]
- 举例
$ docker image push --all-tags registry-host:5000/myname/myimage
The push refers to repository [registry-host:5000/myname/myimage]
195be5f8be1d: Pushed
latest: digest: sha256:edafc0a0fb057813850d1ba44014914ca02d671ae247107ca70c94db686e7de6 size: 4527
195be5f8be1d: Layer already exists
v1: digest: sha256:edafc0a0fb057813850d1ba44014914ca02d671ae247107ca70c94db686e7de6 size: 4527
195be5f8be1d: Layer already exists
v1.0: digest: sha256:edafc0a0fb057813850d1ba44014914ca02d671ae247107ca70c94db686e7de6 size: 4527
195be5f8be1d: Layer already exists
v1.0.1: digest: sha256:edafc0a0fb057813850d1ba44014914ca02d671ae247107ca70c94db686e7de6 size: 4527
1.2 本地镜像管理
- 查看本地镜像:docker images / docker image ls
- 形式:
docker images [OPTIONS] [REPOSITORY[:TAG]]
- 可以不指定
REPOSITORY
,这样就是显示本地所有 - 也可以通过镜像名称来查看
- 可以不指定
- 参数与 search 类似
-
-a, --all
:限制显示数量,默认25 -
--no-trunc
:显示镜像的完整描述 -
-f
:可以指定一些条件,过滤搜索结果,比如 starts,详情参考Docs -
--format
:格式化输出 -
--quiet , -q
:只显示ID不显示其他信息
-
- 结果包括
REPOSIROTY/TAG/IMAGE ID/CREATED/SIZE
五个字段,都是顾名思义。 - 举例如下:
- 形式:
runoob@runoob:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mymysql v1 37af1236adef 5 minutes ago 329 MB
runoob/ubuntu v4 1c06aa18edee 2 days ago 142.1 MB
<none> <none> 5c6e1090e771 2 days ago 165.9 MB
httpd latest ed38aaffef30 11 days ago 195.1 MB
alpine latest 4e38e38c8ce0 2 weeks ago 4.799 MB
mongo 3.2 282fd552add6 3 weeks ago 336.1 MB
redis latest 4465e4bcad80 3 weeks ago 185.7 MB
...
root@runoob:~# docker images ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 90d5884b1ee0 9 weeks ago 188 MB
ubuntu 15.10 4e3b13c8a266 3 months ago 136.3 MB
-
删除镜像:docker rmi / docker image rm
-
命令形式:
docker rmi [OPTIONS] IMAGE [IMAGE...]
- 所谓的 IMAGE 可以是 IMAGE ID,也可以是名称。如果要删除多个镜像,其实就是用多个IMAGE。
- 从文档中可知,IMAGE 名称可以是带 TAG的。
- 如果指定的是名称以及TAG,且统一名称有多个TAG,则本操作只是删除了TAG,而没有删除镜像本身。如果只有一个TAG,那就会删除镜像本身。
- 但文档中没说如果不带TAG直接删除会怎么样,需要自己试一下。
-
常用参数:
-
-f, --force
:强制删除。默认不能删除正在运行容器对应的镜像,如果要删除必须添加本选项。 -
--no-prune
:不删除过程镜像。
-
-
举例
-
docker rmi fd484f19954f
docker rmi test:latest
- 删除多余镜像:docker image prune
- 重点要介绍两个概念:untagged image 和 dangling images,具体参考这里
- untagged images:没有被容器使用。就是 docker images 中 tag 为
<none>
的那些 - dangling images:即虚悬镜像。不是特别理解,大概意思就是镜像有新版本了,那用不到的旧版本就是虚悬镜像。docker images 命令中name为
<none>
的那些 - 感觉 dangling images 是 untagged images 的子集。
- untagged images:没有被容器使用。就是 docker images 中 tag 为
- 命令形式:
docker image prune [OPTIONS]
- 常用选项:
-
-a, --all
:如果指定,则删除所有 untagged images;如果没有指定,就删除 dangling images。 -
-f, --force
:不用确认(不太懂什么场景) -
--filter
:过滤
-
- 命令举例
- 重点要介绍两个概念:untagged image 和 dangling images,具体参考这里
docker image prune -a
- 通过 Dockerfile 构建镜像:docker build / docker image build
- 命令形式:
docker build [OPTIONS] PATH | URL | -
- Dockerfile可以通过本地路径或URL进行指定
- 具体使用还是等学习 Dockerfile 的时候再说吧
- 命令形式:
- 其他命令
- docker save / docker image save:将镜像保存为tar文件
- docker load / docker image load:导入本地tar文件
- docker import / docker image import:从归档文件中创建镜像
- docker tag / docker image tag:标记本地镜像,将其归入某一仓库
- docker history / docker image history:查看镜像的创建历史
- docker image inspect
2. Contrainer 相关命令
- 镜像可以理解为只读文件,容器相对的就是镜像+读写层+计算机资源
- 命令分类
- 容器基本操作:
ps/top/inspect/port
等 - 容器声明周期相关操作:
run/exec/start/stop/restart/rm/pause/unpause/kill
- 容器基本操作:
2.1 容器基本操作
- 查看容器:docker ps
- 命令形式
docker ps [OPTIONS]
- 常用参数:
-
-a, --all
:显示所有容器(包括没有运行的)。如果没有指定该参数(即默认情况)则输出运行中的容器。 -
-n
:显示最新创建的若干容器 -
-q
:只显示容器id -
--no-trunc
:显示详细信息 -
-l
:显示最新创建的容器 -
-s
:展示文件大小 -
-f, --filter
:过滤结果 -
--format
:定义结果展示形式
-
- 结果:主要包括
CONTAINER ID/IMAGE/COMMAND/CREATED/STATUS/PORTS/NAME
,分别表示容器编号、使用的镜像、启动容器时使用的命令、容器创建时间、状态(包括 created/restarting/running/removing/paused/exited/dead)、端口编号以及使用的连接方式(即TPC/UDP)、自动分配的容器名称 - 举例如下
- 命令形式
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9833437217a5 busybox "top" 5 seconds ago Up 4 seconds 8080/tcp dreamy_mccarthy
fc7e477723b7 busybox "top" 50 seconds ago Up 50 seconds 0.0.0.0:32768->80/tcp admiring_roentgen
- 查看容器中运行的进程信息:docker top
- 命令形式:
docker top CONTAINER [ps OPTIONS]
- 参数与前面的 docker ps 完全相同
- 结果与普通的 TOP 命令相同
- 使用举例
- 命令形式:
runoob@runoob:~/mysql$ docker top mymysql
UID PID PPID C STIME TTY TIME CMD
999 40347 40331 18 00:58 ? 00:00:02 mysqld
- 查看容器或镜像的元数据:docker inspect
- 命令形式:
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
- 可选参数:
-
-f, --format
:结果展示形式 -
-s, --size
:展示容器所占空间(进容器有效) -
--type
:为指定类型返回JSON(不太懂什么意思)
-
- 结果我看不懂。。
- 命令形式:
- 查看容器端口映射:docker port
- 命令形式:
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
- 可指定容器内的端口号以及协议
- 使用举例
- 命令形式:
$ docker port test
7890/tcp -> 0.0.0.0:4321
9876/tcp -> 0.0.0.0:1234
$ docker port test 7890/tcp
0.0.0.0:4321
- 其他命令:
- docker attatch:
- docker events:从服务器获取实时事件
- docker logs:获取容器的日志
- docker wait:阻塞运行直到容器停止,然后打印出它的退出代码
- docker export:将文件系统作为一个tar归档文件导出到STDOUT
2.2 容器声明周期管理
- 启动/停止/重启容器:docker start/stop/restart
- 命令形式:
docker start [OPTIONS] CONTAINER [CONTAINER...]
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker restart [OPTIONS] CONTAINER [CONTAINER...]
- 命令形式:
- 在运行的容器中执行命令(操作对象是容器):docker exec
- 命令形式:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
- 常用选项:
-
-i
:交互模式,一般与-t
一起使用,即-it
,可以在容器内打开一个终端使用。 -
-t
:没看懂注解,有个帖子 -
-d
:detach 模式,即在后台运行命令
-
- 使用举例如下
- 命令形式:
$ docker exec -it ubuntu_bash pwd
/
- 创建容器(但不启动):docker create
- 暂停/恢复容器中的进程:docker pause/unpause
- 命令形式:
docker pause CONTAINER [CONTAINER...]
docker unpause CONTAINER [CONTAINER...]
- 命令形式:
- 删除容器:docker rm
- 命令形式:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
- 常用选项:
-
-f
:通过SIGKILL 信号强制删除运行中的容器 -
-l
:移除网络连接,而不是容器本身 -
-v
:删除与容器关联的卷
-
- 命令形式:
- 结束运行中的进程:docker kill
- 命令形式:
docker kill [OPTIONS] CONTAINER [CONTAINER...]
- 选项:
-s
,向容器发送一个信号(我也不知道啥意思) - 使用举例如下
- 命令形式:
docker kill my_container
- 创建一个新的容器并运行(操作对象是镜像):docker run
- 命令形式:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
- 常用选项
-
-d
:后台运行容器,并返回容器ID -
-i
:以交互模式运行,一般与-t
一起使用 -
-t
:类似于 docker exec 命令,我也不太懂,反正一遍就是和-i
一起使用 -
-p
:指定端口映射,格式为主机(宿主)端口:容器端口
-
-P
:将容器所有端口随机映射到主机 -
--name
:为容器指定名称 -
--rm
:退出容器时自动删除该容器 -
-v
:绑定一个卷
-
- 使用举例
- 命令形式:
# 使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx
docker run --name mynginx -d nginx:latest
# 使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data
docker run -p 80:80 -v /data:/data -d nginx:latest
# 使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令
docker run -it nginx:latest /bin/bash