docker容器的相关环境及创建镜像1

本文介绍了Docker作为容器管理工具的发展和功能,包括与LXC的关系、Docker的版本分类以及企业版特性。详细阐述了Docker的部署步骤,容器、镜像、仓库之间的关系,以及如何启动和管理容器。此外,讨论了Docker命令行命令、容器镜像的传输和持久化存储方法,还涉及了容器的网络配置和数据存储技术,如overlay2。
摘要由CSDN通过智能技术生成

一、容器管理工具介绍


LXC
2008
是第一套完整的容器管理解决方案
不需要任何补丁直接运行在linux内核之上管理容器。创建容器慢,不方便移植

Docker
是在LXC基础上发展起来的。拥有一套容器管理生态系统
生态系统包含︰容器镜像、注册表、RESTFUL API及命令行操作界面

Docker版本
2017年的3月1号之后,Docker的版本命名开始发生变化,同时将CE版本和EE版本进行分开。
Docker社区版(CE)∶为了开发人员或小团队创建基于容器的应用,与团队成员分享和自动化的开发管道。docker-ce提供了简单的安装和快速的安装,以便可以立即开始开发。docker-ce集成和优化,基础设施。
Docker企业版(EE)∶专为企业的发展和IT团队建立。docker-ee为企业提供最安全的容器平台,以应用为中心的平台。

二、部署docker

用于管理容器,官网地址:www.docker.com

谷歌开发的基于golang语言

1、获取docker-ce的yum

 

 按照官方文档去安装docker

安装之前必须卸载旧版docker,直接复制粘贴

yum list | grep docker  查看是否安装了docker

检测yum源是否配置成功,ls  /etc/yum.repos.d,查看是否存在docker-ce.repo

 2、安装docker

yum repolist   查看yum仓库是否有docker-ce-stable的软件包

 yum -y install docker-ce  直接安装,也可以复制粘贴文档

安装特定版本可以看官方文档

 设置docker开机自启 systemctl enable docker,启动docker,systemctl start docker

 如果报错daemon守护进程没有开启,就是没有开docker服务

 3、容器、镜像、仓库之间的关系

registry是仓库,但实际上是注册表的意思,里面可以放镜像

 docker客户端收到命令发送给docker daemon守护进程,假如命令是调用CentOS镜像资源。

daemon就会在本地找是否有对应的镜像,如果没有就会在Registry仓库下载。

最后才通过对应的镜像images创建容器

安装的软件其实是在容器中,就比如字帖,就是一个模板。写字的时候需要加一张纸在上面,所以软件安装到容器中效率高,还可以用完就删,不会对镜像产生影响。

4、启动容器

第一步:查看本地是否有镜像

 第二步:搜索镜像docker search 镜像名称

 第三步:下载镜像

docker pull centos  下载centos镜像,默认是latest。可以在后面添加指定的版本号

docker pull centos:7.5  docker pull mysql:8.0.2

 查看镜像是否下载完成docker images

 第四步:运行容器

 --name=c1是给容器命名,只不过二进制代码才是容器的真正的名称

 uptime是容器启动时间  还有用户和1到15分钟的 负载均衡
 

在容器中安装apache、iproute

 在本地可以访问容器ip并获取资源,exit退出之后就无法访问了,ps可以查看容器中的进程

5、docker daemon管理

远程管理docker daemon充分条件
可以把docker client与docker daemon分开部署

可以通过第三方软件管理docker daemon创建的容器

第一步:关闭docker daemon守护进程并修改daemon配置文件

 修改后只保留dockerd

 修改之后必须reload

 第二步:重新启动docker

systemclt  start  docker

第三步:添加远程配置文件管理docker daemon

 默认情况,/etc/docker下没有daemon.json

键值对的配置规则:hosts   对应" "," " 

远程管理docker daemon 必须写2375端口

重启docker

第四步:远程连接测试

注意是远程主机的ip,不是容器的ip。

 网页访问的时候要加端口号

可以通过远程命令pull下载镜像

6、docker命令行命令介绍

docker --help

可以分为docker管理命令和普通命令,管理命令是普通命令的补充

例如image ,普通命令是docker images  但是管理类命令是docker image ls

pull下载镜像

 6.1、容器镜像传输

