Docker 核心技术与实现原理

Docker 核心技术与实现原理

一、为什么要学Docker?

首先我们要说一下云平台

云计算包括三个层次的服务:基础架构即服务IaaS,平台即服务PaaS和软件即服务SaaS

IaaS

通过互联网提供数据中心、基础架构硬件和软件资源,还可以提供服务器、操作系统、磁盘存储、数据库和/或信息资源。

Paas

提供了基础架构,软件开发者可以在这个基础架构之上建设新的应用,或者扩展已有的应用,同时却不必购买开发、质量控制或生产服务器。

SaaS

最为成熟、最出名,也是得到最广泛应用的一种云计算。它是一种软件分布模式,在这种模式下,应用软件安装在厂商或者服务供应商那里,用户可以通过某个网络来使用这些软件,通常使用的网络是互联网。

总结:*

IaaS、PaaS和SaaS之间的关系可从两个角度来看:从用户体验角度而言,它们之间的关系是独立的,因为它们面对不同类型的用户;而从技术角度而言,它们并不是简单的继承关系(SaaS基于PaaS,而PaaS基于IaaS),因为首先SaaS可以是基于PaaS或者直接部署于IaaS之上,其次PaaS可以构建于IaaS之上,也可以直接构建在物理资源之上。

IaaS、PaaS和SaaS这三种模式都采用了外包的方式,以减轻企业负担,降低管理、维护服务器硬件、网络硬件、基础架构软件和应用软件的人力成本。从更高的层次上看,它们都试图去解决同一个商业问题——用尽可能少甚至是为零的资本支出,获得功能、扩展能力、服务和商业价值。

          2.jpg-35.2kB

老一代的PAAS平台的局限性和困境

  1. 主要提供应用的部署和托管
  2. 针对应用开发者
  3. 仅支持特定的laaS基础技术
  4. 支持单种开发语言和框架
  5. 支持特定的服务,比如自定义的数据存储APIs
  6. 没有很好的解决常用中间件的部署问题
  7. 难以解决应用和资源的隔离问题

新一代的PAAS平台 
111.png-402.4kB


二、Docker技术原理介绍

  image_1c9o98j7iuuh14ml1fg31pgsls2h.png-161.9kB

1. Docker核心技术之cgroups

Linux中经常有个需求就是希望能限制某个或者某些进程的分配资源。于是就出现了cgroups的概念,cgroup就是controller[kənˈtrəʊlə(r)控制器] group,在这个group中,有分配好的特定比例的CPU时间,IO时间,可用内存大小等。cgroups是将任意进程进行分组化管理的Linux内核功能。最初由Google的工程师提出,后来被整合进Linux内核中。
    cgroups中的重要概念是 "子系统",也就是资源控制器,每个子系统就是一个资源的分配器,比如cpu子系统是控制cpu时间分配的。首先挂载子系统,然后才有control group的。比如先挂载memory子系统,然后在memory子系统中创建一个cgroup节点,在这个节点中,将需要控制的进程id写入,并且将控制的属性写入,这就完成了内存的资源限制。

    cgroups被Linux内核支持,有得天独厚的性能优势,发展势头迅猛。在很多领域可以取代虚拟化技术分割资源。cgroup默认有诸多资源组,可以限制几乎所有服务器上的资源:cpu mem iops,iobandwide,net,device acess等

2.Docker核心技术之LXC

LXC是Linux containers的简称,是一种基于容器的操作系统层级的虚拟化技术。借助于namespace的隔离机制和cgroup限额功能,LXC提供了一套统一的API和工具来建立和管理container。LXC跟其他操作系统层次的虚拟化技术相比,最大的优势在于LXC被整合进内核,不用单独为内核打补丁

LXC提供一个kernel的OS级虚拟化方法,在执行时不用重复加载Kernel,且container的kernel与host共享,因此可以大大加快container的启动过程,并显著减少内存消耗,容器在提供隔离的同时,还通过共享这些资源节省开销,这意味着容器比真正的虚拟化的开销要小得多。在实际测试中,基于LXC的虚拟化方法的IO和CPU性能几乎接近baremetal的性能

