Docker
2022-05-20 20:08:05 69 举报
AI智能生成
Docker
作者其他创作
大纲/内容
*传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;*容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。* 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
Docker 和传统虚拟化方式的不同
子主题
特点
Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,众多模块各司其职。
运行流程
架构图
架构
是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。 只有通过这个镜像文件才能生成Docker容器实例
镜像 image
Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境.可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台
容器 container
公开仓库
私有仓库
集中存放镜像文件的场所。
仓库 repository
三要素
启动和帮助命令
镜像命令
前台启动 docker run -it imageName:tag /bin/bash
后台守护线程启动 docker run -d imageName:tag
run
基本
重点
容器命令
常用命令
共享容器和主机文件
功能
1:数据卷可在容器之间共享或重用数据2:卷中的更改可以直接实时生效3:数据卷中的更改不会包含在镜像的更新中4:数据卷的生命周期一直持续到没有容器使用它为止
docker <options> -d -v /<挂在内容>:/<容器内路径>:<容器读写权限> imageName
文件路径
文件挂载
文件夹路径
文件夹挂载
卷名
卷挂载
挂载类型
read write
rw
read only
ro
容器读写权限
--privileged=true
权限赋值
--volumes-from <被复制策略容器名>
复制卷挂载策略
其它参数
操作
数据挂载
概述
基本命令
命令
docker network create --driver <DriverType> <DriverName>
默认创建的驱动类型是 bridge
创建网络
--network <NetName>
--network container:<containerName>
对于 container
(容器)指定网络
使用
默认
Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
两两对应原则
bridge
直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行网络地址转换
host
none
container
自定义网络
网络类型
网络模式
镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
原理
docker commit -m=\"提交的描述信息\" -a=\"作者\" <containerId> <imgName>:<tag>
依靠容器
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
是什么
编写Dockerfile文件
docker build -f <目标Dockerfile文件名> -t <imgName:tag> .
注意: 末尾有 空格 + \".\"
创建镜像
生成容器
构建镜像步骤
常用保留字
demo
删除虚悬镜像
docker image prune
创建img过程中可能出现各种问题导致出现虚悬镜像
问题
Dockerfile
构建镜像
镜像容器服务 >> 新建 命名空间 >> 新建 >> 镜像仓库
根据镜像仓库指示操作
阿里云(个人版)
公有仓库
docker pull registry
创建仓库(容器形式)
docker run -d -p 5000:5000 --restart=always --name registry -v /ryze/registry/5000:/var/lib/registry registry
运行仓库
vi /etc/docker/daemon.json
添加内容: \"insecure-registries\": [\"124.221.116.110:5000\"]
放开http连接(仓库和客户端)
curl -XGET http://<registryHost:registryPort>/v2/_catalog
查看私服中镜像
docker tag <srcImg> <Host:Port>/<newImgName:newTag>
复制目标镜像成私服规范
docker push <Host:Port>/<newImgName:newTag>
推送
推送到私服
docker pull <Host:Port>/<name:tag>
拉去
私有库
镜像发布
镜像构建与发布
Docker-Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
rm /usr/local/bin/docker-compose
安装 / 修改权限 / 版本查看 / 卸载
核心概念
准备好docker镜像(基础镜像 / 本地dockerfile构建)
编写docker-compose.yml
检测配置 docker-compose config
后台启动 dockr-compose up -d
关停 docker-compose stop
编排步骤
其中配置文件依赖的同Docker下的服务可用服务名替代
# 基于基础镜像java:8FROM java:8# 作者MAINTAINER raozheng# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmpVOLUME /tmp# 将jar包添加到容器中并更名为zzyy_docker.jarADD Demo-Docker.jar Demo-Docker.jar# 运行jar包RUN bash -c 'touch /Demo-Docker.jar'ENTRYPOINT [\"java\
docker build -t raozheng:2.0 .
构建一个集成 mysql/redis 的服务镜像
version: \"3\"services: microService: image: raozheng:2.0 container_name: democompose ports: - \"8888:8888\" volumes: - /ryze/demodockercompose/microService:/data networks: - compose_net depends_on: - redis - mysql redis: image: redis:6.0.8 container_name: redis ports: - \"6380:6379\" volumes: - /ryze/demodockercompose/redis/redis.conf:/etc/redis/redis.conf - /ryze/demodockercompose/redis/data:/data networks: - compose_net command: redis-server /etc/redis/redis.conf mysql: image: mysql:5.7 container_name: mysql environment: MYSQL_ROOT_PASSWORD: '0000' MYSQL_ALLOW_EMPTY_PASSWORD: 'no' MYSQL_DATABASE: 'test' ports: - \"3307:3306\" volumes: - /ryze/demodockercompose/mysql/db:/var/lib/mysql - /ryze/demodockercompose/mysql/conf/my.cnf:/etc/my.cnf - /ryze/demodockercompose/mysql/init:/docker-entrypoint-initdb.d networks: - compose_net command: --default-authentication-plugin=mysql_native_password #解决外部无法访问networks: compose_net: driver: bridge
docker-compose up -d
启动
注意
docker-compose 容器编排
访问隔离: namespace
资源限制: CGroups
使用Linux的特性进行\"虚拟机的效果\"
由于一个容器的本质就是一个进程,用户的应用进程实际上就是容器里 PID=1 的进程,也是其他后续创建的所有进程的父进程。这就意味着,在一个容器中,你没办法同时运行两个不同的应用,除非你能事先找到一个公共的 PID=1 的程序来充当两个不同应用的父进程,
Docker的虚拟化原理
Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。
docker run -d -p 7000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
Portainer
Cadvisor 监控收集
InfluxDB 数据存储
图形化丰富的数据分析可视化
Granfana 图表展示
version: '3.1' volumes: grafana_data: {} services: influxdb: image: tutum/influxdb:0.9 restart: always environment: - PRE_CREATE_DB=cadvisor ports: - \"8083:8083\" - \"8086:8086\" volumes: - ./data/influxdb:/data cadvisor: image: google/cadvisor links: - influxdb:influxsrv command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086 restart: always ports: - \"8080:8080\" volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro grafana: user: \"104\" image: grafana/grafana user: \"104\" restart: always links: - influxdb:influxsrv ports: - \"3000:3000\" volumes: - grafana_data:/var/lib/grafana environment: - HTTP_USER=admin - HTTP_PASS=admin - INFLUXDB_HOST=influxsrv - INFLUXDB_PORT=8086 - INFLUXDB_NAME=cadvisor - INFLUXDB_USER=root - INFLUXDB_PASS=root
测试
安装
配置 数据源
坐标数据均可自定义源
效果
配置 面板
3000 端口(Granfana)
设置
重量级监控CAdvisor + InfluxDB + Granfana
容器可视化监控
Docker
0 条评论
回复 删除
下一页