通用命令
docker <COMMAND> --help
:查看命令的使用描述、命令别名等内容。Command 为空时,可以查看所有支持的 docker 命令docker info
:docker 信息查询docker version
:docker 版本查询docker stats
:查看容器实例使用的宿主机资源
镜像
本地查询
docker images
:列表(默认追加了 -a 参数 查询所有)docker images -q
:只查看镜像id
远端仓库查询
docker search <IMAGE_NAME>
:根据名称查询docker search <IMAGE_NAME>:<TAG>
:根据名称 & 标签查询
拉取远端镜像
docker pull <IMAGE_NAME>
:根据名称拉取(不写 tag 默认拉取 latest)docker pull <IMAGE_NAME>:<TAG>
:根据名称 & 标签拉取
删除本地镜像
docker image remove <IMAGE_ID_1> <IMAGE_ID_2> <IMAGE_ID_3>
:根据镜像id删除,多个空格分隔。也可以用别名命令docker rmi -f <IMAGE_ID_1> <IMAGE_ID_2> <IMAGE_ID_3>
。docker image remove $(docker images -aq)
:删除所有本地镜像
提交镜像
docker commit <OPTIONS> <CONTAINER_ID> <IMAGE_NAME>:<TAG>
-m
:提交内容描述
-a
:作者
例子
docker commit -m "Add readme file" -a "cqq" 9c1833184716 my_tomcat8:1.0
镜像名称的理解
对于 image name
,准确说应该是 image repositry name
。我们查看一下镜像列表:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-test spring-boot-1.0 4a83d725d5e6 5 hours ago 661MB
redis latest 0ec8ab59a35f 7 days ago 117MB
第一列的名称已经说明了为 REPOSITRY
。一个镜像由 REPOSITRY_NAME
+ TAG
组成,以来构成唯一性。仓库名就是应用名称,TAG
即版本号,比如:nginx:1.12.0
、centos:7
,仓库下不同版本的应用镜像。
打 Tag
对镜像打一个标签,标签名为要推送的仓库名称。在后面的操作私服的文章中会使用到。
docker image tag <IMAGE_REPOSITRY>:<TAG> <ANOTHER_IMAGE_REPOSITRY>:<TAG>
例子
docker image tag docker-test:spring-boot-1.0 \
registry.cn-beijing.aliyuncs.com/priv-docker/docker-test:spring-boot-1.0
容器
创建容器
docker run <OPTIONS> <IMAGE_NAME>:<TAG> <COMMAND>
:创建容器实例并运行,并在容器内执行指定命令
参数
--name <CONTAINER_NAME>
:指定容器实例的名称
-t
:分配一个伪 tty
-i
:保持 STDIN
打开,即使没有连接会话。这样使得容器不会 run 后容器实例直接退出(一般会与 -t
、COMMAND
为 Shell path 配合使用,达到启动后就通过 Shell 连接到容器实例的效果。因为 -i
、-t
的功能使得 Shell 程序是可以正常运行的,缺一不可)
-d
:后台运行(detached
模式默认会分配一个 tty)
-p <HOST_PORT:CONTAINER_PORT>
:指定使用的端口映射。前者为宿主机端口,后者为映射的容器端口(映射的容器端口不一定是容器内的中间件使用的端口)
-P
:随机映射宿主机端口。那么为容器中的哪些端口进行随机映射呢?个人理解为 Dockerfile
中通过 EXPOSE
申请的端口。关于 Dockerfile
会在后面的文章详细说到。
--rm
:用于测试,容器停止后就进行删除
-e
:设置环境变量。可以启动容器实例后,进入容器实例并通过 env 命令查看设置的环境变量
进入容器
docker exec <OPTIONS> <CONTAINER_ID> <COMMAND>
参数
-t
:分配一个伪 tty
-i
:保持 STDIN
打开,一般会与 -t
、COMMAND
为 Shell path 配合使用,达到通过 Shell 连接到容器实例的效果。因为 -i
、-t
的功能使得 Shell 程序是可以正常运行的,缺一不可
常用命令
docker ps
-a
:查询所有的容器实例(默认只查询运行中的容器实例)
-q
:只查询容器实例的iddocker rm <CONTAINER_ID>
:删除容器实例
-f
:强制删除,即使容器实例正在运行docker start <CONTAINER_ID>
:启动容器实例docker restart <CONTAINER_ID>
:重启容器实例docker stop <CONTAINER_ID>
:停止容器实例(留给容器实例一段时间进行 stop)docker kill <CONTAINER_ID>
:强杀容器实例(直接杀死容器实例进程)docker top <CONTAINER_ID>
:查询容器实例中的进程信息docker inspect <CONTAINER_ID>
:查询容器实例的元数据docker logs <CONTAINER_ID>
:查询容器实例的运行日志
-t
:格式化时间戳
-f
:持续输出,同 tail -f
--tail / -n
:查看尾部 n 行docker cp <CONTAINER_ID>:<CONTAINER_PATH> <HOST_PATH>
:copy 容器实例内指定目录下的文件到宿主机的指定目录
数据卷
挂载容器内的文件、文件夹到宿主机。(个人理解,容器内的文件只是一个链接,同时指向了宿主机的指定文件、文件夹)
参数
docker run -v <CONTAINER_PATH>:<PERMISSION>
:匿名挂载
docker run -v <VOLUME_NAME>:<CONTAINER_PATH>:<PERMISSION>
:具名挂载
docker run -v <HOST_PATH>:<CONTAINER_PATH>:<PERMISSION>
:路径挂载
匿名、具名挂载会将容器内的映射文件、文件夹默认保存在宿主机 /var/lib/docker/volumes/
目录下。
在末尾追加 ro(readonly)
、rw(readwrite)
表示挂载文件的操作权限。ro
表示只能在宿主机中修改,不能在容器内修改。
例子
# 路径挂载
docker run -d --name my_nginx -p 80:80 -v C:\Users\18140\Desktop\nginx\nginx.conf:/etc/nginx/nginx.conf:ro nginx:1.12.0
多容器共享数据卷
多个容器共享同份 volume
参数
docker run --volume-from <CONTAINER_NAME>
例子
docker run -d -it --name my_centos -v C:\Users\18140\Desktop\volume\v1:/volume/v1 -v C:\Users\18140\Desktop\volume\v2:/volume/v2 centos
docker run -d -it --name my_centos_2 --volumes-from my_centos centos
此时,my_centos
与 my_centos_2
会将容器内的 /volume/v1
与 /volume/v2
同时挂载到宿主机的指定目录下。