虽然容器所使用的这种类型的隔离总的来说非常强大,然后是不是像运维在hypervisor上的虚拟机那么强壮仍具有争议性,如果内核停止,那么所有的容器就会停止运行。

性能方面:LXC > KVM > XEN
内存利用率:LXC > KVM > XEN
隔离程度:XEN > KVM > LXC

如果有应用需要对kernel操作,是无法单独修改和单独部署的,因为是使用的共享kernel,容器不支持修改。

3.Docker核心技术之AUFS

什么是AUFS? AuFs是一个能透明覆盖一或多个现有文件系统的层状文件系统。支持将不同目录挂载到同一个虚拟文件系统下,可以把不同的目录联合在一起,组成一个单一的目录。这种是一种虚拟的文件系统,文件系统不用格式化,直接挂载即可。

Docker一直在用AuFS作为容器的文件系统。当一个进程需要修改一个文件时,AuFS创建该文件的一个副本。AuFS可以把多层合并文件系统的单层表示。这个过程称为写入复制(copy on write)

AuFS允许Docker把某种镜像作为容器的基础。例如,你可能有一个作为很多不同容器的Centos系统镜像。多亏AuFS,只要一个CentOS镜像的副本就够了,这样既节省了存储和内存,也保证更快速的容器部署。

使用AuFS的另一个好处是Docker的版本容器镜像能力,每个新版本都是一个与之前版本的简单差异改动,有效地保持镜像文件最小化。dan但,这也意味着你总是要有一个记录该容器从一个版本到另一个版本的改动的审计跟踪。

最早支持这项技术的是ubantu,后来RedHat看到这个技术比较好,跟docker配合把这项技术移植到RedHat上。AuFS相当于我们使用的ps,会在底层创建一个图像,每次修改只修改添加一个副本,并不影响底层。

4.Docker原理之App打包 
133.png-115kB

LXC的基础上,Docker额外提供的Feature包括:标准统一的打包部署运行方案
为了最大化重要Image,加快运行速度,减少内存和磁盘footprint,Docker container运行时所构造的运行环境,实际上是具有依赖关系的多个Layer组成的。例如一个apache的运行环境可能是在基础的rootfs image的基础上,叠加了包含例如Emacs等各种工具的image,再叠加包含apache及其相关以来library的image,这些image由AUFS文件系统加载合并到统一路径中,以只读的方式存在,最后再叠加加载一层可写的空白的Layer用作记录对当前运行环境所做的修改。
有了层级化的Image做基础,理想中,不同的APP就可以既可能的共用底层文件系统,相关依赖工具等,同一个APP的不同实现也可以实现共用绝大多数数据,进而以copy on write的形式维护自己的那一份修改过的数据等。

5.Docker全生命周期开发模式

image_1cbbv3pdmfqa148lr6tn70hhj9.png-384.9kB

Docker正在迅速改变云计算领域的运作规则,并彻底覆盖云技术的发展前景。从持续集成/持续交付到微服务、开源协作乃至DevOps已经给应用程序开发周期以及云工程技术实践带来了巨大变革。


Docker Hub相当于SVN服务器(用于存储打包好的image),如果我们启动一个image,本地没有会前往Docker Hub上拉取。

镜像变成全球性的,不需要我们自己安装MySQL,配置参数


当我们使用docker,docker Hub上镜像是全球性的,安装服务不需要我们手动编辑,配置参数等。有一个专门用于Docker的标准化的镜像


只要我们在Docker Hub上有镜像,我们可以在任意的Docker环境运行。 [笔记本、公有云、服务器、IBM、HP、亚马逊等]

三、Docker 的基本概念

1. Docker Image

Docker image 是一个极度精简版的Linux程序运行环境,比如vi这种基本的工具都没有,官网的JAVA镜像包括的东西更少,除非镜像叠加方式的,如Centos+JAVA7
Docker Image内不建议有运行期需要修改的配置文件
DockerFile用来创建一个自定义的Image,包含了用户指定的软件依赖等。当前木偶下包含Dockerfile,使用命令build来创建新的image
Docker image的最佳实践之一是尽量重用和使用网上公开的基础镜像
Docker image不建议存放配置文件,因为build一次需要十几分钟,建议配置文件通过参数传进去