打包本地镜像用save命令

 删除镜像之前必须删除容器rm 容器名称或者container id

 容器哪怕是退出状态也会占用镜像

 docker  images  查看镜像

把镜像导入本地用load -i tar包名称

启动容器,run是普通命令,container是管理命令

容器可以随便创建,所以不用在意容器,它的作用其实就是用来跑服务的。

echo "container webpage" >> /var/www/html/index/html

 容器安装httpd服务之后用决定路径命令启动

为了方便使用,可以把容器保存成tar包,也就是基于容器生成容器镜像

 导入容器镜像tar包用import -m 事务标签 容器镜像tar包  容器镜像标签 

 可以用history 命令查看容器镜像的历史信息,之前创建了哪些容器镜像

方便通过标签tag去识别之前安装的容器镜像

创建一个新的容器c4可以直接使用导入的容器镜像

 之前安装一个软件需要重复在多台服务器上安装,容器镜像保存并导入之后就不用重复安装了

每创建一个新的容器都可以直接使用导入的容器镜像

二、查看容器ip的方法

第一种:exec 容器的名称 ip a s

查看正在运行的容器的ip,不用进入容器中,直接在终端就能查看

run是创建一个新的容器

 第二种:不需要和容器进行交互,直接用 docker  inspect  容器名称  

inspect可以查看容器的 所有信息

 第三种:需要进入容器的,必须安装iproute

 容器的ip地址是由docker0网桥自动分配的 

2.1、停止正在运行的容器

docker ps 是查看正在运行的容器  docker ps -a  是查看所有存在的容器

删除容器之前必须stop

 关闭和开启多个容器

 通过attach附加参数进入进入容器,前提是容器必须是开启状态

 删除容器之前必须停止stop

2.2、容器端口映射

容器的配置是一次性的,无法修改,只能删除之后释放容器空间。

停止容器之后rm容器,重新配置端口等信息

 197服务器上的容器映射主机80端口

 容器端口映射

 

合法的端口,全世界都能访问

less /etc/services

 主机的端口有多少个?

分情况,tcp协议有多少个,udp协议有多少个,然后每个ip又都有tcp和udp

端口号的范围:1 ~ 65535

一种是发送信息以后,可以确认信息是否到达,也就是有应答的方式,这种方式大多采用TCP协议;

一种是发送以后就不管了,不去确认信息是否到达,这种方式大多采用UDP协议。对应这两种协议的服务提供的端口,也就分为TCP端口和UDP端口。

三、数据持久化存储

3.1、容器使用docker主机存储数据

第一步∶在Docker Host创建用于存储的目录

docker  --help  查看-v命令是创建一个volume

挂载一个volume,随时随地可以把容器中的数据保存到docker主机

 创建容器时自动就创建了data目录到/目录下,所以docker主机创建的目录就可以自动挂载到data

进入正在运行的容器并以命令行交互,attach进入容器之后才能touch

案例:运行在容器中的http服务,使用docker host的/web目录中的网页文件,并能够在doker host上进行修改,修改后立即生效。
第一步︰创建/web并添加网页文件

第二步:启动容器对/web目录进行挂载

 也就是把docker主机创建的web目录挂载到容器c200使用

第三步:安装好http服务之后访问8080端口

httpd -k start   开启http服务,然后使用另外的主机访问docker主机ip:8080就可以访问到web目录 

ctrl + p +q 退出容器不停止运行容器之后可以修改主机的web目录内容

容器时间同步

docker run -it -v /etc/localtime:/etc/localtime --name 容器名称 centos:latest /bin/bash

把docker host的时间同步到容器

在容器外执行容器内命令

exec 是在容器中打开新的终端,并且可以启动新的进程。用exit退出,不会导致容器的停止。

容器内的命令ls, docker ip a s  不是容器内的命令

 容器间使用link互联

 容器的编排其实就是每个服务的启动顺序,例如lnmp架构中如果有调度器,必须先启动数据库服务再启动web服务器。web服务器是调度服务器的依赖,数据库服务器又是web服务器的依赖

第一步︰创建被依赖容器

第二步:创建依赖于源容器的容器

也就是说想启动容器,必须先启动被依赖的容器c202,才能启动c203

