Docker容器虚拟化技术

部分图取自https://www.bilibili.com/video/av27122140

为什么会有Docker出现

总结:开发和运维之间项目启动的环境问题,导致可能出现bug。Docker通过把原始环境直接搬运过来,解决了这个问题。
因为一个产品从开发到上线,从操作系统到运行环境,再到应用配置。作为开发+运维的协作我们需要关心很多东西。不同版本的迭代,环境兼容问题,都是对运维的考验。

Docker的理念

目标是:Build,Ship and Run Any App,Anywhere
一次安装,到处运行

Docker能干什么

解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。

下载中的问题

CentOS Docker安装的时候
只支持
CentOS 7 (64bit)
CentOS 6.5(64bit)或者更高
在这里插入图片描述
使用uname -r 查看自己系统相关信息

Docker的基本组成

镜像:就是一个只读的模板,镜像可以用来创建Docker容器,一个镜像可以创建很多容器
相当于Person p= new Person();  左边相当于容器(对象),右边相当于镜像(类)
容器:可以看成是一个简易的Linux环境(包括root用户权限,进程空间,用户空间,等)
容器的定义和镜像几乎一模一样,唯一的区别是在于容器最上面那一层的可读可写的
仓库:集中存放镜像文件的场所

CentOS6.8安装安装步骤

(之前没有安装过得掠过)CentOS-6 中 安装 docker-io 之前需要先卸载 docker 包。
sudo yum -y remove docker

1 、 yum install -y epel -release
Docker使用EPEL发布,RHEL系得OS首先要确保已经持有EPEL仓库,否则先检查OS得版本,然后安装相应得EPEL包
2 、 yum install -y docker -io
3 、安装完成后得配置文件: /etc/sysconfig/docker
正常存在就ok
4 、启动Docker后台服务: service docker start
5 、docker version验证

CentOS7安装安装步骤