Docker image 尽量不要打一个非标准的镜像

2. Docker Container

Docker Container是image的实例,共享内核
Docker Container里可以运行不同Os的Image,比如Ubuntu的或者Centos
Docker Container不建议内部开启一个SSHD服务,1.3版本后新增了docker exec命令进入容器排查
Docker Container没有IP地址,通常不会有服务端口暴露

Container 是共享内核,里面可以运行多个image[Centos,RedHat等]
不建议使用SSH服务登陆到Container [1]

3.Docker Container生命周期

image_1cdmkmb5715j482b12sq88ebjc9.png-40.2kB

Container不仅仅是后台程序,也可以是临时程序。比如我们就做个计算,计算完输出结束

4.Docker Daemin

Docker Daemon是创建和运行Container的Linux守护进程,也是Docker最主要的核心组件
Docker Daemon可以理解为Docker Container的Container
Docker Daemon可以绑定本地端口并提供Rest API服务,用来远程访问和控制


我们可以将Docker Daemon理解为tomcat 将Container理解为web[2]

5.Docker Registry/Hub

Docker之所以这么吸引人,除了它的新颖的技术外,围绕官网的Registry(Docker Hub)的生态圈也相当吸引人眼球的地方。在Docker Hub上你可以轻松下载到大量已经容器化好的应用镜像,即拉即用。这些镜像中,有些是Docker官网维护的,更多的是众多开发者自发上传分享的。而且你可以在Docker Hub中绑定你的代码托管系统(目前支持Github和Bitbucker)配置自动生成镜像功能,这样Docker Hub会在你代码更新时自动生成对应的Docker镜像[3]

在企业环境中,我们需要搭建一个私有的Registry(相当于私有的yum源)来方便我们下载部署,公有的会因为网络访问不到

6.Docker核心组件介绍 
image_1cdmncn2hmre132cs1t3mf5ejm.png-43.2kB

Docker Client通过Docker api来和Docker Daemon沟通,来创建Container(创建/停止) 默认下载镜像是Docker Hub,需要我们手动指定。我们需要在image里面指定Docker Registry


NameSpace:

	内核级别,环境隔离;
	
	PID NameSpace:Linux 2.6.24,PID隔离
	Network NameSpace:Linux 2.6.29,网络设备、网络栈、端口等网络资源隔离
	User NameSpace:Linux 3.8,用户和用户组资源隔离
	IPC NameSpace:Linux 2.6.19,信号量、消息队列和共享内存的隔离
	UTS NameSpace:Linux 2.6.19,主机名和域名的隔离;
	Mount NameSpace:Linux 2.4.19,挂载点(文件系统)隔离;
	
	API:clone(), setns(), unshare();
	
CGroup:Linux Control Group, 控制组, Linux 2.6.24
	内核级别,限制、控制与一个进程组群的资源;
	
	资源:CPU,内存,IO
	
	功能:
		Resource limitation:资源限制;
		Prioritization:优先级控制;
		Accounting:审计和统计,主要为计费;
		Control:挂起进程,恢复进程;
		
	/sys/fs/cgroup
	mount
	lssubsys -m
	
	CGroups的子系统(subsystem):
		blkio:设定块设备的IO限制;
		cpu:设定CPU的限制;
		cpuacct:报告cgroup中所使用的CPU资源;
		cpuset:为cgroup中的任务分配CPU和内存资源;
		memory:设定内存的使用限制;
		devices:控制cgroup中的任务对设备的访问;
		freezer:挂起或恢复cgroup中的任务;
		net_cls:(classid),使用等级级别标识符来标记网络数据包,以实现基于tc完成对不同的cgroup中产生的流量的控制;
		perf_event:使用后使cgroup中的任务可以进行统一的性能测试;
		hugetlb:对HugeTLB系统进行限制;
		
	CGroups中的术语:
		task(任务):进程或线程;
		cgroup:一个独立的资源控制单位,可以包含一个或多个子系统;
		subsystem:子系统
		hierarchy:层级
	