容器202和203被自动映射到了/etc/hosts中

 哪怕停止运行容器之后新增一个容器去抢占了原有的ip也不会影响容器的编排关系

容器的ip还是会自动映射到/etc/hosts文件中

只能先启动被依赖的容器,才能启动依赖于源容器的容器

四、docker容器镜像

 4.1、容器镜像介绍

Docker镜像就是一组只读的目录,或者叫只读的Docker容器模板,镜像中含有一个Docker容器运行所需要的文件系统,所以我们说Docker镜像是启动一个Docker容器的基础。
可以将Docker镜像看成是Docker容器的静态时,也可将Docker容器看成是Docker镜像的运行时。
从Docker的官方文档来看,Docker容器的定义和Docker镜像的定义几乎是相同,Docker容器和Docker镜像的区别主要在于docker容器多出了一个可写层。
 

联合文件系统(UnionFS )是一种轻量级的高性能分层文件系统,它支持将文件系统中的修改信息作为一次提交,并层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,应用看到的是挂载的最终结果。
联合文件系统是实现Docker镜像的技术基础。Docker镜像可以通过分层来进行继承。例如,用户基于基础镜像(用来生成其他镜像的基础,不是centos操作系统,只是复刻了相同的文件系统目录结构)来制作各种不同的应用镜像(tomcat、apache)。这些镜像共享同一个基础镜像层,提高了存储效率。此外,当用户改变了一个Docker镜像(比如升级程序到新的版本),则会创建一个新的层
( layer )。因此,用户不用替换整个原镜像或者重新建立,只需要添加新层即可。用户分发镜像的时候,也只需要分发被改动的新层内容(增量部分)。这让Docker的镜像管理变得十分轻量级和快速。
 

镜像是静态的只读状态,但是镜像开启的 容器可以在里面读写并安装服务

还可以把容器镜像打包之后放到其他docker主机上运行

 docker client向docker daemon发起创建容器的请求

docker daemon查找有无客户端需要的镜像
如无,则到容器的镜像仓库中下载需要的镜像
拿到容器镜像后再启动容器

容器镜像就是文件系统,用来保存和启动容器的

4.2基础镜像


1.部署一台最小化软件安装操作系统

2.把最小化软件安装操作系统根目录进行打包
每台计算机的映射都是不一样的,会自动映射键盘鼠标等,如果镜像迁移到另外一台计算机,一定会报错。所以打包镜像必须排除进程目录/proc和内核目录/sys

 --numeric-owner   总是以数字代表用户/组的名称(打包的镜像里面用户和组的名称和id一定不一样)

-cvf 创建可显示的文件,就是把/目录打包成tar包  

3.使用docker import导入至容器运行主机
 

 用scp命令把打包的基础镜像拷贝到另外一台主机的/root

docker import tar包名称 自定义名称

导入镜像成功之后docker images 查看或者 docker image ls

运行容器docker run -it --name 

 proc进程目录是容器本身的目录和镜像没关系

4.3、应用镜像

在基础镜像运行的容器中安装apache,如果报错就yum clean all再安装

然后使用commit提交镜像

docker commit 容器名称 自定义应用镜像名称:tag标签

 应用镜像就是在基础镜像运行的容器中安装软件,然后commit成一个应用镜像

运行应用镜像,也就是运行安装的软件对应的服务,永远杀不死,一直运行。

 

4.4、Dockerfile的关键字

FROM(指定基础image )
MAINTAINER(用来指定镜像创建者信息)

RUN(运行命令)
CMD(设置container启动时执行的操作)
如果容器镜像中有此命令,启动容器时,不要手动让容器执行其它命令

ENTRYPOINT(设置container启动时执行的操作)进入点
 USER(设置container容器的用户)
EXPOSE(指定容器需要映射到宿主机器的端口)暴露端口号

ENV(用于设置环境变量)
ADD(从src复制文件到container的dest路径)

VOLUME(指定挂载点)
WORKDIR(切换目录)

4.5、docker build 通过Dockerfile 创建应用镜像的过程分析

通过Dockerfile创建一个可以在启动容器时就直接启动httpd应用的镜像
步骤∶
1、创建一个文件夹(目录)
2、在文件夹(目录)中创建Dockerfile文件及其它文件

