什么是Docker?
Docker是基于Go语言实现的云开源项目。Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或者数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
Docker引擎的基础是Linux自带的容器(Linux Containers,LXC)技术。IBM对于容器技术的准确描述如下:
容器有效的将单个操作系统管理的资源划分到孤立的组中,以便更好的在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心CPU本地运行指令,而不需要任何专门的解释机制。此外,也避免了准虚拟化(paravirtualization)和系统调用替换中的复杂性。
我们可以将容器理解为一种沙盒。每个容器内运行一个应用,不同的容器相互隔离,容器之间可以建立通信机制。容器的创建和停止都十分快速(秒级),容器自身对资源的需求十分有限,远比虚拟机本身占用的资源少。
Docker结构
docker如上图所示,由Client客户端,DOCKER_HOST宿主机,Registry仓库三个部分构成。在客户端部分,用户可以拉取镜像、创建镜像和运行镜像(客户端-服务器的架构。docker client告诉Docker daemon建立、运行、发布你的Docker容器。Docker client和daemon可以运行在一个系统中,或者可以使用Docker client和远程Docker daemon取得联系。docker服务端和docker守护进程之间通过sockets或者REST API交互)。
运行机制如下描述:
1.用户在客户端的命令都交给Docker daemon来处理;
2.如doker run 运行镜像:docker daemon会检查宿主机是否有这个images,若没有则去镜像仓库(Registry)中拉取镜像;
3.再运行镜像后以容器的形式在宿主机中运行
Docker给DevOps带来的好处
更快速的交付和部署:开发人员可以使用镜像快速的构建标准开发环境;开发完成后,测试和运维人员可以使用开发人员提供的docker镜像快速部署应用,可以避免开发和测试运维人员之间的环境差异导致的部署问题。
更高校的资源利用:Docker容器的运行不需要额外的虚拟化管理程序支持,它是内核级的虚拟化,在占用更少资源的情况实现更高的性能。
更方便的迁移和扩展:Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、服务器等。这种兼容使得用户可以在不同的平台之间很方便的完成应用迁移。
更简单的更新管理:使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作,并且所有修改都以增量方式进行分发和更新。
虚拟化与Docker
虚拟化的核心是对资源进行抽象,目标往往是为了在同一个机器上运行多个系统或应用,从而提高系统资源的利用率。虚拟化分为很多类型,比如常见的硬件辅助虚拟化(VMware workstation、 KVM等)。Docker所代表的容器虚拟化技术属于操作系统级虚拟化:内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。
传统虚拟化和容器技术结构比较:传统虚拟化技术是在硬件层面实现虚拟化,增加了系统调用链路的环节,有性能损耗;容器虚拟化技术以共享Kernel的方式实现,几乎没有性能损耗。
Docker三大基本概念
image
Docker镜像类似于虚拟机镜像,是一个只读模板,并且包含了文件系统。一个镜像可以只包含一个操作系统环境(比如SUSE镜像),也可以安装了用户程序及其运行环境(比如eBackup镜像)。镜像其实就是一个文件,任何用户程序都可以成为镜像的一部分。
镜像=操作系统+软件运行环境+用户程序
如上图,一个layer就是一个image,多个image又可以打包成一个image。Image类似一个单链表系统,每个image包含一个指向parent image的指针,没有parent image的image是baseimage(image的指针靠sqlite数据库来保存)。
最上面的一层(不属于image)是可写的,上面的内容依赖于下面的内容,如果要修改下面的内容,先将下面的内容复制到上面再进行修改。
Image是创建container的基础。
Container
容器是从镜像创建的运行实例,可以将其启动、开始。停止、删除,而这些容器都是相互隔离(独立进程),互不可见的。
Repository
Repository是image的集合,而Registry是Repository的集合。
Docker在Centos7环境下的安装
1.使用root权限登录系统;
2.更新系统包到最新:
yum -y update
3.添加yum仓库
cat >/etc/yum.repos.d/docker.repo <<-EOF
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enable=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF</pre>
如下图:
4.安装docker包
yum install -y docker-engine
yum install -y docker-selinux
在使用现成的安装包的时候selinux的安装一定要在docker-engine之前
yum list installed|grep docker
5.启动docker
systemctl start docker.service
6.验证docker已经正常安装
docker run hello-world
7.配置docker开机自启动
systemctl enable docker.service
Docker的卸载
使用yum卸载docker
1.列出安装的软件包
yum list installed | grep docker
2.移除软件包
yum -y remove docker-engine.x86_64(这命令不会删除镜像,容器,卷组和用户自配置文件)
3.删除所有镜像,容器和组
rm -rf /var/lib/docker
Docker指令
docker build:创建镜像;
docker pull + 镜像名(镜像地址):获取镜像;
docker images:查看本地镜像;
docker run + 镜像名 : 运行镜像 ;
docker run -d +镜像名 : 后台运行镜像 ;
docker ps : 查看当前运行的容器;
docker exec -it + 容器ID:进入容器(如进入Ubuntu);
docker inspect +容器名或容器ID:查看容器所有信息。
Docker网络
如上图所示Docker网络类型有Bridge、Host 和None
Host模式:容器直接连接到宿主机上,容器内的网络和宿主机的网络一致;
Bridge模式:以bridge桥段和宿主机相连,启动容器时容器会虚拟出一个网卡,然后连接Bridge再和主机连接。
开放端口号的形式运行(以下以运行nginx为例):
docker run -d -p 8088:80 nginx // -d 指后台运行 -p为开启端口号映射 8088为宿主机端口号 80为nginx监听端口号
docker run -d -P(大写P) nginx // -P指开放所有端口号,并随即指定端口号作为映射
开放端口号遇到的问题:
问题描述:开放端口号失败;
原因:docker 指定了快速启动方式(百度知道的=-=);
解决办法:重启(restart)Docker后再运行即可。
Dockerfile语法
[图片上传中...(image-281405-1543037745030-2)]
[图片上传中...(image-c72795-1543037745030-1)]
Docker制作镜像示例
需要用到的操作: Dockerfile的创建,docker build。
1.创建Dockerfile,示例内容如下:
from tomcat //注释:运行于tomcat这个容器
MAINTAINER Jerry_Liang 1097872779@qq.com //作者名Jerry_Liang 联系方式1097872779@qq.com
COPY 项目名.war /usr/local/tomcat/webapps //将war包拷贝到tomcat容器中
2.将项目war包放到与Dockerfile的同一目录上;
3.执行创建镜像命令
docker build -t jpress:latest +Dockerfile路径名(如果为当前工作路径则用“.”)
//注释:-t为指定镜像名和后面的latest为镜像标签
volume操作
挂载实现:
第一种方法:
docker run -p 80:80 -d -v F:\Docker:/usr/share/nginx/html nginx
//注释:-d 指在以守护进程的模式运行(daemon守护进程) -v 即volume将本地指定的文件夹(此处为本机的F盘下的Docker文件夹)挂载到容器的/usr/share/ngixn/html 来实现同步(即主机文件夹有变,容器的文件夹也会发生变化)
第二种方法:
1.docker create -v F:\Docker\data:/var/mydata --name data_container ubuntu
//注释 --name指定容器名字 ubuntu指定基础镜像
2.docker run -it --volumes-from data_container ubuntu /bin/bash
//注释 -it交互方式运行,直接进入容器
运行一个好玩的镜像
运行结果图:
操作:
首先获取搜索该镜像:docker search whalesay
然后获取镜像: docker pull docker/whalesay
最后运行:docker run docker/whalesay cowsay + 你想说的话(比如我输入的是Docker good)
分享镜像
docker login //首先是登录,这样才会有权限分享
docker push + 本地镜像名
参考文章
Docker基础:https://blog.csdn.net/weixin_39381833/article/details/80740235
Docker介绍 : https://blog.csdn.net/u012299594/article/details/52343910
视频教程:https://www.imooc.com/video/15727 ; https://www.imooc.com/learn/824
Linux下的Docker安装教程:https://blog.csdn.net/qq_36892341/article/details/73918672
参考文章:https://www.cnblogs.com/luchuangao/p/7748575.html?tdsourcetag=s_pctim_aiomsg#_label0