Docker为什么出现
我们知道,传统的项目开发和运维是两套环境,而且要一一配置环境并且有的时候更新还会导致服务不可用,这就很麻烦了,那么有没有一种很方便不用这么麻烦的技术可以一键安装呢?有!那就是我们的Docker。
Docker能干吗
现在,用Docker可以打包应用以及环境到一个可移植的镜像中,然后发布到Linux或Windows操作系统的机器上,也可以实现虚拟化,十分的方便,用docker隔离,打包装箱,为了让不同东西放在同一个环境,通过隔离机制,把服务器利用到极致。(容器与容器之间互不影响,就和集装箱一样,每个都是单独的个体) 我们来对比一下优缺点
VM:资源占用多,冗余步骤多,启动慢(虚拟出硬件,完整的操作系统,在系统上运行) 容器化技术:不是模拟完整的系统,每个都是隔离起来的,一个崩了不影响其他的,直接运行在宿主机内容,没有自己的内核,不虚拟硬件,轻便。
并且,Docker能让系统运维更简单,测试环境高度一致,也不会出现操作系统不同不能用,有着高效资源利用,内核级别虚拟化,不需要管理程序,可以在一个机器上运行很多容器实例,压榨服务器性能到极致。
Docker的安装
Docker的组成
Docker分为三个部分组成: 1.镜像 image 2.容器 container 3.仓库 repository
镜像:镜像就像一个模板,可以通过这个模板创建容器服务,比如有个tomcat镜像,我们要运行起来然后它就会变成一个容器(提供服务) 通过镜像可以创建多个容器,服务或者项目运行在容器中。
容器:Docker利用容器技术做到独立运行一个或者一组应用,通过镜像创建,有启动 停止,删除这种基础操作,可以把容器看成简易的linux。
仓库:存放镜像的地方,有公有和私有,共有所有人都可以访问,Docker Hub,阿里云等都有容器服务。
安装前提
Docker 运行在 CentOS 7上,系统要是64位,内核版本为 3.10 以上。
Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,系统要是64位,内核版本为 2.6.32-431 或者以上。
uname -r 查看自己的内核
#第一步
#确定自己的内核以及系统没问题之后,进行一下卸载旧版本,如果报告未安装这些包,则没有问题。
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#第二步
#安装软件包并且配置镜像仓库
安装软件包的命令 yum install -y yum-utils
#yum-util 提供yum-config-manager功能
镜像仓库配置 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
这是阿里仓库,对比官方的镜像仓库会更快(因为官方在国外)。
#第三步
#检查更新yum索引并且安装Docker CE
yum makecache fast
#Docker-CE即社区版(由社区维护和提供技术支持,为免费版本,适合个人开发人员和小团队使用),EE 即企业版(为收费版本,由售后团队和技术团队提供技术支持,专为企业开发和IT团队而设计。 相比Docker-EE,增加一些额外功能,更重要的是提供了更安全的保障)
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
#或者你想安装特定版本 可以用这个指令
yum list docker-ce --showduplicates | sort -r 查看docker版本
yum -y install docker-ce-18.03.1.ce 安装18.03.1.ce版本
#第四步
#启动docker并且测试版本
#如果你安装完成了,那么来尝试一下启动docker吧!
systemctl start docker
#如果没有报错,那说明你启动成功了,然后我们设置一下开机自启动。
systemctl enable docker
#随后我们检查一下docker的版本
docker version
#第五步
#最后就是我们的停止docker和卸载docker了
systemctl stop docker
#这是停止的指令
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
#卸载首先卸载docker,然后删除docker的目录。
run的工作原理
docker是一个client-server结构的系统,docker的守护进程一直在后台运行在主机上(好比装了个mysql,一直在后台运行),通过Socket从客户端访问。Dockerserver(服务进程)接收到dockerclient的指令,就会执行这个命令。
客户端连接到守护进程之后它会启动一些容器,都在服务之内,通过这个守护进程造作容器资源(容器里面就好比有个小的linux虚拟机 可以跑 占用资源进程很少,互相隔离,如果想从外部访问要进行一个连通)
Docker为什么比VM快
Docker有更少的抽象层 vm要虚拟出硬件才行,而docker没有这一层,直接在主机安装服务,运行在服务里的 每个隔离的都是容器 由于docker不需要Hypervisor实现硬件资源虚拟化 运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
Docker不需要Guest OS docker利用的宿主机的内核,vm是需要GuestOS。 docker不用重新加载一个操作系统内核,避免引导,虚拟机需要加载GuestOS,时间是分钟级别。docker是利用宿主机的操作系统,就不需要在虚拟出来了,省略了这个复杂的过程,时间是秒级。Docker底层用的是物理机的资源,虚拟机需要模拟物理机的操作系统,所以Docker加载得更快,而虚拟机更慢。
镜像容器指令
docker images #查看本地所有镜像
REPOSITORY:#表示镜像的仓库源
TAG:#镜像的标签
IMAGE ID:#镜像ID
CREATED:#镜像创建时间
SIZE:#镜像大小
#常用的选项有
-a #列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)
-q #只显示镜像ID
docker search 要搜索的镜像名字 #搜索镜像
#常用选项
-f 基于给定条件过滤输出 -f=参数=值 比如 -f=STARTS=3000就是搜索三千收藏以上的
docker pull 镜像名字 #下载 默认最新
docker pull 镜像名字[:TAG] #下载特定版本
#docker pull mysql:5.7 下载5.7版本的mysql。
#默认最新版 分层下载 docker镜像的核心 联合文件系统
docker rmi 镜像id #可以通过id和名字删除 也可以删除多个镜像 空格隔开
docker rmi -f $(docker images -aq) #全部删除 相当于rm-rf
#可以通过id和名字删除 也可以删除多个镜像 空格隔开
docker version #显示版本信息
docker info #显示docker系统信息 包括容器镜像数量
docker 命令 --help 万能命令都能通过它来看
docker run [参数] image #创建 运行
#常用选项
-d: 后台运行容器,并返回容器ID
-i: 以交互模式运行容器,通常与 -t 同时使用
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
--name="自定义名字": 为容器指定一个名称
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致
-h "mars": 指定容器的hostname
-e username="ritchie": 设置环境变量
--net="bridge": 指定容器的网络连接类型,支持bridge/host/none/container四种类型
--link=[]: 添加链接到另一个容器
--expose=[]: 开放一个端口或一组端口
--volume , -v: 绑定一个卷
docker ps #查看当前运行的容器
常用选项
-a 当前正在运行的容器+历史运行过的
-n=? 显示最近创建的容器,比如最近的一个 docker ps -a -n=1
-q 只显示id
exit 直接退出结束
Ctrl+p+q 让容器在后台运行,不停止并且退出
docker start 容器id
docker stop 容器id
docker kill 容器id
docker run -d 容器名或者id
#此时我们用 docker run -d centos之后然后ps查看一下,我们会发现centos停止了,docker是容器使用后台运行,如果是后台运行必须有前台进程,如果你没有运行前台进程那么docker发现没有应用就自动停止了
docker logs #查看日志
常用选项
-t 是加入时间戳
-f 跟随最新的日志打印
--tail 数字 显示最后多少条
docker top 容器id
docker inspect 容器id #显示的信息有 主机配置 id 镜像从哪来 网络等信息
docker exec -it 容器id # shell路径 exec是在容器中打开新的终端,并且启动新的进程
docker attach 容器id # attach直接进入容器启动命令的终端,不会启动新的进程
docker cp 容器id:容器内路径 主机路径
docker cp b1f0258395c2:/home/paopao.cpp /home #可以把在centos home目录里面创建的文件复制出来