AUFS:UnionFS
	UnionFS:把不同的物理位置的目录合并到同一个目录中。
	
	Another UFS, Alternative UFS, Adanced UFS
	
Device mapper:
	Linux 2.6内核引入的最重要的技术之一,用于在内核中支持逻辑卷管理的通用设备映射机制;
		Mapped Device
		Mapping Table
		Target Device

四、Docker 安装

Docker官网:www.docker.com

注: 
Docker 需要在内核3.8版以上,所以我们需要在Centos7上进行操作 
Dcoker Engine改为Docker CE(社区版) 
Docker Data Center改为Docker EE(企业版)

##### Docker 环境准备 ##### 
Docker官网yum源:http://yum.dockerproject.org/repo/main/ 
支持不同版本

 
  1. 1.关闭防火墙
  2. $ systemctl stop firewalld
  3. $ systemctl disable firewalld
  4. 2.修改主机名
  5. $ hostnamectl set-hostname abc
  6. $ vim /etc/hostname
  7. abc
  8. $ bash #默认重启生效,我们可以使用bash刷新
  9. 3.关闭SElinux
  10. $ sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
  11. 4.设置Yum
  12. $ curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  13. $ wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  14. $ yum clean all && yum makecache

1.安装docker

 
  1. ####下载yum源及依赖包
  2. $ yum install -y yum-utils \
  3. device-mapper-persistent-data \
  4. lvm2
  5. $ yum-config-manager \
  6. --add-repo \
  7. https://download.docker.com/linux/centos/docker-ce.repo
  8. $ yum install docker-ce ##yum安装docker

2.启动Docker并设置开机启动

 
  1. [root@docker ~]# systemctl start docker ##启动docker
  2. [root@docker ~]# systemctl enable docker
  3. 我们可以检查进程是否正常
  4. [root@abc ~]# ps -ef|grep docker
  5. root 23450 1 2 05:29 ? 00:00:00 /usr/bin/dockerd
  6. root 23454 23450 0 05:29 ? 00:00:00 docker-containerd --config /var/run/docker/containerd/containerd.toml
  7. root 23609 23416 0 05:29 pts/1 00:00:00 grep --color=auto docker
  8. ########################
  9. 关闭开机启动
  10. [root@abc ~]# systemctl disable docker

3.安装Iptables 首先Centos7将direwalld代替了iptables,但是docker里面有端口映射的地方需要使用iptables,所以我们需要关闭direwalld,安装iptables

 
  1. [root@abc ~]# systemctl disable firewalld #关闭开机启动
  2. [root@abc ~]# yum install iptables-services -y #yum安装iptables
  3. [root@abc ~]# systemctl start iptables #启动iptables
  4. [root@abc ~]# systemctl enable iptables #设置开机启动
  5. Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
  6. [root@abc ~]# iptables -L -n #查看Iptbles规则
  7. Chain INPUT (policy ACCEPT)
  8. target prot opt source destination
  9. ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
  10. ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
  11. ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
  12. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
  13. REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
  14. Chain FORWARD (policy ACCEPT)
  15. target prot opt source destination
  16. REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
  17. Chain OUTPUT (policy ACCEPT)
  18. target prot opt source destination

