Docker通用基础(20210810)

Docker通用基础

容器技术概述

容器概述

技术发展趋势

核心构建单元

服务器—>虚拟机—>容器

不可变基础设施

从宠物到牛群

隔离单元

更轻体量,更快启动速度

供应商

闭源单一供应商到开源跨供应商

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7053YC4U-1628772213804)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210810144204756.png)]

云原生

定义(CNCD):云原生技术有利于各组长在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用

技术代表:容器、服务网络、微服务、不可变基础设施、声明式API

CNCF基金会

22家白金、19家黄金、505家白银会员

中国是全球第3大云原生生态国家

软件架构演进

单体式架构:包含多功能,大而全超级工程

SOA架构:功能抽取,以服务为中心管理项目,各系统间进行调用,ESB管理项目

微服务架构:核心思路是拆分,把项目拆分成一个个小项目,服务自治,组件化

应用落地部署面临的挑战

快速开发的诉求

云间迁移

环境一致性

Docker与容器

操作系统与容器

传统操作系统

进程可见、可相互通信

共享同一份文件系统

容器

资源视图隔离namespace

资源使用配额cgroups

独立文件系统chroot

容器是什么

本质上是一个视图隔离、资源限制、独立文件系统的进程集合

Docker

一家公司

实现容器技术的一种

容器核心技术

进程隔离技术:namespace

对容器进行网络、通信、文件、权限等对象的隔离

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-31gGA5l0-1628772213808)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210810151720213.png)]

进程资源配额技术:cgroups

为容器设置系统资源配额(CPU、内存、IO等)

Docker构造:client-server

execdriver:存储容器定义配置信息

networkdriver:完成docker容器网络环境的配置

graphdriver:负责对容器镜像的管理

容器VS虚拟机

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GPfUEUDa-1628772213810)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210810152119747.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RgWgHT73-1628772213811)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210810152433833.png)]

容器常用术语

Docker Engine 基础设施标准化:使得底层OS透明化

Docker Image 应用交付标准化:代替以往代码+一堆部署文档的交付方式

Docker Container 运维管理标准化:种类应用都跑在一个个标准化的容器中

Docker Registry 分发部署标准化:一次构建,随处部署

Docker核心概念

在这里插入图片描述

Docker安装和操作基础

安装Docker

安装前准备

cat /etc/centos-release

uname -r #内核版本在3.10以上

配置yum源

cd /etc/yum.repos.d/

wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum clean all #清除缓存

yum makecache #把服务器的包信息下载到本地电脑缓存起来

安装Docker

yum install docker-ce -y

启动Docker

systemctl start docker

systemctl enable docker

验证

docker info

docker version

基本操作

启动docker容器

拉取镜像

docker search centos

docker pull centos

查看镜像

docker images

创建一个后台容器

docker run -itd --name c1 centos /bin/bash

docker run -itd --name <name> centos:label /bin/bash

查看容器

docker ps [-a]

docker inspect c1 #容器元数据

run like <容器名> #inspect的替代,显示容器信息
容器管理

容器生命周期管理

docker stop c1

docker ps -a #能看到所有容器,包括被停止的容器

docker start c1

docker restart c1

docker rm c1

打印容器的控制台输出

docker logs c1

进入后台容器

docker exec -it c1 /bin/bash
镜像下载加速器

通过配置镜像下载加速器的方式提示镜像下载速度

mkdir -p /etc/docker

tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://m4x67mmr.mirror.aliyuncs.com"]
}vim /etc/docker/daemin.json 进行编辑追加

systemctl daemon-reload

systemctl restart docker
docker pull

docker push

docker安装后默认没有daemon.json这个配置文件,需要进行手动创建。配置文件的默认路径:/etc/docker/daemon.json

daemon.json涉及以下2个参数:

“insecure-registries”: [ ], #这个私库的服务地址

“registry-mirrors”: [ ], #私库加速器

容器自定义镜像

容器镜像概述

