首页 > 其他 > 详细

Docker

时间:2020-04-17 12:49:27      阅读:56      评论:0      收藏:0      [点我收藏+]

Docker概述

Docker是什么?
  • 使用最广泛的开源容器引擎
  • 一种操作系统级的虚拟化技术
  • 依赖Linux内核特性:Namespae(资源隔离)和Cgroups(资源限制)
  • 一个简单的应用程序打包工具
Docker设计目标
  • 提供简单的应用程序打包工具
  • 开发人员和运维人员职责逻辑分离
  • 多环境保持一致性
Docker基本组成
  • Docker Clinet: 客户端
  • Docker Daemon: 守护进程
  • Docker Images: 镜像
  • Docker Container: 容器
  • Dokcer Registry: 镜像仓库
    技术分享图片
Docker 容器 与 VM虚拟机比较

技术分享图片
技术分享图片

隔离: 虚拟机隔离时系统级别隔离。虚拟各种资源。容器是进程级别隔离

磁盘:虚拟机占用磁盘较大,以GB计算。容器磁盘占用小以MB计算

速度:容器启动速度可以算是秒级启动。虚拟机启动时间较长。需要初始化系统初始化各种设备。比如:网卡等

性能:容器的运行性能接近原生。虚拟机大约由5%的损耗

数量:相同大小的硬件资源。容器可以运行成百上千个。虚拟机一般几十台不等

操作系统:容器只支持Linux,虚拟机几乎支持所有的操作系统

封装程度:容器只打包镜像和依赖关系,共享宿主机内核。虚拟机是独立的一套完整的操作系统

Dokcer应用场景
  • 应用程序打包和发布
  • 应用程序隔离
  • 持续集成
  • 部署微服务
  • 快速搭建测试环境
  • 提供PaaS产品(平台即服务)

Docker安装

Docker分为社区版(Community Edition,CE) 和企业版(Enterprise Edition,EE)

支持的平台为: Linux(CentOS,Debian,Fedora,Oracle Linux,RHEL,SUSE和Ubuntu)、Mac 、Windows

Centos7 安装Docker

官方文档:https://docs.docker.com
阿里云源:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker软件包源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker CE
yum install -y docker-ce
# 启动Docker服务并设置开机启动
systemctl start docker
systemctl enable docke

镜像管理

镜像是什么

  • 一个分层存储的文件
  • 一个软件环境
  • 一个镜像可以创建N个容器
  • 一种标准化的交付
  • 一个不包含Linux内核而又精简的Linux操作系统

镜像不是一个单一的文件,而且多层构成。可以通过docker history <ID/NAME> 查看镜像中各层内容及大小。每层对应着Dockerfile中的一个指令。Docker镜像默认存储在/var/lib/docker/<storage-driver>中

镜像从哪里来

Docker Hub由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。 地址: https://hub.docker.com/explore

镜像加速器:

https://www.daocloud.io/mirror

curl -sSl https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

镜像与容器联系


技术分享图片

容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时,会先从镜像里要写的文件复制到容器自己的文件系统中(读写层)。

如果容器删除了。最上面的读写层也就删除了。改动也就丢失了。所以无论多少个容器共享一个镜像。所做的写操作都是从镜像的文件系统中复制过来操作的。并不会修改镜像的源文件。这种方式提高了磁盘利用率

若想持久化这些改动。可以通过docker commit将容器保存成一个新的镜像。

  • 一个镜像创建多个容器
  • 镜像增量式存储
  • 创建的容器里面修改不会影响到镜像

管理镜像的常用命令


指令 描述
ls/images 列出镜像
build 构建镜像来自Dockerfile
history 查看镜像历史
inspect 显示一个或者多个镜像详细信息
pull 从镜像仓库拉取镜像
push 推送镜像到镜像仓库
rm 删除一个或多个镜像
prune 删除未使用的镜像,没有被标记或者被任何容器引用的镜像。
tag 创建一个引用源镜像标记目标镜像
export 导出容器文件系统到tar归档文件
import 导入容器文件系统tar归档文件创建镜像
save 保存一个或者多个镜像到一个tar归档文件
load 加载镜像来自tar归档或者标准输入

容器管理

