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效率比虚拟机高

 

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

  

  

posted @ 2020-04-19 13:49  全心全意_运维  阅读(336)  评论(0编辑  收藏  举报