4.查看docker版本

 
  1. 我们可以使用docker info 命令查看docker的信息
  2. [root@abc ~]# docker info
  3. Containers: 1
  4. Running: 0
  5. Paused: 0
  6. Stopped: 1
  7. Images: 1
  8. Server Version: 18.03.1-ce
  9. Storage Driver: devicemapper
  10. Pool Name: docker-253:0-374488-pool
  11. Pool Blocksize: 65.54kB
  12. Base Device Size: 10.74GB
  13. Backing Filesystem: xfs
  14. Udev Sync Supported: true
  15. Data file: /dev/loop0
  16. Metadata file: /dev/loop1
  17. Data loop file: /var/lib/docker/devicemapper/devicemapper/data
  18. Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
  19. Data Space Used: 244.5MB
  20. Data Space Total: 107.4GB
  21. Data Space Available: 38.78GB
  22. Metadata Space Used: 745.5kB
  23. Metadata Space Total: 2.147GB
  24. Metadata Space Available: 2.147GB
  25. Thin Pool Minimum Free Space: 10.74GB
  26. Deferred Removal Enabled: true
  27. Deferred Deletion Enabled: true
  28. Deferred Deleted Device Count: 0
  29. Library Version: 1.02.146-RHEL7 (2018-01-22)
  30. Logging Driver: json-file
  31. Cgroup Driver: cgroupfs
  32. Plugins:
  33. Volume: local
  34. Network: bridge host macvlan null overlay
  35. Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
  36. Swarm: inactive
  37. Runtimes: runc
  38. Default Runtime: runc
  39. Init Binary: docker-init
  40. containerd version: 773c489c9c1b21a6d78b5c538cd395416ec50f88
  41. runc version: 4fc53a81fb7c994640722ac585fa9ca548971871
  42. init version: 949e6fa
  43. Security Options:
  44. seccomp
  45. Profile: default
  46. Kernel Version: 3.10.0-327.el7.x86_64
  47. Operating System: CentOS Linux 7 (Core)
  48. OSType: linux
  49. Architecture: x86_64
  50. CPUs: 1
  51. Total Memory: 1.782GiB
  52. Name: abc
  53. ID: 4H7V:3PAO:3VWL:IBOV:IWIR:DJ4G:LXND:AFQV:6F3A:B5T5:LDEQ:5JXW
  54. Docker Root Dir: /var/lib/docker
  55. Debug Mode (client): false
  56. Debug Mode (server): false
  57. Registry: https://index.docker.io/v1/
  58. Labels:
  59. Experimental: false
  60. Insecure Registries:
  61. 127.0.0.0/8
  62. Live Restore Enabled: false
  63. WARNING: devicemapper: usage of loopback devices is strongly discouraged for production use.
  64. Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
  65. WARNING: bridge-nf-call-iptables is disabled
  66. WARNING: bridge-nf-call-ip6tables is disabled
  67. #注Docker 1.8对centos6是彻底不支持的
  68. 查看Docker版本号
  69. [root@abc ~]# docker version
  70. Client: #Docker 客户端版本
  71. Version: 18.03.1-ce
  72. API version: 1.37
  73. Go version: go1.9.5
  74. Git commit: 9ee9f40
  75. Built: Thu Apr 26 07:20:16 2018
  76. OS/Arch: linux/amd64
  77. Experimental: false
  78. Orchestrator: swarm
  79. Server: #Docker 服务端版本
  80. Engine:
  81. Version: 18.03.1-ce
  82. API version: 1.37 (minimum version 1.12)
  83. Go version: go1.9.5
  84. Git commit: 9ee9f40
  85. Built: Thu Apr 26 07:23:58 2018
  86. OS/Arch: linux/amd64
  87. Experimental: false
  88. Docker客户端和服务端通过API(发送app请求)来进行交互

5. Docker 配置文件与日志 Centos配置文件路径/usr/lib/systemd/system/docker.service 默认配置文件如下: image_1cfuh8j0l1tgfk511rmv1ujd1s7q9.png-3340.3kB

重要参数介绍

-H 表示Docker Daemon绑定的地址,  -H=unix:///var/run/docker.sock -H=tcp://0.0.0.0:2222
--registry-mirror 表示Docker Registry的镜像地址    --registry-mirror=http://镜像地址
--insecure-registry 表示本地私有Docker Registry的地址,  --insecure-registry $(pivateRegistryHost):5000
--selinux-enabled是否开启SElinux,默认开启 --selinux-enabled=true
--bip表示网桥docker0使用指定CIDR网络地址,   --bip=10.0.0.1
-b 表示采用已经创建好的网桥, -b=xxx

OPTIONS:
OPTIONS=-H=unix:///var/run/docker.sock -H=tcp://0.0.0.0:222 --registry-mirror=http://4bc5abed.m.daocloud.io --selinux-enabled=true


下面是代理的配置
http_proxy=XXXXX:8080
https_proxy=XXXXX:8080
代理需要配置在Server标签上,填写完成之后需要重启服务