创建容器的常用选项
选项 描述
-i,--interactive 交互式
-t, --tty 分配一个伪终端
-d, --detach 运行容器到后台
-e,--env 设置环境变量
-p, --publish list 发布容器端口到主机
-P,--publish-all 发布容器所有expose的端口到宿主机随机端口
--name string 指定容器名称
-h,--hostname 设置容器主机名
--ip string 指定容器IP,只能用于自定义网络
--network 链接容器到一个网络
--mount mount 将文件系统附件到容器
-v, --volume list 绑定挂载一个卷
--restart string 容器退出时重启策略,默认no ,可选值【always|on-failure】
容器资源限制
选项 描述
-m, --memory 容器可以使用的最大内存量
--memory-swap 允许交换到磁盘的内存量
--memory-swappiness=<0-100> 容器使用的SWAP分区交换的百分比(0-100,默认为-1)
--oom-kill-disble 禁用OOM killer
--cpus 可以使用的CPU数量
--cpuset-cpus 限制容器使用特定的CPU核心,如(0-3,0,1)
--cpu-shares CPU共享(相对权重)

OOM killer :Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉。内核检测到系统内存不足、挑选并杀掉某个进程的过程可以参考内核源代码linux/mm/oom_kill.c,当系统内存不足的时候,out_of_memory()被触发,然后调用select_bad_process()选择一个”bad”进程杀掉。如何判断和选择一个”bad进程呢?linux选择”bad”进程是通过调用oom_badness(),挑选的算法和想法都很简单很朴实:最bad的那个进程就是那个最占用内存的进程。

示例:

内存限额:
允许容器最多使用500M内存和100M Swap,并禁用OOM Killer
docker run -d --name nginx03 --memory="500m" --memory-swap="600m" --oom-kill-disable nginx

cpu限额:
允许容器最多使用一个半的CPU
docker run -d --name nginx04 --cpus="1.5" nginx
允许容器最多使用50%的CPU
docker run -d --name nginx05 --cpus=".5" nginx
管理容器常用命令
选项 描述
ls/ ps -a 列出容器
inspect 查看一个或者多个容器详细信息
exec 在容器中运行命令
commit 提交容器修改内容到镜像
cp 拷贝文件/文件夹到一个容器
logs 查看容器日志
port 列出或者指定容器端口映射
top 显示一个容器运行的进程
stats 查看容器资源使用统计
sto/start/restart 停止/启动/重启一个或多个容器
rm 删除一个或者多个容器

容器应用程序数据

挂载的三种方式

Docker提供三种挂载方式将数据从宿主机挂载到容器中:

  • volumes: Docker 管理宿主机文件系统的一部分(/var/lib/docker/volumes)保存数据的最佳方式
  • bind mounts: 将宿主机上的任意位置的文件或者目录挂载到容器中
  • tmpfs: 挂载存储在主机系统的内存中。而不会写入到主机的文件系统。如果不希望将数据持久存储在任何位置。可以使用tmpfs。同时避免写入容器可写层提高性能。

技术分享图片

Volume

官方说明:https://docs.docker.com/engine/admin/volumes/volumes/#start-a-container-with-a-volume

管理卷
#创建
docker volume create nginx-vol
#查看
docker volume ls
#查看卷内信息
docker volume inspect nginx-vol
#用卷创建一个容器
docker run -d --name =nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
或者
docker run -d --name=nginx-test -v nginx-vol:/usr/shar/nginx/html nginx

清理
停止容器
docker stop nginx-test
删除容器
docekr rm nginx-test
删除卷
docker volume rm nginx-vol

注意:
1、如果没有指定的卷,就会自动创建
2、建议使用--mount,因为更通用
Bind Mounts
用卷创建一个容器
docker run -d -it --name=nginx-test --mount type=bind, src=/app/wwwroot,dst=/usr/share/nginx/html nginx
或者
docker run -d -it --name=nginx-test -v /app/wwwroot:/usr/shar/nginx/html nginx

验证绑定:
docker  inspect  nginx-test
清理:
docker stop nginx-test
docker rm nginx-test

注意:
1、如果源文件/目录没有存在如果挂载目标在容器中为非空目录。则该目录现有内容会被隐藏
2、不会自动创建,会抛出一个异常错误信息

小结

