Docker
一、Docker简介
1、什么是容器?
容器从根本上改变了人们开发、发布以及运行软件的方式。软件开发者可以在本地构建软
件,因为他们知道软件能够在任何主机环境下运行,无论是IT 部门的机房、用户的笔记本电脑,还是云端集群,而且运行时并无差异。
容器是对应用程序及其依赖关系的封装。它和虚拟机一样拥有一个被隔离的操作系统实例,用来运行应用程序。
2、容器的优点
容器能与主机的操作系统共享资源,因而它的效率高出一个数量级。启动和停止容器均只需一瞬间。相比在主机上直接运行程序,容器的性能损耗非常低,甚至是零损耗。
容器具有可移植性,这极有可能彻底解决由于运行环境的些许改变而导致的问题,甚至有可能彻底终止开发者的抱怨:“可是程序在我的计算机上能正常工作!”
容器是轻量的,这意味着开发者能同时运行数十个容器,并能模拟分布式系统在真实运行环境下的情况。运维工程师在一台主机上能运行的容器数量,远远超过仅使用虚拟机时。
对于最终用户及开发者而言,容器的优势不仅仅体现在云端部署。用户可以下载并执行复杂的应用程序,而无需花费大量时间在配置和安装的问题上,也无需担心对系统本身的改动。另一方面,应用程序的开发者不用再操心用户环境的差异,以及依赖关系是否满足。
3、虚拟机VS容器
虚拟机的目的是要完整地模拟另一个环境,而容器的目的则是使应用程序能够移植,并把所有依赖关系包含进去。
虚拟机与容器都可以把主机上的应用程序隔离开来。虚拟技术中的虚拟机管理程序能带来更高一级的隔离性能,是已被公认且千锤百炼的技术。容器技术相对较新,很多公司在取得充分可靠的运行记录前,无法完全信任容器的隔离性能。因此,不难发现有些系统同时采用这两种技术,将容器运行在虚拟机内,这样就能鱼与熊掌兼得。
4、Docker与容器
Docker 引擎提供了一个快速且便捷的接口用来运行容器。
容器能保障的可移植性及隔离特性,使得开发与运维部门之间更容易协作,因为开发者知道他们的代码在不同环境下都能工作,而运维部门只需专注于容器的托管及服务编排,而无需担心任何关于代码的事。
5、微服务和单一架构
微服务是容器最主要的用例,也是容器技术兴起的最大推动力。微服务是一种软件系统开发和构成形式,由小而独立的组件组成,这些组件通过网络互相连接沟通。这与传统的单一架构(monolith)软件开发模式相反,后者只有一个庞大的程序,一般由C++ 或Java 实现。就系统复杂度而言,微服务是把双刃剑。每个单独的微服务都应该易于理解和修改,但是,在一个拥有几十到几百个这类服务的系统中,组件之间的交互会导致整体的复
杂度增加。容器与生俱来的轻量级特性及速度,意味着它尤其适合用于微服务架构。与虚拟机相比,容器的体积小很多,并且能快速部署,这使得微服务架构能使用最少的资源,又能迅速应对需求的变化。
二、安装Docker
在Linux 上安装Docker 最好的方法就是使用Docker 提供的安装脚本。虽然大部分主流Linux 发行版都有自己的软件包,但很多时候这些软件包的版本都落后于Docker的发布版本。鉴于Docker 开发的步伐较快,因此绝不能忽略这个问题的严重性。(因此采用Docker官网的安装脚本)
1、系统要求
可以通过执行uname -r 来检查你的内核版本。如果你使用的发行版是RHEL 或CentOS,便需要7 或之后的版本。还需要注意,系统架构必须是64 位。系统架构可以通过执行uname -m 查询,结果应为x86_64。
2、脚本安装
#卸载旧的版本 旧版本的Docker被称为Docker或Docker -engine。如果安装了这些组件,请卸载它们以及相关的依赖项。
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#这里采用脚本的方式安装
curl -fsSL https://get.docker.com -o get-docker.sh
#使用DRY_RUN-1选项运行该脚本,以了解在安装过程中脚本将执行哪些步骤:
DRY_RUN=1 sh ./get-docker.sh 或 sh get-docker.sh
#卸载Docker
#1. 卸载Docker Engine、CLI和Containerd包:
sudo yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
#确定Docker版本
docker -v
如果安装后如上图,这代表Docker 守护进程并未运行(或客户端无法访问它)。这时需要启动docker
systemctl start docker
3、Docker权限
Docker的运行需要权限,所以默认执行命令时都必须在前面加上sudo。
三、镜像概念
1、运行第一个镜像
docker run debian echo "hello,world"
调用了docker run 命令,它的功能是负责启动容器。其中的debian 参数是我们打算使用的镜像1 名称。Docker 便会在Docker Hub 进行在线搜索,并下载Debian 最新版本的镜像。镜像下载后,Docker 会将它转成容器并运行,然后在容器中执行我们指定的命令——echo "Hello World"。命令的结果则显示在输出内容的最后一行。如果再次执行同一命令,那就无需再下载镜像了,容器会立即启动。而整个命令的运行时间大概只需一秒,要是想象一下它背后所做的一切事情,就会觉得这个速度十分惊人:Docker 部署并启动了我们的容器,执行我们指定的echo 命令,最后把容器关掉。
#请求Docker 提供一个容器中的shell。
docker run -i -t debian /bin/bash
进入容器中的命令行,/bin/bash 参数表示你想获得一个bash shell。当你退出shell 时,容器就会停止——主进程运行多久,容器就运行多久。
2、基本命令
#以新的主机名运行docker容器
docker run -h CONTAINER -i -t debian /bin/bash
#显示所有容器
docker ps -a
#移除容器
docker rm stupefied_turing
#列出所有已停止的容器
docker ps -aq -f status=exited
#请注意-v 参数在这里的作用,它意味着当所有由Docker 管理的数据卷已经没有和任何容器关联时,都会一律删除。
docker rm -v $(docker ps -aq -f status=exited)
为了避免已停止的容器的数量不断增加,可以在执行docker run 的时候加上--rm 参数,它的作用是当容器退出时,容器和相关的文件系统会被一并删掉。
#将容器转化为镜像,你需要提供的参数包括容器的名称(“cowsay”)、新镜像的名称(“cowsayimage”),以及用来存放镜像的仓库名称(“test”):
docker commit cowsay test/cowsayimage
#命令的返回值是这个镜像的唯一识别码(unique ID)。现在,我们创建了一个能随时使用,并且已安装cowsay 的镜像
sha256:d3f3d9e0c0b20c9014282cab5172e406112590f24cfaa28789cb912d4ee322ae
假设我们希望基于另一个镜像来创建我们的容器的话,也必须从头开始。更重要的是,这样做的可重复性(repeatable)很差;创建镜像的步骤很难与他人分享,把步骤重做也不是件易事,而且容易出错。解决这些问题的方法就是利用Dockerfile,使创建镜像的过程全部自动化。
3、Dockerfile创建镜像
Dockerfile 是一个描述如何创建Docker 镜像所需步骤的文本文件。
#创建文件夹
mkdir cowsay
#进入文件夹
cd cowsay
#创建文件
touch Dockerfile
#写入下列信息,。所有Dockerfile 一定要有FROM 指令作为第一个非注释指令。RUN 指令指定的shell 命令,是将要在镜像里执行的。这个例子中,它所做的事情其实和之前一样,就是安装cowsay 和fortune。
FROM debian:wheezy
RUN apt-get update && apt-get install -y cowsay fortune
#执行创建命令("docker build" requires exactly 1 argument.)原因是因为(少了一个 ‘.’ , ‘.’ 代表当前路径),且镜像名和.有个空格。
docker build -t test/cowsay-dockerfile .
#成功后可以像之前一样运行
docker run test/cowsay-dockerfile /usr/games/cowsay "Moo"
如果镜像名称以字符串和/ 开头,如amouat/revealjs,那么它属于“用户”命名空间(“user” namespace)
不包含前缀或/,属于“根”命名空间(“root”namespace)。它由Docker 公司所控制,为一些常用的软件及发行版预留在DockerHub 上发布的官方镜像。虽然这个命名空间由Docker 管理,但实际上镜像通常由第三方维护,一般是该软件的供应商(例如nginx 镜像是由nginx 公司维护)。
以主机名或IP 开头的名称,代表该镜像来自第三方的寄存服务(并非DockerHub),包括公司或组织自己搭建的寄存服务,或Docker Hub 的竞争对手,例如quay.io。
4、使用Redis官方镜像
#获取镜像
docker pull redis
#-d 参数让容器在后台运行。Docker 照常启动容器。通过dockerlogs 命令查看容器的输出。
docker run --name myredis -d redis
#启动新的容器,运行连接网络
docker run --rm -it --link myredis:redis redis /bin/bash
#进入redis-cli
redis-cli -h redis -p 6379
通过docker run 命令的–link myredis:redis 参数实现的。这个参数告诉Docker 把新容器与现存的“myredis”容器连接起来,并且在新容器中以“redis”作为“myredis”容器的主机名。为了实现这一点,Docker 会在新容器中的/etc/hosts 里添加一个新条目,把“redis”指向“myredis”的IP 地址。这样就能够在执行redis-cli 的时候直接使用“redis”作为主机名,而不需想办法找出或传递Redis 容器的IP地址给redis-cli。