较旧的Docker版本称为docker或docker-engine。如果已安装这些程序,请卸载它们以及相关的依赖项。
sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
1、设置存储库
安装yum-utils软件包(提供yum-config-manager 实用程序)并设置稳定的存储库。
yum install -y yum-utils
2、此时官网上得地址下载可能会出问题
推荐使用
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(如果出现Failed to set locale, defaulting to C.UTF-8
echo “export LC_ALL=en_US.UTF-8” >> /etc/profile
执行命令后重新登录即可
)
3、更新yum软件包索引 yum makecache fast
4、安装DOCKER CE yum -y install docker-ce
5、启动docker systemctl start docker
6、查看版本docker version 或者docker run hello-world
7、配置镜像加速度
mkdir -p /etc/docker
vim /etc/docker/daemon.json
在这里插入图片描述
{
“registry-mirrors”:[“https://{}”.mirror.aliyuncs.com]
}
systemctl daemon-reload
systemctl restart docker

8 卸载步骤
systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker

Docker启动

当 Docker 安装完成之后,你需要启动 docker 进程。
sudo service docker start
如果我们希望 Docker 默认开机启动,如下操作:
sudo chkconfig docker on

HelloWorld

docker run hello-world
我已经下载过一次helloworld 所以可能有点不一样,但是出来了Hello from Docker就是正常的
在这里插入图片描述

Docker运行底层原理

Docker是一个Clinet-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接收命令并管理运行再主机上的容器。
容器,是一个运行时环境,就是我们说的集装箱。

Docker是秒级的,虚拟机是分钟级的

在这里插入图片描述

Docker帮助命令

docker version 查看docker版本
docker info 查看docker本地的一些信息
docker help 查看docker的一些命令

Docker镜像命令

docker images 列出本地主机上的镜像
在这里插入图片描述
PEPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
相关指令附加
-a 列出本地所有镜像(包含中间映像层)
-q 只显示镜像id
–digests:显示镜像的摘要信息
–no-trunc:显示完整的镜像信息

docker search 某个镜像的名字
在这里插入图片描述
相关指令附加
-s列出收藏数不小于指定值的镜像 docker search -s 30 tomcat
–automated:只列出automated build类型的镜像 docker search --automated tomcat
–no-trunc:显示完成的说明docker search —no-trunc tomcat

docker pull 镜像的名字[:TAG] 没写版本自动添加latest
在这里插入图片描述
docker rmi 镜像的名字id 后面没写版本等,默认删除latest 删除镜像
如果程序正在启动 加 -f 强制删除
删除单个 docker rmi -f 镜像id
删除多个 docker rmi -f 镜像名1:TAG 镜像名2:TAG
删除全部 docker rmi -f${docker images -qa}

Docker容器命令1

有镜像才能创建容器,这是根本前提
新建并启动容器 : docker run -it 镜像的名字,或者id
docker run [OPTIONS] images [ COMMAND][ARG…]
OPTIONS:
–name=“容器新名字”:为容器指定一个名称:
-d:后台运行容器,并返回容器id,也即启动守护式容器
-i:以交互模式运行容器,通常与-t同时使用
-t:为容器重新分配一个伪输入终端,通常与-i同时使用
-P:随机端口映射
-p:指定端口映射,有4中格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort

列出当前所有正在运行的容器 docker ps[OPTIONS]
-a:列出当前所有正在运行的容器+历史运行过的
-l:显示最近创建的容器
-n:显示最近n个创建的容器
-q:静默模式,只显示容器编号
–no-trunc:不截断退出

退出容器 exit 容器停止退出 ctrl+p+q 容器不停止退出
停止容器 docker stop 容器id或者容器名字
强制停止 docker kill 容器id或者容器名字

删除已经停止的容器
docker rm 容器id
删除多个docker rm -f ${docker ps -a -q}
docker ps -a -q |xargs docker rm
启动容器 docker start 容器id或者容器名字
重启容器 docker restart 容器id或者容器名字

Docker容器命令2-重要

启动守护式容器
docker -run -d 容器名 此时docker ps是查不到的
docker ps -a 会发现容器已经退出
Docker容器后台运行,就必须有一个前台进程
如果容器运行的不是一起挂起的命令,会自动退出

查看容器日志 docker logs -f -t–tail容器id
docker run -d centos /bin/sh -c “while true;do echo hello xxxx;sleep 2;done”
-t 加入时间戳
-f 跟随最新的日志打印
-tail 数字 显示最后多少条

查看容器内运行的进程 docker top 容器id
查看容器内部细节 docker inspect 容器id
进入正在运行的容器并以命令行交互
docker exec -it 容器id ls -l /tmp 在外部就可以直接查看
重新进入 docker attach 容器id
attach和exec区别
attach直接进入容器启动命令的终端,不会启动新的进程
exec是在容器中打开新的终端,并且可以启动新的进程

从容器内拷贝文件到主机上docker cp 容器id:容器内路径 目的主机路径

Dokcer镜像原理

Dokcer镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时,库,环境变量和配置文件
Docker的镜像实际上是由一层层的文件系统组成,这种层级的文件系统UnionFS
UnionFS(联合文件系统)
在这里插入图片描述
例如:一个tomcat中需要多层,最内层kernel内核,在外层centos,在外层,jdk8,在外层tomcat,所以内存下载下来比较大,在pull的时候会由的很多层,对外只暴露最外层

为什么要采用分层结构

共享资源
当多个资源都需要相同的镜像,在宿主机上只用保存一份镜像
镜像的每一层都可以被共享

特点

镜像都是只读的,
当容器启动时,一个新的可写层被加载到镜像的顶部
这一层通常被称为“容器层”,容器层之下的都叫镜像层

Docker镜像commit操作补充

docker commit 提交容器副本使之称为一个新的镜像
docker commit -m=“提交的描述信息” -a=“作者” 容器id
要创建的目标镜像名:[标签名]

例子:docker run -it -p 8080:8080 tomcat
第一个8080是docker对外暴露的端口 第二个8080是真正tomcat在的端口
-p固定端口
-P随机分配

Docker容器数据卷

是什么

用来保存数据在docker中我们使用的卷
因为Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后自然就不存在了。
所以数据需要持久化。

能干嘛

持久化
特点:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接生效
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续没有容器使用为止

数据卷用V命令添加

命令:
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it -v /myDataVolume:/dataVolumeContainer centos
docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos 这个只有只读权限
使用docker inspect 容器id
在这里插入图片描述
有这部分就表示成功
此时在主机中新建一个文件
touch host.txt
在这里插入图片描述

在docker的centos的dataVolumeContainer下也存在相同的文件
在这里插入图片描述
此时容器和宿主机就共享文件了
就算容器退出了,主机修改后也是同步的

用DockerFile添加

Hello.java —》Hello.class
Docker images—》DockerFile

在根目录下新建mydocker文件夹进入
在这里插入图片描述
#volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeCOntainer2" ]
CMD echo “finished, -----successl”
CMD /bin/bash

build后生成镜像 获得一个新镜像xxxx/centos
docker build -f /mydocker/dockerfile -t xxxx/centos .
此时就会用指定路径的文件 用数据卷生成新的镜像文件
在这里插入图片描述
run容器
在这里插入图片描述
此时想要查看主机跟目前共享的容器就使用inspect
可以查看共享的目录
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

数据卷容器–volumes-from

命名的容器挂载数据卷,其他容器通过挂在这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
一句话:活动硬盘上挂活动硬盘 ,实现数据的传递依赖

先启动一个父容器dc01 —在dataVolumeContainer2新增内容
docker run -it --name dc01 xxxx/centos
在这里插入图片描述
docker run -it --name doc2 --volumes-from dc01 xxxx/centos
此时他们就绑定好了可以同步数据
如果删除1,2跟3也可以继续共享
生命周期一直持续到没有容器使用它为止

DockerFile解析

是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本
构建3步骤 1编写DockerFile文件 2docker build 3docker run

DockerFile内容基础知识

1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2:指令按照从上到下,顺序执行
3:#表示注释
4:每条指令都会创建一个新的镜像层,并对镜像进行提交

DockerFile保留字指令

FROM :基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER:镜像维护者的姓名和邮箱地址
RUM:容器创建时需要运行的命令
EXPOSE:当前容器对外暴露的端口
WORKDIR:指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV:用来在构建镜像过程中设置环境变量
ps:ENV MY_PATH /user/mytest 引用的时候$MY_PATH
ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY:类似ADD,拷贝文件和目录到镜像中 ,将从构建上下目录中<源路径>
的文件/目录复制到新的一层的镜像内的<目录路径>位置
VOLUME:容器数据卷,用于数据的保存和持久工作
CMD:指定一个容器启动时要运行的命令
dockerfile中可以由多个cmd命令,但是只有一个生效,cmd会被docker run之后的参数覆盖
ENTRYPOINT:指定一个容器启动时要运行的命令
entrypoint的目的和cmd一样,都是在指定容器启动程序及参数
ONBUILD:当构建一个被继承的dockerfile时运行命令,父镜像在被子镜像继承后父镜像
的onbuild被触发

自定义镜像mycentos

docker本身的centos是不支持vim 和ifconfig的
我们自定义让他拥有
FROM centos
ENV mypath /tmp
WORKDIR $mypath
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD /bin/bash

然后 build
docker build -f /mydocker/dockerfile -t mycentos:1.3 .
用新的镜像运行
就正常运行了
在这里插入图片描述

自定义镜像tomcat9

  1. mkdir -p /xxxxuse/mydockerfile/tomcat9

  2. 在上述目录下 touch c.txt

  3. 将jdk和tomcat安装的压缩包拷贝进上一步目录
    apache-tomcat-9.0.8.tar.gz
    jdk-8u171-linux-x64.tar.gz
    在这里插入图片描述

  4. 在/xxxxuse/mydockerfile/tomcat9目录下新建Dockerfile文件
    在这里插入图片描述

  5. 构建 build

  6. 运行 run

安装mysql

先查本地是否已经安装 用 docker images mysql
如果没有就docker search mysql
docker pull mysql:版本号
下载完成就run
docker run -p 12345:3306 --name mysql -v /xxxxuse/mysql/conf:/etc/mysql/conf.d -v /xxxxuse/mysql/logs:/logs -v /xxxxuse/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
在这里插入图片描述
docker exec -it 容器id /bin/bash

在这里插入图片描述
导入内部的数据成文件备份

安装redis

docker pull redis:3.2

docker run -p 6379:6379 -v /xxxxuse/myredis/data:/data -v /xxxxuse/myredis/conf//redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes

vim /xxxxuse/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf/redis.conf
把redis的基本配置写入

本地镜像发布到阿里云

方法1编写DockerFile

方法2从容器中创建一个镜像
docker commit [options] 容器id [repository:[:TAG]]
-a 作者
-m 提交时的说明文字
docker commit -a xxxx -m “new mycentos 1.4 from 1.3” 容器id mycentos:1.3
在这里插入图片描述

https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
在这里插入图片描述
创建本地镜像
然后点管理
运行下面的代码
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值