使用流程

在这里插入图片描述

  1. 首先开发者在开发环境机器上开发应用并执行命令。Docker执行命令,构建镜像并存储在机器上
  2. 开发者发送上传镜像命令,Docker收到命令后将本地镜像上传到镜像仓库
  3. 开发者向生产环境机器发送运行镜像命令,生产环境机器收到命令后,Docker会从镜像仓库拉取镜像到机器上,然后基于镜像运行容器
镜像分层复用特征

好处:

  1. 提高分发效率:对大镜像而言可以拆分后并行下载
  2. 镜像数据分层共享:当本地存储包含一些数据时,只需下载增量数据即可
  3. 节约存储空间:让镜像本地保存更省空间
    在这里插入图片描述
镜像分层结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yYHJa54x-1628772213815)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210810170321003.png)]

只有容器层是可写的,容器层下面所有镜像层都是只读的

叠加文件系统:从上往下依次在各镜像层中查找文件

Copy-on-Write:只有当需要修改时才复制一份数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bqDmdS7z-1628772213816)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210810170256892.png)]

docker history <image id> #查看每层操作

自定义镜像

Docker commit

该类似于虚拟化中虚拟机模板的制作

步骤

docker run -itd --name con1 centos /bin/bash
docker run -itd --name <name> <image> /bin/bash
# -it 表示与容器进行交互式启动 
#-d 表示可后台运行容器(守护式运行)  
#--name 给要运行的容器起的名字  
#/bin/bash  交互路径

docker exec -it con1 /bin/bash

容器内进行配置操作

docker stop <容器id>

docker commit -m "my new centos" -a "name" con1 my/centos:v2

docker images

但这种方法没有记录,一般比较少用(场景:入侵后保存现场)

Dockerfile构建

基本语法

参考菜鸟教程:https://www.runoob.com/docker/docker-dockerfile.html

FROM #基于哪个镜像

MAINTAINER #镜像创建者

RUN #安装软件用

ADD 
COPY #将宿主机文件拷贝到容器中  注意两者区别

CMD #cotainer启动时执行的命令,但是一个dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD

ENTRYPOINT #配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖

示例

编写Dockerfile文件

FROM nginx:1.13.12

MAINTAINER Aaron

ADD index.html /usr/share/nginx/html/index.html

自定义镜像

docker build -t my/nginx:v1 .

docker images

验证

docker run -itd --name con1 my/nginx:v1

curl http://ip  #验证nginx服务

编写Dockerfile文件示例

FROM centos
MAINTAINER yourname your_mail_address
ENV TIME_ZONE Asia/Shanghai
ARG NV="nginx-1.18.0"
COPY nginx.conf /data/nginx/conf/
ADD $NV.tar.gz /tmp
RUN yum -y install gcc gcc-c++ make openssl-devel pcre-devel \
    && mkdir -p /data/ \
    && cd /tmp/$NV \
    && ./configure --prefix=/data/nginx \
    && make -j 2 \
    && make install \
    && echo "${TIME_ZONE}" > /etc/timezone \
    && ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime \
    && rm -rf /tmp/nginx* \
    && yum -y remove gcc gcc-c++ make \
    && yum clean all
WORKDIR /data/nginx/
EXPOSE 80
CMD ["./sbin/nginx","-g","daemon off;"]

注意文件名只能首字母D大写,其余均小写

镜像导出和导入

制作好镜像后,可以对镜像执行打包导出的动作,拷贝到目标服务器,再通过镜像导入的方法实现镜像跨主机的迁移

镜像导出

docker save -o centos_bk.tar.gz centos

镜像导入

docker load -i centos_bk.tar.gz

删除镜像

docker rmi ID/Name

容器镜像仓库

镜像仓库概述

镜像仓库

集中存放镜像的地方(容易混淆:注册服务器——管理镜像仓库的服务器),每个服务器可以有多个仓库,每个仓库可以有多个镜像,因此仓库可以认为是一个具体的目录

