Docker从入门到实战(四)
Docker基础
一:Docker基本操作
一般情况安装Docker之后系统会自动创建一个Docker的用户组,如果没有创建可以手动创建
groupadd docker
把当前非root用户加入group内,然后退出重新登陆就生效了(本例是新建了一个用户cheng)
gpasswd -a cheng docker
service docker restart
切换当前会话到新group或者重启X会话
newgrp – docker 或者 pkill X
注意这一步是必须的,否则因为groups命令获取到的是缓存的组信息,刚添加的组信息未能生效,所以docker images 执行时同样有错,然后在终端中运行docker后按回车键,可以看到输出的关于docker的使用基本说明。
Docker命令分为管理命令、镜像命令、容器命令、仓库命令、网路命令、数据卷命令、编排命令等,命令的分类在每次版本发布时都有调整,不过大同小异(下面以26个英文字母排序,帮助文档请-h或者—help查看)
- 依附容器的docker attach命令
中文意思是附加、贴上、系上等意思,所以dokcer attach主要的作用就是进入容器,这个容器和后面的docker exec类似但是完全不一样。
使用exit命令或者ctrl+C命令是停止容器,退出容器命令可使用ctrl+P,然后使用ctrl+Q命令,即可退出容器的虚拟终端,此时容器还在运行。
官方不推荐使用docker attach命令进入开启了交互模式的容器,docker attach的主要功能是查看信息,容器内部操作有更加方便的docker exec命令,将在稍后介绍。 - 构建镜像的docker build 命令
-c :控制cpu使用
-f :选择dockerfile名称
-m:设置构建内存上限
-q:不显示构建过程的一些信息
-t:为构建的镜像打上标签 - 提交容器的docker commit命令
-a:添加作者信息,方便维护
-c:修改dockerfile指令,目前支持的有以下指令
CMD |ENTRYPOINT |ENV |EXPOSE |LABEL |ONBUILD |USER |VOLUME |WORKDIR
-m:类似git commit -m这样,提交修改信息
-p: 暂停正在commit的操作 - 复制文件到宿主机的docker cp 命令
命令解释如下:
docker cp <containerID>:/file/path/within/container /host/path/target - 创建容器的docker create 命令
在docker容器状态中有一种是created,表示容器已经创建,但是没有启动,它和stop不同,stop通常都是手动或者外部操作容器停止的,而created有可能是手动创建但是没有成功启动,created状态的容器不占用内存和CPU资源。创建后的容器可以使用docker start containerID的方式启动容器。 - 查看容器变化的docker diff命令
docker diff 的语法如下:
docker diff containerID
docker diff命令主要用于显示当前运行容器和镜像的不同,docker diff的运行与容器的状态无关,只是显示文件差异 - 查看事件的docker events命令
docker events涵盖了几乎全部docker事件,通过-f指定参数,还可以过滤不必要的事件,得到更精简的事件信息
使用说明如下:
docker events -f container=<name or id>
docker events -f image=<tag or id >
docker events -f volume=<name or id>
docker events -f network=<name or id>
docker events -f daemon=<name or id>
只有reload一个值,用于监控记录docker守护进程的状态
其他还有
docker events -f label=<key> or label=<key>=<value>
docker events -f event=<event action>
docker events -f type=<container or image or volume or network r daemon> - 进入容器的docker exec命令
docker exec主要用于进入容器内部进行操作的一个重要命令,比attach功能更强大,通过docker exec可以像使用ssh登陆服务器一样操作容器,所以一般进入容器的命令都是使用docker exec而不是docker attach
常用参数有以下几个:
-d:分离模式,在后台运行的命令
-i:交互模式
-t:分配一个TTY
-u:指定用户和用户组,格式:<name|uid>[:<group|gid>]
使用exec命令进入容器内部就如同进入另一个机器一样,并且使用exit命令,不会像attach那样导致容器停止,所以非常适合容器内部操作 - 导出容器的docker export命令
docker export命令用于导出本地存储的容器和docker save类似(用于导出本地镜像),docker export导出的容器通常为tar包,方便传输到其他地方
使用方法有两种:
docker export -o containerName.tar containerName
docker export containerName > containerName.tar
使用docker export命令导出的容器并不会压缩容器大小 - 查看镜像历史的docker history命令
以ubuntu:14.04为例,查看镜像历史
docker history ubuntu:14.04 - 查看本地镜像的docker images命令
docker images命令用于查看本地存储的docker镜像
主要参数如下:
-a:显示所有镜像,包括中间镜像(悬挂镜像),默认不显示
-f:过滤显示,可选的值有
docker images -f dangling=[true|false]
docker images -f label=<key>[=<=value>]
docker images -f before=(<image-name>[:tag] |<image-id> |<image@digest>)
docker images -f since=(<image-name>[:tag] |<image-id> |<image@digest>)
-q:只显示ID - 导入容器的docker import命令
docker import命令和docker export命令相对,用于导入容器,导入后会变成镜像,用法和docker export命令相似
使用网络地址导入
docker import https;//example.com/container.tar
通过管道导入
cat exampleContainer.tgz |Docker import –message “New image imported from tarball”- exampleContainerlocal:newtag
还可以直接导入本地tar包
docker import /path/to/exapmpleContainer.tgz
甚至可以从目录导入
sudo tar -c . |docker import – exampleContainerdir - 查看docker信息得docker info命令
这个大概是这么多命令中最简单易懂的命令了,-D参数显示docker system的debug信息
docker info -D - 查看各项详细信息的docker inspect命令
inspect有检阅,检查的意思,该命令的用途是检查容器或者镜像详细信息的一个命令 - 杀死容器的docker kill命令
stop和kill的区别在于docker stop命令给容器中的进程发送SIGTERM信号,默认行为是会导致容器退出,当然,容器内程序可以捕获该信号并自行处理,例如可以选择忽略。而docker kill命令则是给容器的进程发送SIGKILL信号,该信号将会使容器必然退出。 - 导入镜像的docker load命令
docker load命令的作用是导入使用docker save导出的镜像,和export、import负责容器的导出导入类似,save、load负责镜像的导出导入。
-i:指定导出文件
例如: docker load -I ubuntu.tar
-q:可以不显示导入的一些信息,在一些脚本中可有效减少输出干扰
还可以通过<符号导入,下面以一个之前导出的镜像busybox为例
docker load < busybox.tar.gz - 登陆仓库的docker login命令
docker login命令时 一个登陆到Registry的命令,Registry是docker公司为了更方便镜像流通而设计的一种镜像仓库,像手机上的应用商店一样,用户可以在上面发布镜像和拉取镜像,官方的docker hub还提供更高级的企业服务
使用docker login命令直接登陆到docker hub
使用docker login localhost:8080的方式可以登录到第三方仓库
登陆信息均会保存在$HOME/.docker/config.json目录下
D-Bus Secret Service网址为https://github.com/docker/docker-credential-helpers/releases
Apple OS X keychain网址为https://github.com/docker/docker-credential-helpers/releases
Microsoft Windows Credential Manager网址为https://github.com/docker/docker-credential-helpers/releases
在config.json中修改
{
“credStore”:“osxkeychain”
} - 登出仓库的docker logout命令
docker logout命令是登出命令,使用该命令可以登出仓库,如果使用第三方证书存储,只需要删除证书文件以及config.json即可。 - 查看容器日志的docker logs命令
docker logs用于显示容器的日志,这一点和attach有点类似,不同的地方在于attach可以相对输出更自由,用户可以定制输出内容,而logs则是根据容器命令输出信息,是无交互的
主要参数如下
--details:显示更详细的日志
-f:持续输出日志
--since<string>:显示某字符串开始的日志
--tail<string>:显示某字符串之前的日志
-t:显示时间戳 - 管理网路的docker network命令
docker network命令说明
命令 说明
network connect 连接一个容器到指定网路
network create 创建一个网路
network disconnect 指定一个网路断开一个容器
network inspect 显示指定网络详细信息
network ls 显示全部docker网络
network rm 删除指定网络
例如:docker netowork ls - 管理节点的docker node命令
docker node命令
命令 说明
node demote 将集群中的指定manager节点降权
node inspect 显示节点的详细信息
node update 更新节点属性
node ps 显示正在运行的节点
node ls 显示集群的全部节点
node rm 从集群中删除指定节点 - 暂停容器的docker pause命令
docker pause命令会暂停容器内的所有进程,此时,通过docker stats可以观察到此时的资源使用情况是固定不变的,通过docker logs -f 也观察不到日志的进一步输出
命令格式如下:
docker pause <container> - 查看容器端口的docker port命令
docker port命令用来输出容器的端口信息,与docker ps 的显示不同,该命令只会显示”暴露”的端口,对于未指定的暴露端口不会显示 - 查看本地容器信息的docker ps命令
docker ps命令显示当前正在运行的容器
主要参数如下
-a:显示全部容器,包括各种状态的容器,只要存在就显示
-f:添加过滤条件
-n:显示最近创建的几个容器(包括所有状态的容器,-l显示最近创建的一个,遇到持续输出的信息还可以使用—no-trunc进行追加)
-q:只显示ID
-s:显示容器大小
例:删除所有已经停止的容器
docker rm $(docker ps -a -q)
删除所有容器(包括运行中的容器)
docker kill $(docker ps -q);docker rm $(docker ps -a -q)
杀死所有正在运行的容器
docker kill $(docker ps -a -q) - 拉取镜像的docker pull命令
docker pull命令为拉取镜像的命令,通过该命令不仅可以拉取docker hub的镜像,还可以通过指定仓库地址拉取私有仓库镜像
使用docker pull -a 会把所有标签都拉取到本地,使用—disable-content-trust=false会在拉取时校验镜像,保证传输安全,默认是关闭的 - 推送镜像的docker push命令
docker push命令的作用是把本地的镜像推送到镜像仓库,和docker pull一样,使用—disable-content-trust=false会在拉取时校验镜像,保证传输安全,默认是关闭的
使用此命令时,如果不指定tag会默认把该镜像的全部镜像都推送到仓库。例如本地存在ubuntu:14.04和ubuntu:16.04两个镜像,如果使用docker push ubuntu命令推送会把这两个镜像都推送到仓库 - 重命名容器的docker rename命令
该命令可以在不改变容器状态的情况下重命名容器,格式为:docker rename<旧容器名><新容器名>,该命令一次只能更改一个容器名称
该命令只能更改容器名称,镜像重命名会用docker tag命令 - 重启容器的docker restart命令
此命令用来重启容器(不是重启docker,重启docker可以使用systemctl restart docker命令或者service docker restart命令重启docker),使用docker restart <Contailner1> <Contailner2>命令可以重启多个容器
-t参数可以在重启设置等待容器停止的时间,如果容器在指定秒数之内没有停止,docker就会执行docker kill操作杀死容器,以便完成重启操作 - 删除容器的docker rm 命令
docker rm <Container Name / Container ID>命令可以删除已经停止的容器,可以删除一个或多个容器
-f:直接删除一个正在运行的容器
-l:删除容器与其他容器的关联,但是会保留容器
-v:删除容器的数据卷 - 删除镜像的docker rmi命令
此命令时删除镜像的命令,删除镜像时最好指定镜像的tag,如果不指定会默认删除镜像的latest标签。该命令同样可以在后面接上多个镜像名称,删除多个镜像
使用docker rmi命令删除镜像时,要确保没有容器使用该镜像也就是没有容器是使用该镜像启动的,才可以删除,否则会报错
-f:强制删除镜像,即便有容器正在使用该镜像,但是这样只会删除镜像标签,不会影响正在运行的容器,实际上只有容器还在运行,镜像就不会被真正删除,用户使用docker commit操作提交容器为镜像,可以恢复镜像。 - 运行容器的docker run命令
此命令参数超级多,可docker run –help查看 - 导出镜像的docker save命令
此命令是用来导出镜像的,后面可以连接多个镜像,默认输出是STDOUT,意味着需要指定一个目标文件,可以通过-o参数来指定
例:导出一个镜像
docker save -o ubuntu.tar ubuntu:14.04
导出多个容器
docker save -o nginx_php.tar nginx:1.9 php:7.0-fpm
除了-o参数,还可以使用>符号导出镜像
docker save ubuntu:14.04 > ubuntu.tar - 搜索镜像的docker search命令
-f:可以定制返回信息,可选参数有以下三个
is-automated=(true|false)
is-official=(true|false)
stars=<number>
例如:搜索ubuntu的官方镜像
搜索stars超过20并且是官方构建的ubuntu镜像
docker search -f stars=20 -f is-official=true ubuntu
搜索stars超过20并且是自动构建的ubuntu镜像
docker search -f stars=20 -f is-automated=true ubuntu
还有如—limit int这样的参数用来限制显示数量,默认是返回25个结果 - 管理docker service命令
docker service命令的作用是管理集群中的服务,需要与docker swarm配合使用。使用docker service时,主机必须是swarm的manager
命令 说明
service create 创建service
service inspect 取得service的详细信息
service ps 取得service的任务信息
service ls 取得service的列表信息
service rm 删除service
service scale 调整service的replicas
service update 更新service - 启动容器的docker start命令
此命令是启动一个或多个停止状态的容器,docker start命令后边可以是容器名称也可以是容器ID
-a:显示STDOUT/STDERR信息
-i:显示STDIN信息 - 查看容器的docker stats命令
此命令可以查看任何状态下的容器状态,该命令输出的内容是实时更新的,取消查看时使用Ctrl+c即可
不使用任何参数,会显示所有正在运行的容器状态,要显示全部(包括非运行状态)的容器状态,可以添加-a参数
只想查看某一时刻的状态,可以使用--no-stream参数,这样终端输出结束后会自动返回可交互shell界面
例:docker stats –-no-stream nginx - 停止容器的docker stop命令
此命令会停止一个或者多个正在运行的容器,docker stop命令会向容器发送正常的信号,而docker kill命令会强制终止容器进程,后者可能造成数据丢失 - 管理集群的docker swarm命令
docker swarm与前面的docker node,docker service命令共同组成集群管理编排的“三剑客”
操作 详细说明
init 初始化集群
join 以node(worker)或者manager的身份加入集群
join-token 管理join-token
update 更新集群
leave 退出集群 - 设置镜像标签的docker tag命令
docker tag命令可以给镜像重命名,在docker中镜像、容器、网路、数据卷等组件在运行时都会获取一个ID,这个ID是独一无二的,但是这个ID太长了,不容易记忆,所以有了tag的概念,给镜像打上标签
例如:给一个没有打标签的镜像打上标签
docker tag a70c7fad1812 myusername/images:default
还可以只修改镜像标签,不改动名称
docker tag myusername/images:default myusername/images:new
常用的情况还有修改名称以及标签
docker tagmyusername/images:default myusername/images-new:latest - 查看容器进程的docker top命令
此命令与linux下的top命令一样,使用docker top <Container ID/Name>可以查看指定容器内正在运行的进程 - 恢复暂停容器的docker unpause命令
这个与前面的docker pause命令是相对的 - 更新容器的docker update命令
对容器的是指额更新时可以使用docker update命令,使用时容器不需要停止或者重启。需要注意的是,这里说的容器设置是指容器启动时添加的参数,例如:使用docker run命令时设置cpu限制,可以使用docker update命令取消
在docker update命令的参数中,大部分与docker run命令的参数相同,唯一不同的是—restart参数,添加该参数是不会立刻修改容器配置,而是在未来容器重启时生效 - 查看docker版本的docker version命令
查看docker版本,使用-f参数可以格式化输出,例如:docker version -f '{{.Server}}'
常用的是docker version - 管理数据卷的docker volume命令
此命令是用来管理数据卷,数据卷是容器数据持久化的一个组件。
ls:可以查看本机的全部数据卷
rm:删除不需要的数据卷(数据卷与容器的生命周期完全独立,所以容器删除后数据卷并不会删除,时间久了数据卷就会越来越多)
inspect:查看数据卷的详细信息
create:创建一个数据卷
prune:删除所有未使用的卷 - 设置等待的docker wait命令
执行docker wait命令后,该命令会“hang”在当前终端,直到容器停止,此时会打印出容器的退出码。该命令一般会用在容器监控、异常捕捉方面。二:启动第一个容器
第一件事就是打印Hello World,就像我们学Python一样,先开是学写Hello World,下面直接运行hello-world镜像,使用docker run命令是如果本地没有该镜像,那么会自动从Docker Hub中拉取镜像
docker run --rm hello-world
这里使用的—rm表示容器退出后自动删除该容器
运行后信息如下
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
- The Docker client contacted the Docker daemon.
- The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64) - The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading. - The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://cloud.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
这就是hello-world输出的内容,显示这些信息则说明docker运行正常了
三:构建第一个docker镜像
vi Dockerfile
FROM alpine
CMD "echo" "Hello World !”
保存文件,打开终端,使用docker build命令构建第一个镜像
docker build -t hello .
-t 参数表示给构建的镜像打上名为hello的标签,构建完成后直接运行
docker run –-rm hello
如此就完成了一个镜像的构建与运行