一、基础命令

1.运行一个镜像

  1. [root@bogon ~]# docker run debian echo "Hello World"
  2. Unable to find image 'debian:latest' locally
  3. latest: Pulling from library/debian
  4. 3e17c6eae66c: Pull complete
  5. Digest: sha256:2e43e863a4ab6e53caf87a37d01d8c144cdcb732ad1b944fcf45cbfd7248a02a
  6. Status: Downloaded newer image for debian:latest
  7. Hello World

提供一个容器中的shell

  1. [root@bogon ~]# docker run -i -t debian /bin/bash
  2. root@1bd73131a553:/# echo "Hello from Container-land!"
  3. Hello from Container-land!
  4. root@1bd73131a553:/# exit
  5. exit

2.运行案例分析

1)docker pull

Docker Daemon从Docker Registry下载指定的容器镜像,并将镜像储存在本地Graph中。

流程分析:

A.Docker Client处理用户发起的docker pull命令,解析完请求以及参数后,发送一个HTTP请求给Docker Server,HTTP请求方法为POST,请求URI为“/images/create?”+“xxx”;

B.Docker Server接收以上HTTP请求,并交给mux.Router,通过URL以及请求方式类型来确定执行该请求的具体handler;

C.mux.Router将请求路由分发至相应的handler;

D.在PostImageCreate这个handler中,创建并初始化一个名为“pull”的Job,之后触发执行该Job;

E.这个Job在执行过程中执行pullRepository操作,即从Docker Registry中下载相应的一个或多个Docker镜像;

F.这个Job将下载的Docker镜像交给graphdriver管理;

G.graphdriver负责存储Docker镜像,一方面将镜像存储至本地文件系统中,另一方面为镜像创建对象,由Docker Daemon统一管理。

2)docker run

创建一个全新的Docker容器,并在容器中运行指定命令。

  • 创建Docker容器对象,并为容器准备所需的rootfs;
  • 创建容器的运行环境,运行用户指令;

流程分析:

A.Docker Client处理用户发起的docker run命令,解析完请求与参数之后,向Docker Server发送一个HTTP请求,HTTP请求方式为POST,请求URL为“/containers/create?”+“xxx”;(创建容器对象而非实际容器)

B.Docker Server接收以上HTTP请求,并交给mux.Router,通过URL以及请求方式类型来确定执行该请求的具体handler;

C.mux.Router将请求路由分发至相应的handler;

D.在PostContainersCreate这个handler中,创建并初始化一个名为“create”的Job,之后触发执行该Job;

E.这个Job在执行过程中执行Container.Create操作,该操作需要获取容器镜像来为Docker容器准备rootfs,通过graphdriver完成;

F.graphdriver从Graph中获取创建Docker容器rootfs所需要的所有镜像;

G.graphdriver将rootfs的所有镜像通过某种联合文件系统的方式加载至Docker容器指定的文件目录中;

H.若以上操作正常执行,没有返回错误或异常,则Docker Client收到Docker Server返回状态后,发起二次HTTP请求,URL为“/containers/”+container_ID+“/start”;(实现物理容器运行)

I.Docker Server接收以上HTTP请求,并交给mux.Router,通过URL以及请求方式类型来确定执行该请求的具体handler;

J.mux.Router将请求路由分发至相应的handler;

K.在PostContainersStart这个handler中,创建并初始化一个名为“start”的Job,之后触发执行该Job;

L.这个Job执行需要完成一系列与Docker容器相关的资源配置工作;

M.networkdriver为指定的Docker容器分配网络资源,防火墙规则

N.返回名为“start”的Job,执行完一些辅助操作后,Job开始执行用户指令,调用execdriver;

O.execdriver被调用,开始初始化Docker容器内部的运行环境,如命名空间、资源控制与隔离,以及用户命令的执行,相应的操作转交至libcontainer来完成;

P.libcontainer被调用,完成Docker容器内部的运行环境初始化,并最终执行用户要求启动的命令。

3.常用命令解析

1)启动容器

  1. [root@bogon ~]# docker run -h CONTAINER -i -t debian /bin/bash
  2. root@CONTAINER:/#

-h 设定新的主机名(hostname)