3、使用docker build命令创建镜像
4、使用创建的镜像启动容器


目的︰通过Dockerfile创建一个可以在启动容器时就直接启动httpd应用的镜像步骤︰
创建一个目录,用于存储Dockerfile所使用的文件
在此目录中创建Dockerfile文件及制作镜像所使用到的文件
在此目录中使用docker build创建镜像(读取Dockerfile文件)

使用创建的镜像启动容器

思考︰
1.基础镜像是谁? centos7u62.安装httpd
3.yum -y install httpd
4.安装完成后如何启动httpd?编写一个把httpd启动的脚本文件

5.把httpd放在前端执行还是后端执行?前端
6.暴露端口? tcp80
7.添加一个测试文件,用于验证httpd是否可用?
 

4.6、使用Dockerfile创建应用镜像

 创建一个test目录之后编辑一个脚本

vim run-httpd.sh

删掉apache的pid

前端运行httpd服务 foreground前景

 直接创建一个index.html

然后再创建Dockerfile文件

vim Dockerfile

注意必须把index.html 文件add到项目文件目录下面/var/www/html/

如果安装过程中报错还可以添加 rpm --rebuilddb  重建数据库

 

 使用docker build 创建应用镜像

-t 指定应用镜像的名称,自定义的需要tag

-d 后台运行应用镜像时不能在后面加 /bin/bash ,因为脚本中的CMD会被覆盖

验证直接用inspect 应用镜像id 查看IP,就能访问到写入的index.html内容

Dockerfile创建的 应用镜像更换项目内容

 在test目录创建一个目录挂载到项目目录就可以实现网站内容更换

 

4.6.1、Dockerfile工作原理

在Dockerfile定义所要执行的命令,使用docker build创建镜像,过程中会按照Dockerfile所定义的内容打开临时性容器(使用docker commit进行提交),把Dockerfile文件中的命令全部执行完成,就得到了一个容器应用镜像。

4.6.2、通过Dockerfile安装nginx应用镜像

 前提都是在docker服务器上有基础镜像

第一步:创建一个目录并在目录中创建相关的文件

 报错是因为echo '单引号'

第二步:vim Dockerfile

 第三步:通过docker build 创建nginx镜像

 镜像都是创建到当前目录的

容器是不支持做数据持久化的,所以才关闭nginx的后台运行,不关闭的话

容器会产生访问日志,只能收集,无法保存

docker images验证镜像是否创建成功

第四步:后台启动nginx应用镜像容器

 通过docker inspect 容器id 查看容器的ip

curl http://ip 访问容器的项目文件内容

五、docker存储数据的位置和方法

docker info 尽可能显示docker系统信息

 存储的驱动overlay2

 AUFS联合文件系统是乌班图   统一文件系统是CentOS

 容器镜像就是把系统的 /目录打包

下载镜像之后会发现镜像的存储位置是overlay2

 查看镜像可以diff看到根目录的结构

overlay2中的l文件本来是空的,但是创建镜像之后就会产生于软链接去挂载镜像

因为镜像的字符长度超了

 5.1 Overlay及Overlay2原理


OverlayFS将单个Linux主机上的两个目录合并成一个目录。这些目录被称为层,统一过程被称为联合挂载。OverlayFS底层目录称为lowerdir,高层目录称为upperdir。合并统一视图称为merged。当需要修改一个文件时,使用CoW将文件从只读的Lower复制到可写的Upper进行修改,结果也保存在Upper层。在Docker中,底下的只读层就是image,可写层就是Container。


overlay2是overlay的改进版,只支持4.0以上内核添加了Multiple lower layers in overlayfs的特性,所以overlay2可以直接造成muitiple lower layers不用像overlay一样要通过硬链接的方式(最大128层) centos的话支持3.10.0-514及以上内核版本也有此特性,所以消耗更少的inode

 本质区别是镜像层之间共享数据的方式不用

 overlay共享数据方式是通过硬连接
而overlay2是通过**每层的lower文件*

 overlay2这个目录存储的镜像及数据如果磁盘空间不够了可以

考虑去查找不需要的容器rm删除

docker运行后overlay2目录就会新增数据,运行前只有一条镜像数据


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值