一步一步走,写小白都能看懂的文章,将持续更新中,敬请期待!

Docker从入门到实战(四)

Docker基础

一:Docker基本操作

一般情况安装Docker之后系统会自动创建一个Docker的用户组,如果没有创建可以手动创建

groupadd docker

把当前非root用户加入group内,然后退出重新登陆就生效了(本例是新建了一个用户cheng)

gpasswd -a cheng docker

service docker restart

docker入门精通 docker从入门到实战_Docker


切换当前会话到新group或者重启X会话

newgrp – docker 或者 pkill X

注意这一步是必须的,否则因为groups命令获取到的是缓存的组信息,刚添加的组信息未能生效,所以docker images 执行时同样有错,然后在终端中运行docker后按回车键,可以看到输出的关于docker的使用基本说明。

docker入门精通 docker从入门到实战_docker_02


Docker命令分为管理命令、镜像命令、容器命令、仓库命令、网路命令、数据卷命令、编排命令等,命令的分类在每次版本发布时都有调整,不过大同小异(下面以26个英文字母排序,帮助文档请-h或者—help查看)

  1. 依附容器的docker attach命令
    中文意思是附加、贴上、系上等意思,所以dokcer attach主要的作用就是进入容器,这个容器和后面的docker exec类似但是完全不一样。
    使用exit命令或者ctrl+C命令是停止容器,退出容器命令可使用ctrl+P,然后使用ctrl+Q命令,即可退出容器的虚拟终端,此时容器还在运行。
    官方不推荐使用docker attach命令进入开启了交互模式的容器,docker attach的主要功能是查看信息,容器内部操作有更加方便的docker exec命令,将在稍后介绍。
  2. 构建镜像的docker build 命令
    -c :控制cpu使用
    -f :选择dockerfile名称
    -m:设置构建内存上限
    -q:不显示构建过程的一些信息
    -t:为构建的镜像打上标签
  3. 提交容器的docker commit命令
    -a:添加作者信息,方便维护
    -c:修改dockerfile指令,目前支持的有以下指令
    CMD |ENTRYPOINT |ENV |EXPOSE |LABEL |ONBUILD |USER |VOLUME |WORKDIR
    -m:类似git commit -m这样,提交修改信息
    -p: 暂停正在commit的操作
  4. 复制文件到宿主机的docker cp 命令
    命令解释如下:
    docker cp <containerID>:/file/path/within/container /host/path/target
  5. 创建容器的docker create 命令
    在docker容器状态中有一种是created,表示容器已经创建,但是没有启动,它和stop不同,stop通常都是手动或者外部操作容器停止的,而created有可能是手动创建但是没有成功启动,created状态的容器不占用内存和CPU资源。创建后的容器可以使用docker start containerID的方式启动容器。
  6. 查看容器变化的docker diff命令
    docker diff 的语法如下:
    docker diff containerID
    docker diff命令主要用于显示当前运行容器和镜像的不同,docker diff的运行与容器的状态无关,只是显示文件差异
  7. 查看事件的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>
  8. 进入容器的docker exec命令
    docker exec主要用于进入容器内部进行操作的一个重要命令,比attach功能更强大,通过docker exec可以像使用ssh登陆服务器一样操作容器,所以一般进入容器的命令都是使用docker exec而不是docker attach
    常用参数有以下几个:
    -d:分离模式,在后台运行的命令
    -i:交互模式
    -t:分配一个TTY
    -u:指定用户和用户组,格式:<name|uid>[:<group|gid>]
    使用exec命令进入容器内部就如同进入另一个机器一样,并且使用exit命令,不会像attach那样导致容器停止,所以非常适合容器内部操作
  9. 导出容器的docker export命令
    docker export命令用于导出本地存储的容器和docker save类似(用于导出本地镜像),docker export导出的容器通常为tar包,方便传输到其他地方
    使用方法有两种:
    docker export -o containerName.tar containerName
    docker export containerName > containerName.tar
    使用docker export命令导出的容器并不会压缩容器大小
  10. 查看镜像历史的docker history命令
    以ubuntu:14.04为例,查看镜像历史
    docker history ubuntu:14.04
  11. 查看本地镜像的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
  12. 导入容器的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
  13. 查看docker信息得docker info命令
    这个大概是这么多命令中最简单易懂的命令了,-D参数显示docker system的debug信息
    docker info -D
  14. 查看各项详细信息的docker inspect命令
    inspect有检阅,检查的意思,该命令的用途是检查容器或者镜像详细信息的一个命令
  15. 杀死容器的docker kill命令
    stop和kill的区别在于docker stop命令给容器中的进程发送SIGTERM信号,默认行为是会导致容器退出,当然,容器内程序可以捕获该信号并自行处理,例如可以选择忽略。而docker kill命令则是给容器的进程发送SIGKILL信号,该信号将会使容器必然退出。
  16. 导入镜像的docker load命令
    docker load命令的作用是导入使用docker save导出的镜像,和export、import负责容器的导出导入类似,save、load负责镜像的导出导入。
    -i:指定导出文件
    例如: docker load -I ubuntu.tar
    -q:可以不显示导入的一些信息,在一些脚本中可有效减少输出干扰
    还可以通过<符号导入,下面以一个之前导出的镜像busybox为例
    docker load < busybox.tar.gz
  17. 登陆仓库的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”
    }
  18. 登出仓库的docker logout命令
    docker logout命令是登出命令,使用该命令可以登出仓库,如果使用第三方证书存储,只需要删除证书文件以及config.json即可。
  19. 查看容器日志的docker logs命令
    docker logs用于显示容器的日志,这一点和attach有点类似,不同的地方在于attach可以相对输出更自由,用户可以定制输出内容,而logs则是根据容器命令输出信息,是无交互的
    主要参数如下
    --details:显示更详细的日志
    -f:持续输出日志
    --since<string>:显示某字符串开始的日志
    --tail<string>:显示某字符串之前的日志
    -t:显示时间戳
  20. 管理网路的docker network命令
    docker network命令说明
    命令 说明
    network connect 连接一个容器到指定网路
    network create 创建一个网路
    network disconnect 指定一个网路断开一个容器
    network inspect 显示指定网络详细信息
    network ls 显示全部docker网络
    network rm 删除指定网络
    例如:docker netowork ls
  21. 管理节点的docker node命令
    docker node命令
    命令 说明
    node demote 将集群中的指定manager节点降权
    node inspect 显示节点的详细信息
    node update 更新节点属性
    node ps 显示正在运行的节点
    node ls 显示集群的全部节点
    node rm 从集群中删除指定节点
  22. 暂停容器的docker pause命令
    docker pause命令会暂停容器内的所有进程,此时,通过docker stats可以观察到此时的资源使用情况是固定不变的,通过docker logs -f 也观察不到日志的进一步输出
    命令格式如下:
    docker pause <container>
  23. 查看容器端口的docker port命令
    docker port命令用来输出容器的端口信息,与docker ps 的显示不同,该命令只会显示”暴露”的端口,对于未指定的暴露端口不会显示
  24. 查看本地容器信息的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)
  25. 拉取镜像的docker pull命令
    docker pull命令为拉取镜像的命令,通过该命令不仅可以拉取docker hub的镜像,还可以通过指定仓库地址拉取私有仓库镜像
    使用docker pull -a 会把所有标签都拉取到本地,使用—disable-content-trust=false会在拉取时校验镜像,保证传输安全,默认是关闭的
  26. 推送镜像的docker push命令
    docker push命令的作用是把本地的镜像推送到镜像仓库,和docker pull一样,使用—disable-content-trust=false会在拉取时校验镜像,保证传输安全,默认是关闭的
    使用此命令时,如果不指定tag会默认把该镜像的全部镜像都推送到仓库。例如本地存在ubuntu:14.04和ubuntu:16.04两个镜像,如果使用docker push ubuntu命令推送会把这两个镜像都推送到仓库
  27. 重命名容器的docker rename命令
    该命令可以在不改变容器状态的情况下重命名容器,格式为:docker rename<旧容器名><新容器名>,该命令一次只能更改一个容器名称
    该命令只能更改容器名称,镜像重命名会用docker tag命令
  28. 重启容器的docker restart命令
    此命令用来重启容器(不是重启docker,重启docker可以使用systemctl restart docker命令或者service docker restart命令重启docker),使用docker restart <Contailner1> <Contailner2>命令可以重启多个容器
    -t参数可以在重启设置等待容器停止的时间,如果容器在指定秒数之内没有停止,docker就会执行docker kill操作杀死容器,以便完成重启操作
  29. 删除容器的docker rm 命令
    docker rm <Container Name / Container ID>命令可以删除已经停止的容器,可以删除一个或多个容器
    -f:直接删除一个正在运行的容器
    -l:删除容器与其他容器的关联,但是会保留容器
    -v:删除容器的数据卷
  30. 删除镜像的docker rmi命令
    此命令时删除镜像的命令,删除镜像时最好指定镜像的tag,如果不指定会默认删除镜像的latest标签。该命令同样可以在后面接上多个镜像名称,删除多个镜像
    使用docker rmi命令删除镜像时,要确保没有容器使用该镜像也就是没有容器是使用该镜像启动的,才可以删除,否则会报错
    -f:强制删除镜像,即便有容器正在使用该镜像,但是这样只会删除镜像标签,不会影响正在运行的容器,实际上只有容器还在运行,镜像就不会被真正删除,用户使用docker commit操作提交容器为镜像,可以恢复镜像。
  31. 运行容器的docker run命令
    此命令参数超级多,可docker run –help查看
  32. 导出镜像的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
  33. 搜索镜像的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个结果
  34. 管理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
  35. 启动容器的docker start命令
    此命令是启动一个或多个停止状态的容器,docker start命令后边可以是容器名称也可以是容器ID
    -a:显示STDOUT/STDERR信息
    -i:显示STDIN信息
  36. 查看容器的docker stats命令
    此命令可以查看任何状态下的容器状态,该命令输出的内容是实时更新的,取消查看时使用Ctrl+c即可
    不使用任何参数,会显示所有正在运行的容器状态,要显示全部(包括非运行状态)的容器状态,可以添加-a参数
    只想查看某一时刻的状态,可以使用--no-stream参数,这样终端输出结束后会自动返回可交互shell界面
    例:docker stats –-no-stream nginx
  37. 停止容器的docker stop命令
    此命令会停止一个或者多个正在运行的容器,docker stop命令会向容器发送正常的信号,而docker kill命令会强制终止容器进程,后者可能造成数据丢失
  38. 管理集群的docker swarm命令
    docker swarm与前面的docker node,docker service命令共同组成集群管理编排的“三剑客”
    操作 详细说明
    init 初始化集群
    join 以node(worker)或者manager的身份加入集群
    join-token 管理join-token
    update 更新集群
    leave 退出集群
  39. 设置镜像标签的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
  40. 查看容器进程的docker top命令
    此命令与linux下的top命令一样,使用docker top <Container ID/Name>可以查看指定容器内正在运行的进程
  41. 恢复暂停容器的docker unpause命令
    这个与前面的docker pause命令是相对的
  42. 更新容器的docker update命令
    对容器的是指额更新时可以使用docker update命令,使用时容器不需要停止或者重启。需要注意的是,这里说的容器设置是指容器启动时添加的参数,例如:使用docker run命令时设置cpu限制,可以使用docker update命令取消
    在docker update命令的参数中,大部分与docker run命令的参数相同,唯一不同的是—restart参数,添加该参数是不会立刻修改容器配置,而是在未来容器重启时生效
  43. 查看docker版本的docker version命令
    查看docker版本,使用-f参数可以格式化输出,例如:docker version -f '{{.Server}}'
    常用的是docker version
  44. 管理数据卷的docker volume命令
    此命令是用来管理数据卷,数据卷是容器数据持久化的一个组件。
    ls:可以查看本机的全部数据卷
    rm:删除不需要的数据卷(数据卷与容器的生命周期完全独立,所以容器删除后数据卷并不会删除,时间久了数据卷就会越来越多)
    inspect:查看数据卷的详细信息
    create:创建一个数据卷
    prune:删除所有未使用的卷
  45. 设置等待的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:

  1. The Docker client contacted the Docker daemon.
  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
  3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
  4. 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


三:构建第一个docker镜像

vi Dockerfile

FROM alpine

CMD "echo" "Hello World !”

保存文件,打开终端,使用docker build命令构建第一个镜像

docker build -t hello .

-t 参数表示给构建的镜像打上名为hello的标签,构建完成后直接运行

docker run –-rm hello

如此就完成了一个镜像的构建与运行

docker入门精通 docker从入门到实战_Docker_03


转载于:https://blog.51cto.com/12943999/2073654