Docker简介:
Docker 是世界领先的软件容器平台。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
Docker是一种新兴的虚拟化技术,能够一定程度上的代替传统虚拟机。不过,Docker 跟传统的虚拟化方式相比具有众多的优势。
1、更快速的交付和部署
2、更高效的虚拟化
3.更轻松的迁移和扩展
4.更简单的管理
基本概念:
镜像(Image)
容器(Container)
仓库(Repository)
镜像文件的分层存储技术:镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
Docker 采用了C/S 架构,包括客户端和服务端。Docker 守护进程(Daemon)作为服务端
接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。至于Docker的客户端与守护进程之间的通信,其连接方式为socket连接。主要有三种socket连接方式:
unix:///var/run/docker.sock
tcp://host:port
fd://socketfd
Docker的安装与启动:
在linux上centos上:
yum install docker
service docker start (设为开机启动)
chkconfig docker on
测试:docker version
查看当前系统Docker信息 docker info
ubuntu上:
windows上:
配置文件 /etc/docker/daemon.json
配置国内镜像加速:
{
“registry-mirrors”: [
“https://registry.docker-cn.com”
]
}
镜像管理命令:
将 image 文件从仓库抓取到本地,保存在/var/lib/docker目录下
docker pull library/hello-world
拉取镜像:docker pull [OPTIONS] NAME [:TAG]
推送镜像:docker push NAME [:TAG]
查看宿主机上的镜像 docker images
查看某一镜像:docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE]
删除镜像:docker rmi docker.io/tomcat:7.0.77-jre7 或者 docker rmi b39c68b7af30
虚悬镜像:既没有仓库名,也没有标签,均为
查找镜像:docker search [OPTIONS] TEAM
构建镜像:通过容器构建:docker commit ;通过Dockerfile:docker build
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker build [OPTIONS] DockerFile_PATH | URL | -
上传镜像:
登录你的Docker Hub账户,输入docker login,输入用户名密码即可登录成功
选择的镜像打上标签,标签名需和Docker Hub上新建的仓库名称一致,其中existing-image代表本地待上传的镜像名加tag,tag不指定则为latest
docker tag /[:]
docker push /:
镜像导出和加载:
docker save ubuntu:latest | gzip > ubuntu18.04.tar.gz
docker load ubuntu18.04.tar.gz
容器管理命令:
查看当前有哪些容器正在运行:docker ps
查看所有容器 docker ps -a
查看指定容器:docker inspect name | id
启动、停止、重启容器命令 docker start|stop|restart container_name/container_id
docker start -i haha
删除容器 docker rm container_name/container_id
强制停止:docker kill 容器名
修改容器名:docker rename docker_id/docker_name new_name
查看容器端口:docker port docker_id/docker_name
重新进入一个容器:docker attach container_name/container_id
启动一次操作容器:docker run IMAGE_NAME [COMMAND] [ARG…]
如:docker run ubuntu echo ‘hello world’
启动交互式容器:docker run -t -i –name=自定义名称 IMAGE_NAME /bin/bash
如:docker run -i -t ubuntu /bin/bash
以守护形式运行容器
退出容器时,不要使用exit退出,可以利用Ctrl+P Ctrl+Q代替,以守护式形式推出容器;
启动守护式容器:docker run -d IMAGE_NAME [COMMAND] [ARG…]
如:docker run --name hiahia -d ubuntu /bin/sh -c “while true; do echo hello world; sleep 1; done”
查看容器日志:docker logs [-f] [-t] [–tail] IMAGE_NAME
查看容器内进程:docker top IMAGE_NAME
执行容器中的程序:docker exec -options containerName command args
如:进入容器 docker exec -it myContainer /bin/bash | /bin/sh
容器的端口映射 run [-P] (表示随机映射端口)[-p](指定端口映射)
如:docker run -p 80 -i -t ubuntu /bin/bash (containerPort:只指定容器的端口,宿主机端口随机映射;)
docker run -p 8080:80 -i -t ubuntu /bin/bash (hostPort:containerPort:同时指定宿主机端口和容器端口一一映射;)
docker run -p 0.0.0.0::80 -i -t ubuntu /bin/bash (ip::containerPort:指定ip和容器的端口;)
docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash (ip:hostPort:containerPort:指定ip、宿主机端口以及容器端口)
-v:文件或目录挂载。-v hostPath:containerPath
$ docker run -d
-p 5000:5000
–restart=always
–name registry
-v /mnt/registry:/var/lib/registry \
registry:2
文件拷贝:
从容器到宿主机: docker cp containerName:containerPath hostPath
从宿主机到容器:docker cp hostPath containerName:containerPath
Docker-Compose
Docker-Compose 是用来管理你的容器的,有点像一个容器的管家,想象一下当你的Docker中有成百上千的容器需要启动,如果一个一个的启动那得多费时间。有了Docker-Compose你只需要编写一个文件,在这个文件里面声明好要启动的容器,配置一些参数,执行一下这个文件,Docker就会按照你声明的配置去把所有的容器启动起来,但是Docker-Compose只能管理当前主机上的Docker,也就是说不能去启动其他主机上的Docker容器。它是用python编写的一个工具。
Swam简介:
Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些。是一款用来管理多主机上的Docker容器的工具,可以负责帮你启动容器,监控容器状态,如果容器的状态不正常它会帮你重新帮你启动一个新的容器,来提供服务,同时也提供服务之间的负载均衡。Docker Stack使用docker-compose.yml文件来提供堆栈的Docker容器,功能与docker-compose相同。包含在Docker引擎中。你不需要安装额外的包来使用它,docker stacks 只是swarm mode的一部分。它支持相同类型的compose文件,但实际的处理是发生在Docker Engine(docker引擎)内部的Go代码中。在使用堆栈命令之前,还必须创建一个单机版的“swarm”。
集群中有管理主机和节点。manage节点自身也作为被worker节点的一个,自动加入建立起来的swarm集群中。
管理操作都需在manager节点上操作。Swarm模式已经在1.12中集成到Docker Engine中,在安装时配置开启即可,有提供docker api供http调用。
启动一个swarm集群:
docker swarm init --listen-addr 192.168.1.112:8888 --advertise-addr 192.168.1.112
–listen-addr指出的是这个集群暴露给外界调用的HTTPAPI的socket地址。
添加–advertise-addr参数的原因是大多数情况下我们的主机都不只有一张网卡。而一个swarm集群需要辨明集群所在的子网络是哪张网卡的。
命令运行成功的话会提示一串类似于这样的信息:
docker swarm join
–token SWMTKN-1-2vndbzp43eff6vaiornhbafew242arz29qngrql0slqg4zmi4j-1hpha7vnelkbg4gg1d293qus4
192.168.1.112:8888
上面的token即为该集群的token值。
这是在说明,通网络下的被管理主机上,只要运行这串命令就可以将该主机加入集群。如果不小心忘了这个命令那么可以在manager上运行docker swarm join-token manager命令,随时调取出这部分信息来看。(有时可以在命令后加上–listen-addr参数,倒不是说被管理主机也需要监听,而是存在一些将被管理主机升级为管理主机的场景)
在管理主机上查询节点情况:docker node ls
docker info 中也会多出Swarm: True以及一系列相关字段。
构建服务:保持容器副本数量等工作
docker service create --replicas 1 --name swarmtest(服务名) tomcatssh:v1(镜像名)
查看服务:docker service ls
服务状况:docker service ps swarmtest
滚动更新服务:docker service update --image tomcatssh:v2 swarmtest(停止旧容器,启动新的)
(–update-failure-action参数可以指定是否要跳过错误)
服务伸缩: docker service scale swarmtest=5 (可以将服务现有的replica为3的状态扩展到5,期间已经启动的容器不受影响。)
删除服务:docker service rm swarmtest 也会删除创建的容器
节点管理:节点状态 有active(可接任务)drain(停止并转移容器任务,不再接任务)
docker node update --availability drain worker2
查看节点情况:docker node inspect --pretty nodeName
退出swarm集群: docker swarm leave
Docker是容器技术的核心、基础,Docker Compose是一个基于Docker的单主机容器编排工具,功能并不像Docker Swarm和Kubernetes是基于Dcoker的跨主机的容器管理平台那么丰富。
Docker集群管理需要服务发现(Discovery service backend)功能。Swarm支持以下几种discovery service backend:Docker Hub上面内置的服务发现功能,本地的静态文件描述集群(static file describing the cluster),etcd,consul,zookeeper和一些静态的ip列表(a static list of ips)。
Docker Swarm 负载均衡有两种模式:VIP、DNSRR:
VIP:分配独立的虚拟IP,DNS记录解析到服务名中作为代理IP。
dnsrr:DNS记录不解析VIP,而去解析每个容器内的IP。dnsrr模式不支持端口对外暴露。
可在容器Swarm负载均衡之上在建立一层负载均衡。HAProxy可代理工作节点端暴露的端口进行再次代理,做到双层负载均衡的作用。保证高可用与大规模的应用。
Kubernetes
生产级别的容器集群编排系统,是用于自动部署,扩展和管理容器化应用程序的开源系统。它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现,基于允许 Google 每周运行数十亿个容器的原则进行设计,Kubernetes 可以在不增加您的运维团队的情况下进行弹性扩展。无论您应用运行在本地还是运行于全球任何地域,Kubernetes 的灵活性都可以随着您的需求复杂度不断增加,还可以持续、轻松地对外提供服务。
容器化应用程序,使应用程序能够以简单快速的方式发布和更新,而无需停机。 Kubernetes 在一个集群上以更有效的方式自动分发和调度容器应用程序。
Kubernetes 集群构成:一个 Master 是集群的调度节点;Nodes 是应用程序实际运行的工作节点。一个 Kubernetes 工作集群至少有三个节点。
container、pod、service、node
多个实例、负载均衡、解决机器故障或维护的自愈机制、滚动更新(零停机、可用性)、可伸缩。