路径:dl.dockerpool.com/repo/centos: tag

dl.dockerpool.com是注册服务器,repo是镜像仓库名称,centos是镜像名称

分类

公共仓库:docker官方维护的公共库,可以注册账号后构建自己的私有存储

私有仓库:在公司内部为了提高分享的速度,需要在公司内部自己搭建一个本地仓库,供私人使用
在这里插入图片描述

私有仓库部署实践

基于开源的registry镜像构建私有仓库
  1. 下载registry镜像

    docker pull registry 
    
  2. 启动镜像注册容器服务

    docker run -d -p 5000:5000 --restart=always --name registry registry
    
  3. 对下载好的镜像打标签

    docker tags <oldname:oldtag> <newname:newtag>
    
  4. 上传镜像

    docker push <name:tag>
    

示例:创建alpine镜像并上传到某平台

1、修改host
vi /etc/hosts  ==> ip 网址域名

2、修改daemon.json 
vi /etc/docker/daemon.json ==>  {"insecure-registries" : ["网址域名"]}
#重启 
systemctl daemon-reload 
systemctl restart docker

3、拉取镜像 pull
docker pull alpine

4、打标签 tag
docker tag alpine:旧TAG 网址文件夹路径/alpine:新TAG
docker tag 旧REPOSITORY名:旧TAG 新REPOSITORY名:新TAG

5、交互登录 login
docker login -uusername 网址域名
password:password

6、上传镜像 push
docker push 网址文件夹路径/alpine:新TAG
docker push 新REPOSITORY名:新TAG
基于开源的Harbor项目建构私有仓库

网络和数据持久化

容器桥接网络模式

概述

Docker四种网络模式

Bridged

Host

Container

None

Bridged模式

在这里插入图片描述

桥接模式

Docker进程启动时会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看,可以在容器和host上使用ip link show 的方法定位容器和veth的对应关系。

在这里插入图片描述

数据持久化

Docker内部及容器间管理数据的方式:数据卷、数据卷容器

数据卷

一个可供一个或多个容器使用的特殊目录,可以提供很多有用的特性

  1. 实现容器数据的持久化存储
  2. 对数据卷的修改会立马生效
  3. 对数据卷的更新不会影响镜像
  4. 卷会一直存在,直到没有容器使用(类似于linux下对目录或文件进行mount)

创建数据卷

docker run -itd --name con1 centos -v /data0 /bin/bash

docker run -itd --name con2 centos -v /local_data0:/data0 /bin/bash

验证数据卷映射

docker inspect con1/con2 #获取容器/镜像元数据

docker stop con2

docker rm con2
数据卷容器

如果有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器

其实就是一个正常容器,专门用来提供数据卷供其他容器挂载

在这里插入图片描述

创建数据卷容器

docker run -itd --name db0 centos -v /vol1 -v /vol2 /bin/bash

docker run -itd --name db1 centos --volumes-from db0 /bin/bash

docker run -itd --name db2 centos --volumes-from db0 /bin/bash

验证数据卷映射

docker stop db0

docker rm db0

示例:通过容器挂载实现html页面更新

docker run -itd --name c01 -v /home/html:/data/nginx/html -p 8002:80 nginx:1.18.0

run -itd --name c01 / #创建容器c01
-v /home/html:/data/nginx/html / #把虚拟机的/home/html挂载(共享)到容器的/data/nginx/html
-p 8002:80 nginx:1.18.0 #把容器虚拟端口80映射到(可以是宿主机)端口8002(1000——65535都可)

然后可以通过两种方式查看已经修改的html
1、curl
curl 10.10.24.9:8002 
2、浏览器输入上面地址(10.10.24.9:8002)

数据卷的挂载是通过把本地的目录覆盖到容器中的。

当宿主机文件不存在时,不能挂载;当文件夹不存在时,挂载到容器会用一个空文件夹覆盖容器原有目录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值