原文链接:https://blog.csdn.net/weixin_40533111/article/details/84847861 作者四月天五月雨^_^,转载请注明出处,谢谢
前言
目录
- docker概述
1.1 什么是docker
1.2 docker和虚拟机的比较
1.3 docker的特点 - docker组件
2.1 docker服务器与客户端
2.2 Docker镜像与容器
2.3 Registry(注册中心) - docker安装和使用
- 常用基本命令
- Dockerfile
正文
1.docker概述
在讲docker之前先了解一下容器,先打个比喻:
比如: 大家之前坐过绿皮火车吧,2排座位是面对面,中间一个小桌子;场景:从河南郑州出发,在10号车厢中,有两排的人面对面在桌子上打牌斗地主,长路漫漫,过了几个小时,车子到了杭州,此刻我们还在斗地主;尽管10号车厢跨过了一个个城市,有的下雨有的晴天,但车厢中的我们没变化–还在斗地主,桌椅的配置也没变等等;此刻车厢就是容器,容器保证了内部的环境不变.
容器: 一句话概括容器:容器就是将软件(上述的我们)打包成标准化单元,以用于开发、交付和部署;轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置;容器是轻量级的,不受外部环境的变化的影响;
容器特点:
- 极其轻量:只打包了必要的Bin/Lib;
- 秒级部署:根据镜像的不同,容器的部署大概在毫秒与秒之间(比虚拟机强很多);
- 易于移植:一次构建,随处部署;
1.1 什么是docker
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
- Docker是世界领先的软件容器平台。
- Docker使用Google公司推出的Go语言进行开发实现,基于Linux内核的cgroup,namespace,以及AUFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。 由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。Docke最初实现是基于LXC。
- Docker能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上:构建杰出的软件。
- 用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
1.2 docker和虚拟机的比较
**简述:**容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
图中较为简述的表明了docker和虚拟机技术的主要区别:
docker容器依赖于宿主机的操作系统(隔离程度较小,一个进程间),而虚拟机是完全虚拟出一套硬件(一台五脏俱全的子机器),在子机器里面运行,显然这种方式比较重,耗资源,迁移麻烦.
1.3 docker的特点:
- 上手快。
用户只需要几分钟,就可以把自己的程序“Docker化”。Docker依赖于“写时复制”(copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心所致,代码即改”的境界。
随后,就可以创建容器来运行应用程序了。大多数Docker容器只需要不到1秒中即可启动。由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户尽可能的充分利用系统资源。 - 职责的逻辑分类
使用Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。Docker设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性。从而降低那种“开发时一切正常,肯定是运维的问题(测试环境都是正常的,上线后出了问题就归结为肯定是运维的问题)” - 快速高效的开发生命周期
Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker就像一个盒子,里面可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从该盒子中一件件的取。) - 鼓励使用面向服务的架构
Docker还鼓励面向服务的体系结构和微服务架构。Docker推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序都变得非常简单,同时也提高了程序的内省性。(当然,可以在一个容器中运行多个应用程序)
2.docker组件
2.1 docker服务器与客户端
Docker是一个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具Docker以及一整套RESTful API。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。
2.2 Docker镜像与容器
镜像是构建Docker的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的“构建”部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。例如:
第一层:基于centos7
第二层:装一个jdk8
第三层:装一个redis
…
build成一个镜像.
镜像分层: docker的镜像是分为多层的,每一层是我们的一个操作,类似微博的时间线,层层叠加,每一层加一些功能,就像上面的例子,第一层只有一个centos,第二层我们放进去一个jdk,他依赖第一层,之后第三层放进或修改一些东西,等等,类似于java中的继承机制,A被B继承,B被C继承…下一代可以获取上一代的功能,并可以进行扩充
容器: 而镜像运行起来之后就产生一个个容器,容器中包含镜像之前构建的jdk,redis,等等应用,(容器可通过commit反向构建成镜像,但复杂,跨平台操作更加麻烦,实际不这么用,使用Dockerfile构建是主流方式)
比如: 在java中,镜像就是类,而容器就是对象,一个类可以new出多个对象
和集装箱一样,Docker在执行上述操作时,并不关心容器中到底装了什么,它不管是web服务器,还是数据库,或者是应用程序服务器什么的。所有的容器都按照相同的方式将内容“装载”进去。
Docker也不关心你要把容器运到何方:我们可以在自己的笔记本中构建容器,上传到Registry,然后下载到一个物理的或者虚拟的服务器来测试,在把容器部署到具体的主机中。像标准集装箱一样,Docker容器方便替换,可以叠加,易于分发,并且尽量通用。
2.3 Registry(注册中心)
Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。用户可以在Docker Hub注册账号,分享并保存自己的镜像(在Docker Hub下载镜像巨慢,可以自己构建私有的Registry)。
https://hub.docker.com/
3.docker安装
3.1 安装Docker
Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。在很多版本的CentOS中是不支持更新最新的一些补丁包的。但楼主之前一直在用centos玩耍,就基于centos了,演示用不到新补丁包.
以下操作默认用root权限,如果不是,在命令前加:sudo
- 更新下yum
yum update
- 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
- 设置yum源为阿里云(不生效的话,可百度手动更换/etc/yum.repos.d下的yum源)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装docker,ce是免费的,ee是企业版
yum install docker-ce
5.安装后查看docker版本
docker -v
出现版本信息说明,安装成功
3.2 设置ustc的镜像
ustc是老牌的linux镜像服务提供者了。ustc的docker镜像加速器速度很快。ustc docker mirror的优势之一就是不需要注册,是真正的公共服务。
https://lug.ustc.edu.cn/wiki/mirrors/help/docker
- 编辑该文件(如果不存在,就创建一个):
vi /etc/docker/daemon.json
- 在该文件中输入如下内容:
{ "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] }
3.3 Docker的启动与停止(用的centos7)
1.启动
systemctl start docker
2.查看状态和停止和开机启动
systemctl status docker
systemctl stop docker
systemctl enable docker
.......
其他操作和操作普通服务类似
4.常用基本命令
4.1镜像命令
- 查看镜像
docker images
- 搜索镜像(从网上搜,不是本地哦)
docker search 镜像名称
- 拉取镜像,从中央仓库中下载镜像到本地
docker pull 镜像名称
eg:
docker pull nginx
4.2 容器相关命令
- 查看正在运行的容器
docker ps
查看所有容器
docker ps –a
查看最后一次运行的容器
docker ps –l
查看停止的容器
docker ps -f status=exited
- 创建与启动容器
创建容器常用的参数说明:
创建容器命令:docker run
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
–name :为创建的容器命名。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
2.1 交互式创建:(不常用,界面退出,容器即停止)
2.2 守护式方式创建容器:
docker run -di --name=容器名称 镜像名称:标签
登录守护式容器方式:
docker exec -it 容器名称 (或者容器ID) /bin/bash
- 启动与停止容器
停止容器:
docker stop 容器名称(或者容器ID)
启动容器:
docker start 容器名称(或者容器ID)
4.3 部署nginx示例
- 拉取镜像(默认tag是最新版本)
docker pull nginx
- 执行镜像,创建容器
docker run -di --name=mynginx1 -p 80:80 nginx
4. 页面访问映射的主机80端口
5. Dockerfile
5.1概述:
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
3、对于运维人员:在部署时,可以实现应用的无缝移植。
5.2 常用命令:
FROM imagename:tag:定义了使用哪个基础镜像启动构建流程
MAINTAINER username:声明镜像的创建者
ENV key value:设置环境变量 (可以写多条)
RUN command: 是Dockerfile的核心部分(可以写多条)
ADD sourcedir/file destdir/file: 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 COPY sourcedir/file destdir/file: 和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir: 设置工作目录
后续
本篇简单的介绍了docker和基本用法,后面有时间再补充
参考:
1.https://www.docker.com/
2.https://blog.opskumu.com/docker.html