docker version # 显示docker版本信息,包括server和client
docker info # 显示docker信息,包括容器状态,docker驱动信息,宿主机系统信息等
命令 | 描述 |
---|---|
docker search | 从docker hub中查找镜像 |
docker pull | 拉取镜像 |
docker push | 推送镜像 |
docker images | 列出镜像 |
docker history | 查看镜像构建历史 |
docker tag | 给镜像打标签 |
docker commit | 通过容器创建镜像 |
docker save | 保存镜像 |
docker load | 加载镜像 |
docker rmi | 删除一个或多个镜像 |
docker inspect | 获取容器/镜像的元数据 |
docker search nginx # 从官方仓库查找nginx镜像,建议直接在官网查找
docker pull nginx:1.17.5-alpine # 拉取官方镜像nginx:1.17.5-alpine,不加tag默认拉取nginx:latest,alpine是docker中的精简版镜像
docker pull xlbubble/mynginx1.17.5-alpine # 拉取私有仓库镜像,需先docker login
docker push xlbubble/busybox:1.1-2 # 推送镜像,推送前需要docker login
由于镜像是由多层存储所构成,docker pull时是一层层的去下载,而不是下载单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结束后,给出该镜像完整的sha256的摘要,以确保下载一致性。
docker pull ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[镜像版本号]
docker login --username=100000847747 ccr.ccs.tencentyun.com # 登录
docker tag 03e2844eac7b ccr.ccs.tencentyun.com/xlbubble/http:v0.1 # 打标签,设置为腾讯云规定镜像标签
docker push ccr.ccs.tencentyun.com/xlbubble/http:v0.1 # 推送镜像
docker images # 列出所有镜像,可以看到列出信息包含镜像大小,不过列表中的镜像体积总和并非是所有镜像实际硬盘消耗。
# Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。
# 由于 Docker 使用Union FS,相同的层只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。
docker system df # 查看镜像,容器,数据卷实际占用的空间
docker image ls # 列出所有镜像
docker images --no-trunc # 列出所有镜像,包括完整id信息
docker images nginx # 仅列出nginx相关镜像
docker images nginx -q # 仅列出nginx镜像id
docker images -f reference='*nginx' # 过滤出REPOSITORY符合*nginx的镜像,这个不能列出带/的私有镜像,还是用grep,awk比较好
docker images -f label== # 通过标签过滤镜像,如果有自定义的话比较好过滤
docker images --format "{{.Repository}}:{{.Tag}}:{{.ID}}" # 列出特定列(REPOSITORY,TAG,IMAGE ID )
docker images history nginx:1.17.5-alpine # 镜像完整构建历史,包括不在本地构建的历史(missing)
docker tag nginx:1.17.5-alpine xlbubble/mynginx:1.0 # 打标签,类似别名
docker save -o myimage.gz xlbubble/test:1.1 busybox:latest # 打包多个镜像
docker load -i myimage.gz #xlbubble/mynginx:2.0 # 加载镜像
docker commit -a '[email protected]' --message 'add static' myapp myapp:1.0
# 定制镜像,不过一般只用这个保存容器现场,不用来定制镜像,不好控制镜像大小也不直观,通过Dockerfile定制
docker rmi nginx:1.17.5-alpine # 删除镜像
docker rmi nginx:1.17.5-alpine -f # 强制删除被容器占用的镜像,但是该镜像被作为父镜像时不能被删除
虚悬镜像,即REPOSITORY或TAG是none的镜像,是因为REPOSITORY或TAG被别的镜像占用了,但如果虚悬镜像被作为父镜像使用,就不是虚悬镜像了是作为中间层镜像存在,不可删。
docker images -f dangling=true # 过滤虚悬镜像
docker image prune # 清除虚悬镜像
命令 | 描述 |
---|---|
docker create | 创建但不运行新容器,语法同docker run |
docker run | 创建并运行新容器 |
docker ps | 显示容器信息 |
docker attach | 连接正在运行中的容器 |
docker exec | 在运行的容器中执行命令 |
docker start | 启动一个或多个容器 |
docker stop | 停止一个或多个容器 |
docker rm | 删除一个或多个容器 |
docker pause/unpause | 停止或恢复容器中所有的进程 |
docker kill | 杀掉一个运行中的容器 |
docker logs | 获取容器的日志 |
docker top | 查看容器中运行的进程信息 |
docker inspect | 获取容器/镜像的元数据 |
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
示例:
docker run -it --name busybox busybox /bin/sh #创建启动mybusybox,并通过交互式访问
docker run -d --name busybox_b busybox /bin/sh -c "while true; do echo hello world; sleep 1; done" #后台运行,循环执行命令
# 容器是否会长久运行,是和 docker run 指定的命令有关,和 -d 参数无关。
docker run -d --name sns -p 5000:5000 sns:1.0 python server:py #后台启动sns,并指定端口映射
docker run -d --name myapp -p 8080:80 -v /usr/share/nginx/html:/www/static myapp:1.0 #后台启动myapp,并指定挂载目录
# 容器后台启动进程可以通过run指定,也可以通过Dockerfile的ENTRYPOINT或CMD指定
docker run -it --rm --name busybox1 --network mybridge busybox sh # 指定容器所在网络
docker run -it --name test --rm busybox /bin/sh #启动test容器,并设置退出自动删除
# 在运行的容器中执行命令
# 如果退出这个stdin,并不会导致容器的停止。因为该容器的启动进程不是/bin/sh,因此经常使用exec做配置调试等
docker exec -it busybox_b /bin/sh
# 可以看到其中有个PID为1的进程,就是该容器的启动进程,容器的生命周期和该进程一致
docker exec busybox_b ps -ef
和exec类似的还有attach,也是进入运行中的容器。不过具体来讲exec是在容器中启动新的命令,attach是附加到已运行的命令(启动进程)上,类似将后台命令转换为前台显示,因此退出attach会导致容器终止。
docker attach busybox_b
docker inspect提供了有关由docker构造的详细信息。默认情况下,docker inspect将结果呈现在JSON数据中。docker inspect --format 参数提供了基于 Go模板 的日志格式化输出辅助功能,并提供了一些内置的增强函数。
docker inspect [OPTIONS] NAME|ID [NAME|ID…]
注释:格式 {{/注释内容/}}
docker inspect -f '{{/*查看容器ip*/}}{{.NetworkSettings.IPAddress}}' e1d8232eda93 # 查看容器ip
系统变量:格式 {{./变量/}}
docker inspect -f '{{.Name}}:{{.NetworkSettings.IPAddress}}' $(docker ps -q) |cut -d/ -f2 #查看容器名和IP
docker inspect --format '{{ .Config.Hostname }}' myapp # 查看容器Hostname
自定义变量
docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' $(docker ps -a -q) # 查看容器映射的端口
遍历(循环):range
range 用于遍历结构内返回值的所有数据。支持的类型包括 array, slice, map 和 channel。若对应的值长度为 0 时,range 不会执行。
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' myapp # 查看myapp的ip
docker inspect --format '{{range .Containers}}{{.Name}}{{println}}{{else}}With No Containers{{end}}' bridge # 查看bridge网络下的容器
docker inspect --format '{{range .Containers}}{{.Name}}{{println}}{{else}}With No Containers{{end}}' none # 查看none网络下的容器
索引:index
如果返回结果是一个 map, slice, array 或 string,则可以使用 index 加索引序号(从零开始计数)来读取属性值。
docker inspect -f '{{index .HostConfig.Binds 0}}' nginx # 指定nginx绑定的第一个数据卷
docker inspect bridge --format '{{/*查看网络的默认网关*/}}{{(index .IPAM.Config 0).Gateway}}' #通过索引序号读取默认网关
判断:if … else … end
docker inspect --format '{{if not .State.Restarting}}容器没有配置重启策略{{end}}' $(docker ps -q)
docker inspect --format '{{if ne 0 .State.ExitCode}}{{printf "Error exit:%s" .Name}}{{end}}' $(docker ps -aq) # 查看错误退出的容器
打印信息
docker inspect --format '{{print .State.Pid .State.ExitCode}}' $(docker ps -q)
docker inspect --format '{{printf "Pid:%d ExitCode:%d" .State.Pid .State.ExitCode}}' nginx
docker network ls #查看网络
docker network create -d bridge --subnet=10.10.0.0/16 --gateway=10.10.0.1 mybridge10 # 创建自定义bridge网络
docker run -it --rm --name b1 --network mybridge10 busybox sh
docker network connect mybridge10 mybridge10_app myapp:1.0 # 将容器连接到网络mybridge10
docker network inspect mybridge10 #查看mybridge10元数据
docker network disconnect mybridge10 mybridge10_app #断开容器到网络mybridge10的连接
docker network prune # 清除未使用的网络
docker network rm mybridge10 #删除网络
docker volume create myvolume #创建volume,在/var/lib/docker/volumes/下
docker volume ls #列出volume
docker run -it --name b1 -v myvolume:/data busybox /bin/bash # 挂载卷
docker run -it --name b2 -v /mnt:/data busybox /bin/bash # 挂载目录
docker run -d --name b3 -v /etc/nginx:/etc/nginx:ro nginx # 只读挂载
# 查看容器启动信息
docker ps #查看运行的容器
docker ps -a #查看所有的容器
docker ps -q #仅查看运行的容器id
docker ps -a --format {{.ID}}:{{.Ports}} #查看容器id和对应端口
docker ps -a --filter name=busybox #查看名称包含busybox的容器
docker ps filter,format其他使用方法:https://docs.docker.com/engine/reference/commandline/ps/
# 查看容器日志
docker logs -f myapp # 查看并跟踪实时日志
docker logs -f --tail=100 myapp # 显示后100行并跟踪实时日志
docker logs -t --since="2019-11-09T10:00:00" myapp # 查看某时间后的日志
docker logs -t --since="2019-11-09T10:00:00" --until "2019-11-09T12:00:00" myapp # 查看某时间段的日志
# 监控容器cpu,内存,网络状态
docker stats
#查看docker的实时操作
# docker events
2019-11-12T11:27:33.856687526+08:00 volume create testvol (driver=local)
2019-11-12T11:27:33.867248878+08:00 container create 380693a16639b81e2f32e2f9674bf47d676d28cc6797ccec035bb02e7e97e5d0 (image=busybox, name=b1)
...
# docker 集群命令也比较复杂,这里暂时只做简单介绍
docker swarm init # master集群初始化
docker swarm join --token SWMTKN-1-1gv2uczrljacb4t7skkjd2hw1gl15x9vh54wpqnijii6ozvfmk-3wyvyrdr61zt0buufjg0prpe2 172.20.2.192:2377 #node加入集群
docker service --replicas 3 -p 80:80 nginx #master创建service
docker service ls