容器与虚拟机:
什么是容器:运行在操作系统内核之上的用户空间,程序打包、隔离的技术,直接调用操作系统的接口,在内核中已经存在很久了,并不是新技术。
虚拟机:在宿主机上有一层hypervisor虚拟层,虚拟出硬件和设备,并安装GuestOs,需要通过模拟层和管理层运行各种各样的程序。
最主要的:虚拟机通过中间层将一台或多台独立的机器虚拟运行与物理硬件之上,而容器没有虚拟机层,会比虚拟机轻量很多,运行的效率也会更高。
容器的问题:
1)由于直接运行在操作系统内核之上的用户空间,所以容器只能运行与底层宿主机相同或相似的操作系统
2)会被操作系统内核之上的用户空间影响,所以容器被认为是不安全的
3)复杂、不易安装、管理和自动化困难
随着容器技术的发展,容器和宿主机之间的隔离更加彻底,如拥有独立的网络、存储栈、资源管理能力,使得同一台宿主机中的多个容器可以友好的共存。
这些主要得益于linux的一些内核特性:如控件组、命名空间技术
docker与容器:
docker是容器技术的代表,能理顺软件包的问题:在docker上运行镜像非常容易,且不用做各种环境的配置
docker组件
client:用来跟用户交互,接收命令,如docker build/pull/run
host: daemon(守护进程,执行命令) + containers(容器) + images(镜像)
registry: 镜像的注册机,上面存储仓库,分为私有仓库和公有仓库
docker客户端:docker客户端接收用户输入请求,并转发给docker的守护进程,守护进程执行请求并返回结果
docket镜像:镜像是基于联合文件系统的一种层式的结构,由一系列指令构建出来,如:添加一文件 执行命令 打开端口,也可把镜像当做容器的源代码。
registry:注册机,用来保存用户构建的镜像,分为共有和私有两种。公共registry是Docker Hub,包含的镜像如nginx mysql等,也可以用来保存私有镜像。
容器:用户把自己的应用程序打包放进容器。容器基于镜像启动起来,容器中可以运行一个或多个进程。镜像是docker生命周期中构建阶段,容器则是运行阶段。
docker容器:一个镜像格式 一系列标准的操作 一个执行环境
docker做什么
开发环境中构建容器,再提交到测试和生产,加速开发和构建流程,更加高效和轻量化。
让独立服务或应用程序在不同环境中能得到相同的运行结果。
docke创建隔离的环境来进行测试
docker技术组价包括:
原生的linux容器格式 linux内核空间 进程、网络、cpu、内存等资源隔离 写时复制 日志 交互式shell
不同平台安装docker
命令安装 脚本安装 二进制安装
1 校验基本环境 包括device-mapper,linux内核版本
2 执行安装
3 启动docker
sudo systemctl start docker #启动java进程
sudo systemctl enable docker #设置docker服务开机自启动
sudo docker info #验证docker是否已经正确安装并运行
docker软件包安装完毕后,默认会立即启动docker守护进程。
守护进程监听 /var /run/docker.sock这个uninx套集资文件,来获取来自客户端的docker请求。
docker入门指令
docker pull hello-world #来拉取hello-world镜像
docker image #查看当前的镜像
docker run hello-world #运行上面的镜像。
获取docker指令解释
docker help
某个指令的详情 如run
docker run --help
docker info
结果分为client 和 server(即docker程序即可作为客户端也可作为服务端)
client中展示是否debug模式 插件信息
server:包括容器、镜像、执行/存储/日志、cgroup驱动、插件、内核、cpu、内存,id等信息
运行第一个容器
docker run -i -t ubuntu /bin/bash
这是创建并启动一个容器的指令实例,指令详解:
docker run表示执行run指令
-i 保证容器中的stdin是开启的,持久的标准输入是交互式shell的半边天
-t 告诉docket为容器分配一个伪tty终端
这样:新创建的容器才能提供一个交互式的shell,若要在命令行下创建一个能交互的容器,不是一个运行后台服务的容器,必定要包含这两个参数。
ubuntu说明以ubuntu镜像为基础镜像,docker有多种基础镜像,如fedroa\debian\centos等。
目前为止,我们基于此镜像启动了一个容器,但并没有对容器增加任何东西。
执行逻辑:docker首先会检查本地是否存在ubuntu镜像,如果本地没有,docke会连接官方维护的docker hup registry。如果找到该镜像,就会下载该镜像并将其保存到本地宿主机中。
随后,docker在文件系统内部用这个文件创建了一个容器。该容器拥有自己的网络、ip地址,以及一个用来和宿主机进行通信的桥接网络接口。
最后我们告诉docker在新容器中运行什么命令,在上面指令中运行了/bin/bash命令启动了一个Bash shell。容器创建完成,就会在容器中执行该命令。
上面命令执行完后的状态就是已经登录到了新容器中,并启动了bash shell。
下面的指令用于创建一个容器,但是不启动且不进入该容器
docker create --name mz_container -i -t ubuntu
容器中的相关指令
hostname 返回8adc038d0825,这就是该容器的主机名(即容器id)。
root@8adc038d0825:/# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 8adc038d0825
说明:docker已在hosts文件中为该容器的ip地址添加了一条主机配置项
ps -aux 获取容器中运行的进程
touch a.text新建一个文件
vi a.text 编辑文件,但是提示如下:
bash: vi: command not found
下面指令安装vim软件:
apt-get update && apt-get install vim
exit
会退出容器,回到宿主机的命令行中。并且一旦容器中指定的/bin/bash命令结束,容器也会停止运行。但此时容器仍是存在的。
docker ps 查看正在运行中的容器
docker ps -a 查看当前系统中的容器列表