2)查看容器

  1. 为了测试,我将容器搞坏了
  2. root@CONTAINER:/# mv /bin /basket
  3. root@CONTAINER:/# ls
  4. bash: ls: command not found
  5. 现在查看状态
  6. [root@bogon ~]# docker ps
  7. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  8. 8f64d43a4e26 debian "/bin/bash" 2 minutes ago Up 2 minutes competent_euclid
  9. 通过NAMES获取容器信息
  10. [root@bogon ~]# docker inspect competent_euclid
  11. [
  12. {
  13. "Id": "8f64d43a4e26dbe29626f82feb7aafc759fe805699f0f014aaf3b2be82790c82",
  14. "Created": "2017-10-23T13:47:20.594553293Z",
  15. "Path": "/bin/bash",
  16. "Args": [],
  17. "State": {
  18. "Status": "running",
  19. "Running": true,
  20. "Paused": false,
  21. "Restarting": false,
  22. "OOMKilled": false,
  23. "Dead": false,
  24. "Pid": 2662,
  25. "ExitCode": 0,
  26. "Error": "",
  27. "StartedAt": "2017-10-23T13:47:20.855942407Z",
  28. "FinishedAt": "0001-01-01T00:00:00Z"
  29. ...省略部分
  30. 过滤相关内容
  31. [root@bogon ~]# docker inspect competent_euclid |grep IPAddress
  32. "SecondaryIPAddresses": null,
  33. "IPAddress": "172.17.0.2",
  34. "IPAddress": "172.17.0.2",
  35. [root@bogon ~]# docker inspect --format {{ .NetworkSettings.IPAddress }} competent_euclid
  36. Template parsing error: template: :1: unexpected unclosed action in command
  37. <注意:括号内不要有空格>
  38. [root@bogon ~]# docker inspect --format {{.NetworkSettings.IPAddress}} competent_euclid
  39. 172.17.0.2
  40. 容器内的改变
  41. [root@bogon ~]# docker diff competent_euclid
  42. A /basket A表示新增文件)
  43. A /basket/vdir
  44. A /basket/chgrp
  45. A /basket/fgrep
  46. A /basket/mv
  47. A /basket/pidof
  48. A /basket/rbash
  49. ...省略部分
  50. D /bin D表示被删除的文件)
  51. 容器执行日志
  52. [root@bogon ~]# docker logs competent_euclid
  53. root@CONTAINER:/# mv /bin /basket
  54. root@CONTAINER:/# ls
  55. bash: ls: command not found

3)删除容器

  1. 查看全部容器(包括已停止的)
  2. [root@bogon ~]# docker ps -a
  3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  4. 8f64d43a4e26 debian "/bin/bash" 11 minutes ago Exited (127) 23 seconds ago competent_euclid
  5. 1bd73131a553 debian "/bin/bash" About an hour ago Exited (0) About an hour ago cranky_austin
  6. 重新启动容器
  7. docker start
  8. 删除容器
  9. [root@bogon ~]# docker rm competent_euclid
  10. competent_euclid
  11. 清理所有已停止的容器
  12. [root@bogon ~]# docker ps -aq -f status=exited
  13. 1bd73131a553
  14. 69914367d6b4
  15. 74ef7227163a
  16. 5a1754f8433f
  17. 944c67e9d101
  18. e0294c4a650a
  19. [root@bogon ~]# docker rm -v $(docker ps -aq -f status=exited)
  20. 1bd73131a553
  21. 69914367d6b4
  22. 74ef7227163a
  23. 5a1754f8433f
  24. 944c67e9d101
  25. e0294c4a650a
  26. -v 当所有由Docker管理的数据卷已经没有和任何容器关联时,一律删除
  27. [root@bogon ~]# docker ps -a
  28. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  29. 36c220e77949 busybox "/bin/ping webapp" 3 hours ago Created destination

4)创建一个全新的容器流程

  1. [root@bogon ~]# docker run -it --name cowsay --hostname cowsay debian bash
  2. root@cowsay:/# apt-get update
  3. ...
  4. root@cowsay:/# apt-get install -y cowsay fortune
  5. root@cowsay:/# /usr/games/fortune | /usr/games/cowsay
  6. root@cowsay:/# exit
  7. 把容器转成镜像
  8. [root@bogon ~]# docker commit cowsay test/cowsayimage
  9. [root@bogon ~]# docker run test/cowsayimage /usr/games/cowsay "Moo"

二、通过Dockerfile创建镜像

1.Dockerfile

  1. [root@bogon ~]# cat Dockerfile
  2. FROM debian:wheezy
  3. RUN apt-get update && apt-get install -y cowsay fortune

2.镜像、容器和联合文件系统之间的关系

联合文件系统(联合挂载)—允许多个文件系统叠加,并表现为一个单一的文件系统;若有两个文件的路径完全相同,则最后挂载的文件覆盖之前的;

