Docker技术
Docker技术
制作人:全心全意
Docker概述
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙盒机制,相互之间不会有任何接口。几乎没有性能开销,可以很容易地在机器和数据中心运行。最重要的是它不依赖于任何语言、框架或包装系统。
注:沙盒也叫沙箱,英文是sandbox。在计算机领域指一种虚拟技术,且所用于计算机安全技术,安全软件可以让病毒软件在沙盒中运行,如果含有恶意行为,则禁止程序的进一步运行,从而不会对系统造成任何损害。
Docker是dotCloud公司开源的一个基于LXC的高级容器引擎,源代码托管在Github上,基于go语言并遵从Apache2.0协议开源。
注意:目前,windows环境下,也支持docker运行
扩展:LXC是Linux Container的简写。Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其它复杂性。主要通过来自kernel的namespace实现每个用户实例之间的相互隔离,通过cgroup实现对资源的配额和度量。
官方网站:https://www.docker.com
源码网址:https://github.com/docker/docker
docker容器技术和虚拟化技术对比
相同点:docker容器技术和虚拟机技术,都是虚拟化技术。
docker相对于虚拟机,少了虚拟机操作系统这一层,所有docker效率比虚拟机高
docker架构图
Image和Container的关系:Image可以理解为一个系统镜像,Container是image在运行时的一个状态。如果拿虚拟机做一个比喻的话,Image就是关机状态下的磁盘文件,Container就是虚拟机运行时的磁盘文件,包括内存数据。
dockerhub:dockerhub是docker官方的镜像存储站点,其中提供了很多常用的镜像供用户下载,如ubuntu、centos等系统镜像。通过dockerhub用户也可以发布自己的docker镜像,为此用户需要注册一个账号,在网站上创建一个docker仓库。
docker的特性
文件系统隔离:每个进程容器运行在一个完全独立的根文件系统里。
资源隔离:系统资源,像CPU和内存等可以分配到不同的容器中,使用cgroup
网络隔离:每个进程容器运行在自己的网络空间,虚拟接口和IP地址。
日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。
变更管理:容器文件系统的变更可以提交到新的镜像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。
交互式shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell。
docker的局限性
docker用于应用程序时是最有用的,但并不包含数据。日志、跟踪和数据库等通常应放在Docker容器外。一个容器的镜像通常都很小,不适合存大量数据,存储可以通过外部挂载的方式使用。例如使用NFS、ipsan、MFS等,-v映射磁盘分区。一句话,docker只用于计算,存储交给别人。
存储docker平台中相关数据:/var/lib/docker/devicemapper/devicemapper/data
docker命令的介绍
docker version:查看docker版本号
docker info:查看当前docker的基本信息
docker search 关键字(centos):从docker hub中搜索相关的镜像
docker pull 镜像名或网络地址:下载镜像到本地
docker load -i 镜像文件路径:将之前下载好的image镜像导入image
docker images:列出本地所有镜像
docker logs 镜像名/容器ID:查看指定容器的输出信息
docker ps:列出正在运行的docker进程(容器)
-a:列出所有docker进程,即使是关闭的
docker kill 容器ID:杀掉正在运行指定容器ID的容器
docker start 容器ID:启动指定容器ID的容器进程
docker stop 容器ID:停止指定容器ID的容器进程
docker restart 容器ID:重启指定容器ID的容器进程
docker rm 容器ID:删除指定容器ID的容器,不可删除正在运行的
-f:强制删除,即使正在运行
docker rmi 镜像ID/镜像名称:删除指定镜像ID的镜像
docker run:运行
-i:以交互模式运行容器,通常与-t同时使用
-t:为容器重新分配一个伪输入终端,通常与-i同时使用
-d:后台运行容器,并返回容器ID
-c:指定待完成的命令
-p:指定端口映射(物理机端口:容器实例端口)
#运行一个container,并加载镜像centos,运行起来这个实例后,在实例中执行/bin/bash命令 docker run -it docker.io/centos:latest /bin/bash docker run -it 镜像名:镜像标签名 /bin/bash #镜像名和镜像标签名对应docker images中的(REPOSITORY:TAG)
#在container中启动一个长久运行的进程,不断向stdin输出“hello world”,在后台运行 docker run -d docker.io/centos:latest /bin/bash -c "while true;do echo hello word;sleep1;done" docker logs 容器实例的Name/ID #ID可通过docker ps 查看
docker镜像的制作方法:
方法一:保存container的当前状态到image后,然后生成对应的image
docker commit 容器ID或镜像名称 镜像名称:标签名(如出现同名的标签名,之前的标签将置为none)
方法二:使用Dockerfile文件自动化制作image
docker build
-t:表示tage,指定镜像名
#docker build的使用 mkdir /docker_build cd /docker_build touch Dockerfile vi Dockerfile FROM docker.io/centos:latest MAINAINER <1006319959@qq.com> RUN yum -y install httpd ADD start.sh /usr/local/bin/start.sh ADD index.html /var/www/html/index.html echo "/usr/sbin/httpd -DFOREGROUND" > start.sh chmod a+x start.sh echo "docker image test" > index.html docker build -t docker.io/centos:httpd ./ #./表示当前目录,当前目录要含有一个Dockerfile文件 #注释信息==================================================== FROM docker.io/centos:latest #基于哪个镜像 MAINAINER <1006319959@qq.com> #作者 RUN yum -y install httpd #执行的命令 ADD start.sh /usr/local/bin/start.sh ADD index.html /var/www/html/index.html #将文件<src>拷贝到新产生的镜像的文件系统对应的路径<dest>。所有拷贝到新镜像中的文件和文件夹权限为0755,uid和gid为0 CMD echo hello world #容器启动时执行的命令或启动服务,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD。
docker镜像的发布:
方法一:保存为tar包
docker save -o 导出的镜像名.tar 本地镜像名:镜像标签
方法二:上传到Docker Hub中
#注册一个docker hub账号 https://hub.docker.com/ #登陆docker hub docker login -u 用户名 -p 密码 -e 1006319959@qq.com #上传镜像 docker push centos:httpd #下载镜像 docker pull 用户名/centos:httpd
docker镜像的导入:
docker load -i 镜像包.tar
docker映射端口号(等同于虚拟机的NAT):
docker run -d -p 80:80 docker.io/centos:httpd /bin/bash -c /usr/local/bin/start.sh #-p 物理机端口:容器实例端口,将容器的端口映射到物理机上
访问正在运行的容器实例:
docker exec -it 容器id|name /bin/bash
错误提示:docker需要物理机开启网络转发功能,否则将导致镜像无法上网
vi /etc/sysctl.conf net.ipv4.ip_forward = 1 sysctl -p #或者 echo 1 > /proc/sys/net/ipv4/ip_forward