本文共 10540 字,大约阅读时间需要 35 分钟。
讲到Docker不得不说下虚拟化
在计算机术语中虚拟化技术或虚拟技术(Virtualization)是一种资源管理技术,它虚拟的是整个PC硬件。也就是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个计算机配置环境。来由此打破实体结构间的不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些计算机硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制(摘自 wikipedia)
容器与虚拟化
容器虚拟化之 Docker
Docker的初始版本是在2013年开发出来的,使用的是Go语言开发并且遵循Apache2.0协议,是一个开放源代码软件项目。让应用程序部署在容器化下的工作可以自动化进行,借此在Linux操作系统上提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。更多的Docker周边请浏览 ,
Docker利用Linux核心中的资源分离机制,CGroup及Linux核心名称空间(NameSpace),来创建独立的容器(containers)。这可以在单一Linux实体下运作,避免启动一个虚拟机造成的额外负担。Linux核心对名称空间的支持完全隔离了工作环境中应用程序的视野,包括进程树、网络、用户ID与挂载文件系统。而核心的cgroup提供资源隔离,包括CPU、存储器、block I/O与网络。从0.9版本起Dockers在使用抽象虚拟是经由libvirt的LXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施(摘自 wikipedia)。容器的PID NameSpace(名空间)
在Docker中进程管理的基础就是Linux内核中的PID名空间技术,在不同PID名空间中进程ID是独立的,即在两个不同名空间下的进程可以有相同的PID。
Linux内核为所有的PID名空间维护了一个树状结构。最顶层的是系统初始化时创建的root namespace(根名空间),再创建的新PID namespace就称之为child namespace(子名空间),而原先的PID名空间就是新创建的PID名空间的parent namespace(父名空间)。通过这种方式,系统中的PID名空间会形成一个层级体系。父节点可以看到子节点中的进程,并可以通过信号等方式对子节点中的进程产生影响。反过来,子节点不能看到父节点名空间中的任何内容,也不可能通过kill或ptrace影响父节点或其他名空间中的进程。在Docker中,每个Container都是Docker Daemon的子进程,每个Container进程缺省都具有不同的PID名空间。通过名空间技术,Docker实现容器间的进程隔离。另外Docker Daemon也会利用PID名空间的树状结构,实现了对容器中的进程交互、监控和回收。下面是Docker利用名空间技术所使用到的各种资源隔离方法,关于它是做什么的可自行Google这里不在阐述,只讲它的功能;Docker容器级技术依赖于 NameSpace,CGroup,AUFS,Device Mapper
注意:为了能够向NameSpace发起调用,让NameSpace完成某些操作,其API有 clone(),setns(),unshare()
所实现的功能:
Resource limitation:资源限制Prioritization:优先级控制Accounting:审计和统计,主要是计费Control:挂起进程,恢复进程
------ 多个子系统参考路径 ls /sys/fs/cgroup ------
mapped device:被映射的设备
mapping table:被映射的表target device:源设备
Docker的核心组件
Docker的用途
Docker的基础使用
[root@192_168 ~]# yum install -y docker[root@192_168 ~]# systemctl enable docker[root@192_168 ~]# systemctl start docker[root@192_168 ~]# systemctl status docker
[root@192_168 ~]# docker info[root@192_168 ~]# docker version
[root@192_168 ~]# docker images/inspect[root@192_168 ~]# docker build/commit[root@192_168 ~]# docker pause/unpause[root@192_168 ~]# docker rm/rmi[root@192_168 ~]# docker top/kill[root@192_168 ~]# docker run/start[root@192_168 ~]# docker stop/restart[root@192_168 ~]# docker ps/ps -a [root@192_168 ~]# docker rm
[root@192_168 ~]# docker events[root@192_168 ~]# docker history[root@192_168 ~]# docker logs
[root@192_168 ~]# docker login/logout[root@192_168 ~]# docker pull/search
[root@192_168 ~]# docker run -it --rm busybox:latest /bin/sh
[root@192_168 ~]# docker commit bb1954ab1978 centos:base-tools
Docker的相关组件
registry:保存docker镜像及镜像层次结构和元数据,一个registry包含多个repository一个repository内包含多个镜像;
repository:由具有某个功能的镜像的所有相关版本构成的集合;
index:管理用户的账号、权限、镜像及镜像标签等等相关信息的检索库 docker search;
graph:从registry中下载的docker镜像需要保存在本地,此功能既由graph来完成/var/lib/docker/graph;
镜像相关命令:docker images/search/pull/push/login/logout/docker rmi及docker commit/build 等;
run、kill、stop、start、restart、logs、attach、import、export
启动容器:通过镜像创建一个新的容器 run
启动一个处于停止状态的容器 start
run 命令:--name 给容器起一个名字,在后续的命令执行中可直接调用;
-i 保持一个打开的STDIN状态,通常与-t结合使用;
-t 关联一个终端;
--net=default 启动一个容器关联到哪个桥上去,默认启动在docker0桥上;
-d --detach=false 在后台(守护进程)方式运行docker;
注意:在交互式模式下启动的容器,关闭时可使用exit命令或Ctrl+d键;
~]# docker run -it --name busybox --net=default -d busybox:latest
Docker私有仓库构建(Docker Registry)
安装:
环境是CentOS 7.4
[root@192_168 ~]# yum install -y docker docker-distribution
启动:[root@192_168 ~]# systemctl start docker
[root@192_168 ~]# systemctl start docker-distribution
[root@192_168 ~]# systemctl status docker docker-distribution
如果需要监听在80端口,可以用iptables转发实现[root@192_168 ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 5000
构建本地镜像[root@192_168 ~]# docker images
[root@192_168 ~]# docker tag 1e1148e4cc2c localhost:5000/centos:1.0.1
[root@192_168 ~]# docker push localhost:5000/centos:1.0.1
[root@192_168 ~]# docker images
[root@192_168 ~]# docker rmi localhost:5000/centos:1.0.1
[root@192_168 ~]# docker pull localhost:5000/centos:1.0.1
修改docker配置文件,默认使用内网仓库修改文件/etc/sysconfig/docker#添加内网仓库ADD_REGISTRY='--add-registry localhost:5000'
#禁用官方仓库docker.io(可选)BLOCK_REGISTRY='--block-registry docker.io'
配置文件:#INSECURE_REGISTRY='--insecure-registry localhost:5000'
#ADD_REGISTRY='--add-registry localhost:5000'
#BLOCK_REGISTRY='--block-registry docker.io'
Docker 数据卷
(1) 数据卷是提供一个或多个容器使用的文件或目录,有多种特性
(2) 可共享于多个容器之间
(3) 对数据卷的修改会立即生效
(4) 对数据卷的更新与镜像无关
(5) 数据卷会一直存在
-v --volume=[ ] 绑定挂载一个数据卷,默认存储路径:/var/lib/docker/volumes/
~]# docker run -it --name busybox --rm -v /data busybox:latest
~]# docker run -it --name busybox -v /var/lib/docker/volumes/a8c7da4dcc16e757303b6358e3d4dc50cb1adfa38118216cb5f9a55331b2107d/_data/:/data busybox:latest
Dockerfile 构建
语法格式:FROM [:] 或 FROM @
简单示例:FROM busybox:latest or FROM centos:1.0
注意事项:一个file文件可多个from指令,但尽量不在一个dockerfile文件中使用多个from指令
语法格式:MAINTAINER
简单示例:MAINTANIER Aliyun.com <admin@aliyun.com>
语法格式:ONBUILDONBUILD 后面跟的是dockerfile的指令
简单示例:ONBUILD ADD my.cnf /etc/mysql/my.cnf
注意事项:ONBUILD不能自我嵌套,且不会触发FROM和MAINTANIER等指令
语法格式:EXPOSE[/ ] [/ ] ...
简单示例:EXPOSE 11211/tcp 11211/udp
语法格式:CMDCMD [" "," "," ",...] CMD RUN [" "," ",...] 此指令为ENTRYPOINT指令指定的程序提供默认参数
简单示例:CMD ["/usr/sbin/httpd","-c","/etc/httpd/conf/httpd.conf"]
注意事项:如果dockerfile中存在多个CMD指令,仅最后一个生效
语法格式:RUN即shell命令会启动shell进程运行它,此进程UID不为1RUN [" "," "," ",...] executeable运行的命令向命令传参param1,不启动shell进程不支持通配
简单示例:run yum install -y net-toolsrun ["/bin/bash","-c",""," "," ",...]
注意事项:每个RUN都会启动一个新层
[root@192_168 ~]# mkdir httpd-dockerfile && cd httpd-dockerfile
[root@192_168 httpd-dockerfile]# vim httpd.df
[root@192_168 httpd-dockerfile]# cat docker-httpd.df
FROM centos:latestMAINTAINER Hehehuyu ''RUN yum install -y httpd php php-mysql php-mbstringRUN echo -e ' ' > /var/www/html/info.phpEXPOSE 80/tcpCMD ["/usr/sbin/httpd","-f","/etc/httpd/conf/httpd.conf","-DFOREGROUND"]
[root@192_168 httpd-dockerfile]# docker build -f docker-httpd.df -t httpd:2.4 ./
[root@192_168 httpd-dockerfile]# docker images[root@192_168 httpd-dockerfile]# docker run --rm --name httpd -P httpd:2.4[root@192_168 httpd-dockerfile]# docker port httpd ()[root@192_168 httpd-dockerfile]# docker kill httpd[root@192_168 httpd-dockerfile]# docker run -d --name httpd -p 80:80 httpd:2.4更多的关于docker的周边
转载于:https://blog.51cto.com/51eat/2351073