Docker支持多种不同的文件系统,AUFS、Overlay、devicemapper、BTRFS、ZFS;

  1. [root@bogon ~]# docker info
  2. Containers: 2
  3. Running: 0
  4. Paused: 0
  5. Stopped: 2
  6. Images: 12
  7. Server Version: 17.09.0-ce
  8. Storage Driver: overlay <<<<<<<<
  9. Backing Filesystem: xfs
  10. Supports d_type: true
  11. Logging Driver: json-file
  12. Cgroup Driver: cgroupfs

Docker镜像由多个不同的层(layer)组成,每一层都是一个只读的文件系统;

Dockerfile里的每一个指令都会创建一个新的层,这个层位于前一个层之上;

当一个镜像被转化成容器时,Docker引擎会在镜像之上添加一个处于最上层的可读写文件系统。(尽量将指令写在一行来较少层的数量)

容器可处于:已创建(created)、重启中(restarting)、运行中(running)、已暂停(paused)、已退出(exited)

3.ENTRYPOINT

指定一个可执行文件,处理传给docker run的参数。

  1. [root@bogon ~]# cat Dockerfile
  2. FROM debian:wheezy
  3. RUN apt-get update && apt-get install -y cowsay fortune
  4. COPY entrypoint.sh /
  5. ENTRYPOINT ["/entrypoint.sh"]
  6. [root@bogon ~]# cat entrypoint.sh
  7. #!/bin/bash
  8. if [ $# -eq 0 ];then
  9. /usr/games/fortune | /usr/games/cowsay
  10. else
  11. /usr/games/cowsay "$0"
  12. fi
  13. [root@bogon ~]# docker build -t test/cowsay-dockerfile .
  14. [root@bogon ~]# docker run test/cowsay-dockerfile "Moo"

4.上传镜像

  1. [root@bogon ~]# cat Dockerfile
  2. FROM debian:wheezy
  3. MAINTAINER hdlptz <hdlptz@163.com>
  4. RUN apt-get update && apt-get install -y cowsay fortune
  5. COPY entrypoint.sh /
  6. ENTRYPOINT ["/entrypoint.sh"]
  7. [root@bogon ~]# docker build -t hdlptz/cowsay:stable
  8. [root@bogon ~]# docker push hdlptz/cowsay:stable

5.镜像的命名空间

由镜像名称判断:

  • 以字符串和“/”开头,如hdlptz/revealjs,属于用户命名空间(user namespace)
  • 如debian或ubuntu的名称,不包含前缀或/,属于根命名空间(root namespace)
  • 以主机名或IP开头的名称,代表该镜像来自第三方的寄存服务,包括公司自己搭建的寄存服务

三、Redis镜像实例

  1. [root@bogon ~]# docker pull redis
  2. Using default tag: latest
  3. latest: Pulling from library/redis
  4. d13d02fa248d: Pull complete
  5. a1846f364e39: Pull complete
  6. dba901efed8c: Pull complete
  7. b54b43b9d049: Pull complete
  8. b5b9e2d5e9c6: Pull complete
  9. 7058d282fa00: Pull complete
  10. Digest: sha256:07e7b6cb753f8d06a894e22af30f94e04844461ab6cb002c688841873e5e5116
  11. Status: Downloaded newer image for redis:latest
  12. [root@bogon ~]# docker run -v /data test/webserver
  13. [root@bogon ~]# docker images
  14. REPOSITORY TAG IMAGE ID CREATED SIZE
  15. hubuser/webapp latest cbe52807fcad 7 hours ago 362MB
  16. redis latest 1fb7b6c8c0d0 13 days ago 107MB
  17. debian latest 874e27b628fd 13 days ago 100MB
  18. ubuntu 14.04 dea1945146b9 5 weeks ago 188MB
  19. busybox latest 54511612f1c4 5 weeks ago 1.13MB
  20. [root@bogon ~]# docker run --name myredis -d redis
  21. d07dd579ee128a9500b81507764edbcf81aef3281a22eee22fe04c74163c6986
  22. [root@bogon ~]# docker run --rm -it --link myredis:redis redis /bin/bash
  23. root@cbe4f668dba7:/data# redis-cli -h redis -p 6379
  24. redis:6379> ping
  25. PONG
  26. redis:6379> set "docker" 1234
  27. OK
  28. redis:6379> get "docker"
  29. "1234"
  30. redis:6379> exit
  31. root@cbe4f668dba7:/data# exit
  32. exit
  33. [root@bogon ~]# docker run --rm --volumes-from myredis -v $(pwd)/backup:/backup \
  34. debian cp /data/dump.rdb /backup/
  35. [root@bogon ~]# docker stop myredis
  36. [root@bogon ~]# docker rm -v myredis
  37. [root@bogon ~]# docker rm $(docker ps -aq)

Docker容器技术-基础命令的更多相关文章

  1. docker容器技术基础入门

    目录 docker容器技术基础入门 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 docker ...

  2. docker容器技术基础之联合文件系统OverlayFS

    我们在上篇介绍了容器技术中资源隔离与限制docker容器技术基础之linux cgroup.namespace 这篇小作文我们要尝试学习容器的另外一个重要技术之联合文件系统之OverlayFS,在介绍 ...

  3. Docker容器技术基础

    Docker基础 目录 Docker基础 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 doc ...

  4. Docker容器技术-基础与架构

    一.什么是容器 容器是对应用程序及其依赖关系的封装. 1.容器的优点 容器与主机的操作系统共享资源,提高了效率,性能损耗低 容器具有可移植性 容器是轻量的,可同时运行数十个容器,模拟分布式系统 不必花 ...

  5. 1.docker容器技术基础入门

    内容来自:https://www.cnblogs.com/marility/p/10215062.html https://blog.51cto.com/gouyc/2310785?source=dr ...

  6. docker容器技术基础之linux cgroup、namespace

    一.开头 接触过docker的同学多多少少听过这样一句话"docker容器通过linux namespace.cgroup特性实现资源的隔离与限制".今天我们来尝试学习一下这两个东 ...

  7. 1、docker容器技术基础入门

    Docker和传统虚拟机的区别               参考文章: https://lwn.net/Articles/531114/    操作中的命名空间详解 https://blog.yadu ...

  8. 1.云原生之Docker容器技术基础知识介绍

    转载自:https://www.bilibili.com/read/cv15180540/?from=readlist

  9. 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程 ...

随机推荐

  1. LeetCode递归 -2(Recursion) 培训专题 讲解文章翻译 (附链接) (2019-04-09 15:50)

    递归 - 空间复杂度  在本文中, 我们将讨论如何分析递归算法的空间复杂度. 在计算递归算法的空间复杂度时,最需要考虑的两个部分就是: 递归相关空间 (recursion related space) ...

  2. android EditText 限定中文个数与英文个数的解决方式

    EditText 限定中文8个英文16个的解决方法. 在EditText上控件提供的属性中有限定最大最小长度的方法. 可是,对于输入时,限定中文8个英文16个时,怎么办?相当于一个中文的长度是两个英文 ...

  3. 理解和使用WPF 验证机制(值得推荐)

    首先建立一个demo用以学习和实验WPF Data Validation机制.创建一个数据实体类: public class Employee { public string Name { get;  ...

  4. wpf数据绑定更新通知

    类似于这样子的;大致的意思是:一个代码变量,通过改变变量的值,绑定这个变量的这个圆颜色也在变化 就是一种心跳效果 在网上数据触发的感觉不多,废了不少时间,这里做个总结 1:通知 class Notif ...

  5. eclipse建maven pom报错

    pom报:org.apache.maven.archiver.MavenArchiver.getManifest 解决办法: 升级m2eclipse插件版本 help->install news ...

  6. 10道mysql查询语句面试题

    1.https://www.yanxurui.cc/posts/mysql/10-sql-interview-questions/ 2.http://mm.fancymore.com/reading/ ...

  7. 简单的c语言小程序 回光返照

    主函数 int main(int argc,char * argv[]) -- arg代表英文的参数缩写 c代表count计数 argc { return 0;  -- 0返还给系统,代表程序正确运行 ...

  8. [转]C#静态方法与非静态方法的比较

    http://wenku.baidu.com/view/4e1704084a7302768e9939e0.html C#的类中可以包含两种方法:C#静态方法与非静态方法.那么他们的定义有什么不同呢?他 ...

  9. 20160924-1——mysql存储引擎

    一.主要存储引擎 5.5以后的版本,默认存储引擎从myisam改成了innodb:线上推荐都用innodb 二.innodb存储引擎 (一)结构 INNODB存储引擎大致分三部分,图中已经(1)(2) ...

  10. Mybatis+MySql 一个标签中执行多条sql语句 这个坑 ,我心中有一句MMP

    解决办法 转自网友: 亲测 解决了问题@ MySql默认是不支持这种骚操作的,但是并不代表不能实现,只需要在jdbc的配置文件中稍做配置: driver=com.mysql.jdbc.Driverur ...