Docker入门
VM虚拟机缺点:
- 1、资源占用多
- 2、冗余步骤多
- 3、启动慢
Docker是内核级虚拟化,其不像传统的虚拟化技术- -样 需要额外的Hypervisor支持,所以在T一 台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。
Docker的三大组成:镜像,容器,仓库
Docker镜像(Image)就是一一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建很多容器。
它也相当于是一个root文件系统。比如官方镜像centos:7就包含了完整的一套 centos:7最小系统的root文件系统。
相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容 器实例类似于java中new出来的实例对象。
1、从面向对象角度
- Docker利用容器(Container) 独立运行的一个或- -组应用, 应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是Java中的类和实例对象- -样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台
2、从镜像容器角度
- 可以把容器看做是- - 个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
仓库(Repository)是集中存放镜像文件的场所。
类似于
Maven仓库,存放各种jar包的地方;
github仓库,存放各种git项目的地方;
Docker公司提供的官方 registry 被称为Docker Hub,存放各种镜像模板的地方。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub(https://hub.docker.com/),
存放数量庞大的镜像供用户下载。国内的公开仓库包括阿里云,网易云等
需要正确的理解仓库/镜像/容器这几个概念:
Docker本身是- -个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成- - 个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来- - 个对象)。
image文件可以看作是容器的模板。Docker 根据image文件生成容器的实例。同一个image文件,可以生成多个同时运行的容器实例。
镜像文件
- image 文件生成的容器实例,本身也是-一个文件,称为镜像文件。
容器实例
- 一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建- -个对应的运行实例, 也就是我们的容器
仓库
- 就是放- -堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库中拉下来就可以了。
Docker是一个Client-Server结构的系统,Docker守 护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。容器,是一个运行时环境,就是我们前面说到的集装箱。可以对比mysq|演 示对比讲解。
yum install -y yum-utils device-mapper-persistent-data lvm2 //安装必要工具
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo //设置yum源
yum install -y docker-ce //下载docker
systemctl start docker //启动docker
为什么Docker会比VM虚拟机快?
(1)docker有着比虚拟机更少的抽象层
- 由于docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上:docker将会在效率上有明显优势。
(2)docker利用的是宿主机的内核,而不需要加载操作系统OS内核
- 当新建一个容器时,docker不需要和虚拟机一样重新加载–个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费
资源的过程,当新建–个虚拟机时,虛拟机软件需要加载OS,返回新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则
省略了返回过程,因此新建个docker容器只需要几秒钟。
- 当新建一个容器时,docker不需要和虚拟机一样重新加载–个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费
帮助类启动命令:
启动docker: systemctl start docker
停止docker: systemctl stop docker
重启docker: systemctl restart docker
查看docker状态: systemctl status docker
开机启动: systemctl enable docker
查看docker概要信息: docker info
列出本地主机上的镜像:
docker images
各个选项说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签版本号
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
同一仓库源可以有多个TAG版朴代表这个仓库源的不同个版本,我们使用REPOSITORY:TAG来定义不同的镜像。如果你不指定一个镜像的版本标签,例如你只使用ubuntu, docker 将默认使用 ubuntu:latest 镜像
命令:
docker images -a:列出本地所有的镜像(包括历史映像层)
docker images -q:只显示镜像id
docker search 某个镜像名字
下载:(没写版本号默认下载最新版)
docker pull ubuntu
docker pull redis:6.0.8
删除:(删除镜像)
删除单个:docker rmi-f 镜像id
删除多个:docker rmi-f 镜像名1:TAG 镜像名2:TAG
删除全部:docker rmi-f $(docker images -qa)
unbutu:
新建+启动容器:docker run [OPTIONS] IMAGE [COMMAND] [ARG..] (启动交互式容器(前台命令行))
OPTIONS说明:
OPTIONS说明(常用) :有些是一个减号,有些是两个减号
--name="容器新名字" 为容器指定-一个名称;
-d:后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i: 以交互模式运行容器,通常与-t同时使用;
-t: 为容器重新分配-一个伪输入终端,通常与-i同时使用;
也即启动交互式容器前台有伪终端,等待交互);
-P:随机端口映射,大写P|
-p:指定端口映射,小写p
进入容器中:
docker run ubuntu
docker run -it ubuntu /bin/bash
ps -ef
查看正在运行的容器:(需在容器外面查看)
docker ps
给容器取名字:
docker run -it --name=myu1 ubuntu /bin/bash
OPTIONS说明(常用):
-a:列出当前所有正在运行的容器+历史上运行过的
-|:显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
docker ps -n 1
docker ps -q
退出容器:
exit -- run进去容器,exit退出,容器停止
ctrl+p+q -- run进去容器,ctrl+p+q退出,容器不停止
docker start 容器id 启动已停止运行的容器
docker restart 容器id或者容器名 重启容器
docker stop 容器id或者容器名 停止容器
docker kill 容器id或者容器名 强制停止容器
docker rm 容器id 删除已停止的容器
docker rm -f clever_curran 强制删除
docker rm -f $(docker ps -a -p) 一次性删除多个容器实例
docker ps -a -q | xargs docker rm 一次性删除多个容器实例
演示当前只有运行的id号:
docker ps -a -p
启动守护式容器(后台服务器)
docker run -d unbuntu
使用镜像centos:latest以后台模式启动一个容器
docker run -d centos
问题:然后docker ps-a进行查看,会发现容器已经退出
问题:然后docker ps-a进行查看,会发现容器已经退出
- 很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程.容器运行的命令如果不是那些一直挂起的命令 (比如运行top, tail) ,就是会自动退出的。
- 这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如service nginx start但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行,常见就是命令行模式,表示我还有交互操作,别中断,0(∩_∩)O哈哈~
redis前后台启动演示case
(前台交互式启动)docker run -it redis:6.0.8
(后台守护式启动)docker run -d redis:6.0.8
(查看容器日志) docker logs 容器id
查看容器内运行的进程
docker top 容器id
重新进入未结束的容器
docker exec -it 容器id bashShell
docker attach 容器id
案例演示,用centos或者unbuntu都可以
上述两个区别:
- 推荐大家使用dockerexec命令,因为退出容器终端,不会导致容器的停止。、
- 用之前的redis容器实例进入试试
(1): docker exec -it 容器id /bin/bash
(2):docker attach 容器id
- attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止.
- exec 是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止。
从容器内拷贝文件到主机上
- 容器→主机
- dockercp容器ID:容器内路径目的主机路径
公式:
docker cp容器ID:容器内路径目的主机路径
导入和导出容器
- export 导出容器的内容流作为一个tar归档文件[对应import命令]
- import从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]
cat abcd. tar | docker import - atguigu/ ubuntu: 3.7
镜像:
镜像
- 是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成-个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。
- 只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来-一个对象)。
UnionFS (联合文件系统) :
- Union文件 系统(UnionFS)是一.种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一.次提交来一层层的叠加,同时可以将不同目录挂载到同-一个虚拟文件系统下(unite several directories into a single virtualfilesystem)。Union 文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
- 特性: - -次同时加载多个文件系统,但从外面看起来,只能看到-一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的
Docker镜像层都是只读的,容器层是可写的当容器启动时,–个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
- 当容器启动时,一个新的可写层被加载到镜像的顶部。这一-层通常被称作 “容器层”,“容器层” 之下的都叫“镜像层”。
- 所有对容器的改动-无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
为什么Docker镜像要采用这种分层结构呢?
- 镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。
- 比如说有多个镜像都从相同的base镜像构建而来,那么Docker Host只需在磁盘上保存一份base镜像;同时内存中也只需加载- -份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
docker commit 提交容器副本使之成为一-个新的镜像
docker commit -m="提交的描述信息" -a="作者"容器ID要创建的目标镜像名:标签名]
安装vim:
更新包管理工具:
apt-get update
安装所需要的vim:
apt-get -y install vim
Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似Java继承于- -个Base 基础类,已再按需扩 展。
新镜像是从base镜像- -层一 -层叠加生成的。每安装-一个软件, 就在现有镜像的基础上增加一层。
commit操作案例
docker commit 提交容器副本使之成为一-个新的镜像
docker commit -m="提交的描述信息" -a="作者"容器ID要创建的目标镜像名:标签名]
(1):启动新加的容器:
docker start bf0c365ce28b
(2):查看容器
(3):提交:
docker commit - m="vim cmd add ok" -a=" iZwz93fcs 15b 7znd3w9gfcZ" bf0c365ce28b myubuntu:1.3
(4):成功:
myubuntu 1.3 4c076cadc498 10 seconds ago 174MB
容器数据卷是什么?
- 卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器, 但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
- 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
容器数据卷能干嘛?
- 将运用与运行的环境打包镜像,run后形成容器实例运行,但是我们对数据的要求希望是持久化的
Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。
为了能保存数据在docker中我们使用卷。
特点:
- 1:数据卷可在容器之间共享或重用数据
- 2:卷中的更改可以直接实时生效,爽
- 3:数据卷中的更改不会包含在镜像的更新中
- 4:数据卷的生命周期–直持续到没有容器使用它为止
添加:
- 命令:
docker run -it -privileged=true -v/宿主机绝对路径目录:/容器内目录 镜像名
查看容器卷是否挂载成功:
docker inspect 容器id
" Mounts": [
{
"Tyne". "bind"
" Source": " / tmp/ myHostData" ,
" Destination": " / tmp/ myDockerData",
"Mode
" RW":b true,
" Propagation": " rprivate"
}
},
容器实例内部被限制,只能读取不能写
docker run -it --privileged=true -v/宿主机绝对路径国录:/容器内目录:ro 镜像名
容器卷的继承:
docker run -it --privileged=true --volumes-from 父类--name u2 ubuntu
docker run - it -- privileged=true -- volumes- from u1 - - name u2 ubuntu
免修改版说明
docker pull billygoo/tomcat8-jdk8
docker run -d -P 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
docker pu11 mysq1 // 下载MySQL镜像
docker run --name mysq1 --restart=always -p 3306:3306 -e MYSQL_ ROOT_ PASSWORD=密码-d mysq1 //启动MySQL
挂容器卷创建mysql:
docker run -d -p 3306:3306 -- privi leged=true
-v / zzyyuse/ mysq1/ log:/var/ log/ mysql
-v /zzyyuse/ mysq1/data:/var/lib/mysql
-v / zzyyuse/ mysql/conf:/etc/mysq1/conf. d
-e MYSQL_ ROOT PASSWORD= 123456
-- name mysql mysql:5.7
docker run -p 6379:6379 --name myr3 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v/app/redis/data:/data -d redis redis-server /etc/redis/redis.conf
查看所有端口的使用情况
netstat -nultp
查看某端口
netstat -tunlp|grep 端口号
杀死进程
xxxxxxxxxx kill -9 端口号