Docker通用基础(20210810)
Docker通用基础
容器技术概述
容器概述
技术发展趋势
核心构建单元
服务器—>虚拟机—>容器
不可变基础设施
从宠物到牛群
隔离单元
更轻体量,更快启动速度
供应商
闭源单一供应商到开源跨供应商
云原生
定义(CNCD):云原生技术有利于各组长在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用
技术代表:容器、服务网络、微服务、不可变基础设施、声明式API
CNCF基金会
22家白金、19家黄金、505家白银会员
中国是全球第3大云原生生态国家
软件架构演进
单体式架构:包含多功能,大而全超级工程
SOA架构:功能抽取,以服务为中心管理项目,各系统间进行调用,ESB管理项目
微服务架构:核心思路是拆分,把项目拆分成一个个小项目,服务自治,组件化
应用落地部署面临的挑战
快速开发的诉求
云间迁移
环境一致性
Docker与容器
操作系统与容器
传统操作系统
进程可见、可相互通信
共享同一份文件系统
容器
资源视图隔离namespace
资源使用配额cgroups
独立文件系统chroot
容器是什么
本质上是一个视图隔离、资源限制、独立文件系统的进程集合
Docker
一家公司
实现容器技术的一种
容器核心技术
进程隔离技术:namespace
对容器进行网络、通信、文件、权限等对象的隔离
进程资源配额技术:cgroups
为容器设置系统资源配额(CPU、内存、IO等)
Docker构造:client-server
execdriver:存储容器定义配置信息
networkdriver:完成docker容器网络环境的配置
graphdriver:负责对容器镜像的管理
容器VS虚拟机
容器常用术语
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”: [ ], #私库加速器
容器自定义镜像
容器镜像概述
使用流程
- 首先开发者在开发环境机器上开发应用并执行命令。Docker执行命令,构建镜像并存储在机器上
- 开发者发送上传镜像命令,Docker收到命令后将本地镜像上传到镜像仓库
- 开发者向生产环境机器发送运行镜像命令,生产环境机器收到命令后,Docker会从镜像仓库拉取镜像到机器上,然后基于镜像运行容器
镜像分层复用特征
好处:
- 提高分发效率:对大镜像而言可以拆分后并行下载
- 镜像数据分层共享:当本地存储包含一些数据时,只需下载增量数据即可
- 节约存储空间:让镜像本地保存更省空间
镜像分层结构
只有容器层是可写的,容器层下面所有镜像层都是只读的
叠加文件系统:从上往下依次在各镜像层中查找文件
Copy-on-Write:只有当需要修改时才复制一份数据
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镜像构建私有仓库
-
下载registry镜像
docker pull registry
-
启动镜像注册容器服务
docker run -d -p 5000:5000 --restart=always --name registry registry
-
对下载好的镜像打标签
docker tags <oldname:oldtag> <newname:newtag>
-
上传镜像
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内部及容器间管理数据的方式:数据卷、数据卷容器
数据卷
一个可供一个或多个容器使用的特殊目录,可以提供很多有用的特性
- 实现容器数据的持久化存储
- 对数据卷的修改会立马生效
- 对数据卷的更新不会影响镜像
- 卷会一直存在,直到没有容器使用(类似于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)
数据卷的挂载是通过把本地的目录覆盖到容器中的。
当宿主机文件不存在时,不能挂载;当文件夹不存在时,挂载到容器会用一个空文件夹覆盖容器原有目录。