image_1cfuii6l9hecar9s2i1epc1mhsm.png-57.9kB

6.拉取镜像启动

 
  1. [root@docker ~]# docker pull centos ##拉取centos镜像
  2. Using default tag: latest
  3. latest: Pulling from library/centos
  4. 85432449fd0f: Pull complete
  5. Digest: sha256:3b1a65e9a05f0a77b5e8a698d3359459904c2a354dc3b25ae2e2f5c95f0b3667
  6. Status: Downloaded newer image for centos:latest
  7. [root@docker ~]# docker images ##插件镜像
  8. REPOSITORY TAG IMAGE ID CREATED SIZE
  9. centos latest 3fa822599e10 5 weeks ago 204MB
  10. [root@docker ~]# docker run -i -t centos /bin/bash ##进入容器
  11. [root@f3894984f6c6 /]#
  12. [root@f3894984f6c6 /]# cat /etc/redhat-release ##查看容器系统版本
  13. CentOS Linux release 7.4.1708 (Core)

7.Docker 日志文件 Docker 日志文件写入到/var/log/messages,Docker日志会含有我们的网桥信息,存储模式以及启动过程ipv4地址

image_1cfuj9mbm155a1fug1elj19gt10ej9.png-4593.8kB

当我们发现错误的时候,命令行是不能够提供提示的时候,我们就去查看docker 的日志,并且日志级别也是可以调节的。

8.Docker search 应用 命令行执行docker search java image_1cfujnsgk1i2o187t1m21956nmjr.png-2107.5kB

更多参数

 
  1. --automated #只列出automated build类型的镜像
  2. --no-trunc #显示完整的镜像描述
  3. -s #列出收藏数不小于指定值的镜像

从Docker Hub 查找所有镜像名包含java,并且收藏数大于10的

 
  1. runoob@runoob:~$ docker search -s 10 java
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. java Java is a concurrent, class-based... 1037 [OK]
  4. anapsix/alpine-java Oracle Java 8 (and 7) with GLIBC ... 115 [OK]
  5. develar/java 46 [OK]
  6. isuper/java-oracle This repository contains all java... 38 [OK]
  7. lwieske/java-8 Oracle Java 8 Container - Full + ... 27 [OK]
  8. nimmis/java-centos This is docker images of CentOS 7... 13 [OK]
  9. #更新一个image会非常快,因为底层的包不变,只是更新上层的包会比较快。在加上docker image是分层下载。有断点续传的功能。只是更新变动部分

五、Docker 基础命令介绍

1.Docker Images

 
  1. [root@abc ~]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. docker latest 2232c0bbbb8c 2 weeks ago 133MB
  4. centos latest e934aafc2206 7 weeks ago 199MB
  5. java latest d23bdf5b1b1b 16 months ago 643MB
  6. [root@abc ~]#
  7. REPOSITORY 相当于目录名称
  8. TAG 版本号
  9. IMAGE ID 唯一的ID
  10. CREATED 下载时间
  11. SIZE 文件大小
  12. #例如Java镜像600多M,里面包含了linux一些文件

2.Docker RUN

决定容器的运行方式,前台执行还是后台执行
docker run 后面追加-d=true或者-d,那么容器将会运行在后台模式
docker exec来进入到该容器中,或者attach重新连接容器的会话

进行交互式操作(例如Shell脚本),那我们必须使用-i -t参数同容器进行数据交互
docker run 时没有指定--name,那么de会自动生成一个随机符UUID
Docker时有自动化需求,可以将containerID输出到指定的文件中(PIDfile):--cidfile=""
Docker的容器是没有特权的,例如不能在容器中再启动一个容器.这是因为默认情况下容器是不能访问其他设备的,但是通过privileged,容器就拥有了访问任何其它设备的权限.
 
  1. 查看docker 容器java 版本
  2. [root@abc ~]# docker run -it java java -version
  3. openjdk version "1.8.0_111"
  4. OpenJDK Runtime Environment (build 1.8.0_111-8u111-b14-2~bpo8+1-b14)
  5. OpenJDK 64-Bit Server VM (build 25.111-b14, mixed mode)
  6. java 表示镜像
  7. -it 表示交互模式