Volume
  • 多个容器之间共享数据,多个容器可以同时挂载相同的卷
  • 当容器停止或者被移除时,该卷依然存在
  • 当明确删除卷时,卷才会被删除
  • 间接将容器的数据存储在远程主机或者启用存储上
  • 将数据从一台Docker主机迁移到另一台主机时,先停止容器,然后在备份卷的目录(/var/lib/docker/volumes)
Bind Mount
  • 从主机共享配置文件到容器,默认情况下,挂载主机/etc/resolv.conf 到每个容器。提供DNS解析
  • 在Docker主机上的开发环境和容器之间共享源代码。例如:可以将Maven target 目录挂载到容器中。每次在Docker主机上 构建Maven项目时,容器都可以访问构建的项目包
  • 当Docker主机的文件或者目录结构保证与容器所需的绑定挂载一致时

容器网络

网络模式

bridge: --net=bridge

默认网络。Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中

host: --net=host

容器不会获得一个独立的network namespace 而是与宿主机共用一个。这意味着容器不会由自己的网卡信息。而是使用宿主机的。容器除了网络。其他都是隔离的

none: --net=none

获取独立的network namespace 但不为容器进行任何网络配置。需要手动进行配置

container: --net=container:Name/ID

与指定的容器使用同一个network namespace ,具有同样的网络配置信息。两个容器除了网络,其他的还是隔离的

自定义网络

与默认的bridge原理以用,但是自定义网络具备内部DNS发现功能,可以通过容器名进行容器间的网络通信。

容器网络访问原理

技术分享图片

技术分享图片
技术分享图片

Dockerfile

Dockerfile格式
技术分享图片
Dockerfile指令
指令 描述
From 基于那个镜像进行构建
Maintainer Laber 镜像的维护者或者是邮件地址
Run 构建镜像时运行的Shell命令
Copy 拷贝文件或者目录到镜像中
Env 设置环境变量
User 为Run、Cmd和Entrypoint执行命令指定运行用户
Expose 声明容器运行的服务器端口
Healtheck 容器中服务健康检查
Workdir 为Run、Cmd、Entrypoint、Copy和Add设置工作目录
Entrypoint 运行容器时执行,如果有多个Entrypoint指令,只有最后一个生效
Cmd 运行容器时执行,如果有多个CMD指令,最后一个生效
Build镜像

Usage: docker build [OPTIONS] PATH | URL|- [flags]

Options:

? -t, --tag list 镜像名称

-f, --file string 指定Dockerfile文件位置

docker build -t shykes/myapp .

docker build -t shykes/myapp -f /path/Dockerfile  /path

docker build -t shykes/myapp http://www.example.com/Dockerfile

镜像仓库Harbor

Harbor概述

Harbor是由VMware公司开源的容器镜像仓库,Harbor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用。

新的企业级特性包括: 管理用户界面,基于角色的访问控制,AD/LADP集成以及审计日志等。

官方地址:https://vmware.github.io/harbor/cn/

组件 功能
harbor-adminserver 配置管理中心
harbor-db Mysql数据库
harbor-jobservice 负责镜像复制
harbor-log 记录操作日志
harbor-ui Web管理页面和API
nginx 前端代理,复制前端页面和镜像上传/下载转发
redis 会话
registry 镜像存储
Harbor部署

Harbor安装的三种方式

  • 在线安装: 从Docker Hub 下载Harbor相关镜像,因此安装软件包非常小
  • 离线安装: 安装包包含部署的相关镜像,因此安装包比较大
  • OVA安装程序: 当用户具有vCenter环境时。使用此安装程序。在部署OVA后启动Habor
tar zxvf harbor-offline-installer-v1.6.1.tgz
cd harbor
vi harbor.cfg
-------------------------
hostname=10.206.240.188
ui_url_protocol=http
harbor_admin_password=123456
-------------------------
./prepare
./install.sh

Harbor基本使用
1、配置http镜像仓库信任

vi /etc/docker/daemon.json

{"insecure-registries":["reg.ctnrs.com"]}

systemctl restart docker

2、打标签
docker tag centos:6 reg.ctnrs.com/library/centos:6
3、上传
docker push reg.ctnrs.com/library/centos:6
4、下载
docker pull reg.ctnrs.com/library/centos:6

Docker

原文:https://www.cnblogs.com/yangsj10086/p/12718771.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!