image_1cfukbrhc7fr1ee3sjn1r1sjtj18.png-33.2kBdocker run 里面的命令结束了 container就结束了

 
  1. [root@abc ~]# docker run -it java ps
  2. PID TTY TIME CMD
  3. 1 pts/0 00:00:00 ps
  4. [root@abc ~]# docker run -it java pwd
  5. /
  6. 容器里面会分配一个合适的地址
  7. [root@abc ~]# docker run -it java ip addr
  8. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
  9. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  10. inet 127.0.0.1/8 scope host lo
  11. valid_lft forever preferred_lft forever
  12. 22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  13. link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
  14. inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
  15. valid_lft forever preferred_lft forever
  16. 每个容器都分配一个IP地址,本机是可以ping通的
  17. 查看容器的环境变量
  18. [root@abc ~]# docker run -it java env
  19. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  20. HOSTNAME=2d54ad472c74 #主机名
  21. TERM=xterm
  22. LANG=C.UTF-8
  23. JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 #Java的版本
  24. JAVA_VERSION=8u111
  25. JAVA_DEBIAN_VERSION=8u111-b14-2~bpo8+1
  26. CA_CERTIFICATES_JAVA_VERSION=20140324
  27. HOME=/root

3.Docker exec

 
  1. Docker exec docker 官方提供的技术
  2. docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
  3. -d 在后台执行命令
  4. -e 设置环境变量
  5. -i 即使没有连接,也要保持STDIN打开
  6. --privileged 给命令赋予扩展权限
  7. -t 分配一个TTY
  8. -u 设置用户名

4.Docker attach

 
  1. docker attach 是连接到容器中,把当前容器的连接输出(如果我们不注意,退出容器的时候会把容器给Kill)
  2. docker attach [OPTIONS] CONTAINER
  3. [root@localhost ~]# docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 2faf24118766 192.168.1.23:5000/tomcat7 "/bin/bash" 4 days ago Up About an hour 0.0.0.0:8888->8080/tcp tomcat
  6. [root@localhost ~]# docker attach tomcat
  7. [root@2faf24118766 /]# exit #按住ctrl+d退出当前窗口
  8. [root@localhost ~]# docker ps #发现该容器也停止了!!
  9. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  10. 当多个窗口同时attach到同一个容器时,所有的窗口都会同步的显示,假如其中的一个窗口发生阻塞时,其它的窗口也会阻塞,docker attach命令可以说是最不方便的进入后台docker容器的方法

5.Docker Create

 
  1. 以前我们docker 都是用run,新的版本可以使用creare
  2. create仅仅生成一个容器,但是不启动它
  3. docker create #创建容器
  4. --name #容器名称
  5. -e #代表环境变量,docker的配置文件大部分写在环境变量中
  6. -p #端口映射,映射容器中的3307到物理机的3307端口
  7. docker start Name #启动容器
  8. docker stop Name #停止容器

image_1cg0oht6u6rm4emdc213m41vnf1l.png-1062.3kB

6.Docker Ps

 
  1. 查看容器列表
  2. docker ps [OPTIONS]
  3. -a [--all] #显示所有容器(默认显示正在运行的)
  4. -f [--filter] #根据提供的条件进行过滤输出
  5. --format #漂亮的打印容器使用GO模板
  6. -n [last] #显示最后创建的容器(包括所有状态)
  7. -l [latest] #显示最新创建的容器(包括所有状态)
  8. --no-trunc #不要截断输出
  9. -s [-size] #显示总文件大小

QQ图片20180615152153.jpg-952.2kB

7.Docker rm

 
  1. 删除一个或多个容器
  2. docker rm [OPTIONS] CONTAINER [CONTAINER...]
  3. -f [--force] #强制删除正在运行的容器
  4. -l [--link] #删除指定的连接
  5. -v [--volumes] #删除与容器关联的卷
  6. 例子
  7. 取出一个容器
  8. 这将删除链接中引用的容器 /redis
  9. $ docker rm /redis
  10. /redis
  11. 删除--link在默认网桥上指定的链接
  12. 这将删除 默认网桥网络/webapp与/redis容器之间的基础链接,从而移除两个容器之间的所有网络通信。这--link与用户指定的网络一起使用时不适用。
  13. $ docker rm --link /webapp/redis
  14. /webapp/redis
  15. 强制删除正在运行的容器
  16. 该命令将强制删除正在运行的容器。
  17. $ docker rm --force redis
  18. redis
  19. 链接下引用的容器内的主进程redis将收到 SIGKILL,然后该容器将被删除。
  20. 删除所有停止的容器
  21. $ docker rm $(docker ps -a -q)
  22. 该命令将删除所有停止的容器。该命令 docker ps -a -q将返回所有现有的容器ID并将它们传递给rm将删除它们的命令。任何正在运行的容器都不会被删除。
  23. 取出容器及其容量
  24. $ docker rm -v redis
  25. redis
  26. 该命令将删除容器及与其相关的任何卷。请注意,如果卷是使用名称指定的,则不会被删除。
  27. 取出容器并选择性地移除卷
  28. $ docker create -v awesome:/foo -v /bar --name hello redis
  29. hello
  30. $ docker rm -v hello
  31. 在本例中,音量/foo将保持不变,但音量 /bar将被删除。同样的行为适用于继承的卷 --volumes-from

111.jpg-459.8kB

8.Docker rmi

 
  1. 删除一个或多个镜像
  2. docker rmi [OPTIONS] IMAGE [IMAGE...]
  3. -f [--force] 强制删除镜像
  4. --no-prune 不删除未标记的
  5. 您可以使用其短或长ID,其标记或摘要来移除图像。如果图像具有一个或多个引用它的标签,则必须在图像移除之前将其全部删除。摘要引用会在标签删除图像时自动删除。
  6. $ docker images
  7. REPOSITORY TAG IMAGE ID CREATED SIZE
  8. test1 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
  9. test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
  10. test2 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
  11. $ docker rmi fd484f19954f
  12. Error: Conflict, cannot delete image fd484f19954f because it is tagged in multiple repositories, use -f to force
  13. 2013/12/11 05:47:16 Error: failed to remove one or more images
  14. $ docker rmi test1
  15. Untagged: test1:latest
  16. $ docker rmi test2
  17. Untagged: test2:latest
  18. $ docker images
  19. REPOSITORY TAG IMAGE ID CREATED SIZE
  20. test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
  21. $ docker rmi test
  22. Untagged: test:latest
  23. Deleted: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8
  24. 如果您使用该-f标志并指定图像的短或长ID,那么此命令将除去并删除与指定ID匹配的所有图像。
  25. $ docker images
  26. REPOSITORY TAG IMAGE ID CREATED SIZE
  27. test1 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
  28. test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
  29. test2 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
  30. $ docker rmi -f fd484f19954f
  31. Untagged: test1:latest
  32. Untagged: test:latest
  33. Untagged: test2:latest
  34. Deleted: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8
  35. 由摘要拉取的图像没有与其关联的标签:
  36. $ docker images --digests
  37. REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
  38. localhost:5000/test/busybox <none> sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf 4986bf8c1536 9 weeks ago 2.43 MB
  39. 使用摘要删除图像:
  40. $ docker rmi localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf
  41. Untagged: localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf
  42. Deleted: 4986bf8c15363d1c5d15512d5266f8777bfba4974ac56e3270e7760f6f0a8125
  43. Deleted: ea13149945cb6b1e746bf28032f02e9b5a793523481a0a18645fc77ad53c4ea2
  44. Deleted: df7546f9f060a2268024c8a230d8639878585defcc1bc6f79d2728a13957871b

六、DockerFile


[1] 因为sshd需要把用户名密码在里面配置好,但用户名密码有可能暴露,用户名密码的修改也需要我们冲洗build镜像 

[2] Docker Rest API是重点,很多项目会用Docker Rest API来管理容器 

[3] Docker 公司不允许DaoCloud做克隆,只允许本地没有去Docker hub上下载,并且Docker Hub是企业的,面向收费 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值