Docker学习笔记

Docker

概念

a

容器是什么

Linux Container(LXC) 是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源

Docker是PAAS(平台服务,Platform-as-a-service)提供商dotCloud开源的一个基于LXC(Linux Container)的高级容器引擎,源代码托管在Github上,基于go语言并遵从Apache2.0协议开源

Docker设想是交付运行环境如同海运,OS如同一个货轮。每一个在OS基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同事集装箱的内容可以由用户自定义,也可以由专业人员制造。(集装箱:容器隔离, 集装箱内容可以用过自动化手段进行自由组装,集装箱内容就是容器的内容,如Appliaction)

容器虚拟化VS传统虚拟化

a

  • VM:完全虚拟化 寄居架构 不同应用程序内核隔离 安全性高

  • Container: 简化Guest OS 节省空间 安全性差(应用程序共享同一个内核Docker Engine)

镜像仓库

Docker自身组件

  • Docker Client

  • Docker Server 接受用户通过客户端发送的请求,按照相应的路由规则实现路由分发

  • Docker 镜像 运行之后变成容器(docker run)/封装好的运行环境/

空白层:应用优先级大于底层 为应用特殊配置作处理

Docker 分层管理资源

Docker安装配置体验

Docker安装

  1. yum

    yum update

    yum install -y yum-utils device-mapper-persistent-data lvm2

    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

    yum list docker-ce --showduplicates | sort -r

    yum install docker-ce-17.12.1.ce

  2. rpm

    https://download.docker.com/linux/centos/7/x86_64/stable/Packages

  3. script 通过官方的安装脚本,安装

    yum update

    curl -ssl https://get.docker.com/ | sh

    systemctl start docker

    systermctl enable docker

    docker run hello-world 官方运行环境

检查命令

systemctl stop firewalld // 确定技术环境

systemctl disable firewalld // 确定防火墙状态

getenforce // 确定SELinux(Security-Enhanced Linux)状态

systemctl start iptables // 确定iptables状态-未启动 yum -y install iptables-services

systemctl enable iptables

iptables -F //  清空默认规则

service iptables save // 保存默认规则

启动

systemctl start dockersystemctl enable docker

测试

docker version // 查看版本信息

docker run hello-world

更多命令

docker ps //查看当前正在运行的容器

docker ps -a //查看所有容器的状态

docker start/stop id/name //启动/停止某个容器

docker attach id //进入某个容器(使用exit退出后容器也跟着停止运行)

docker exec -ti id //启动一个伪终端以交互式的方式进入某个容器(使用exit退出后容器不停止运行

docker images //查看本地镜像

docker rm id/name //删除某个容器

docker rmi id/name //删除某个镜像

docker run --name test -ti ubuntu /bin/bash  //复制ubuntu容器并且重命名为test且运行,然后以伪终端交互式方式进入容器,运行bash

docker build -t soar/centos:7.1 .  //通过当前目录下的Dockerfile创建一个名为soar/centos:7.1的镜像

docker run -d -p 2222:22 --name test soar/centos:7.1  //以镜像soar/centos:7.1创建名为test的容器,并以后台模式运行,并做端口映射到宿主机2222端口,P参数重启容器宿主机端口会发生改变

镜像加速

阿里云Docker官网 https://dev.aliyun.com/search.html

sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{    "registry-mirrors": [        "https://1nj0zren.mirror.aliyuncs.com",        "https://docker.mirrors.ustc.edu.cn",        "http://f1361db2.m.daocloud.io",        "https://registry.docker-cn.com"    ]}EOFsudo systemctl daemon-reloadsudo systemctl restart dockerdocker infodocker rmi node:latesttime docker pull node:latest

(mirror需要阿里云申请 申请地址)

docker info 查看详情

使用镜像前后,可使用 time 统计所花费的总时间。测速前先移除本地的镜像!

Docker 应用体验

WordPress安装(blog 系统)

docker pull wordpressdocker pull mariadbdocker run --name db --env MYSQL_ROOT_PASSWORD=example -d mariadbdocker run --name MyWordPress --link db:mysql -p 18888:80 -d wordpress

Docker Compose

Docker 提倡理念是“一个容器一个进程”,假设一个服务需要多个进程组成,急需要多个容器组成一个系统,相互分工和配合对外提供完整服务

比如:blog system

组件1:mariadb

组件2:WordPress的apache web

在启动容器时,同一台主机下如果两个容器之间需要由数据交流,使用--link选项建立两个容器之间的关联,前提是建立mariadb已经开启

docker start db

docker start MywordPress

停止:

docker stop db MywordPress

Docker Compose(容器编排工具),允许用户在一个模块(YAML格式)中定义一组相关联的容器,会根据--link等参数,对启动的优先级进行排序。

curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-composeddocker versiondocker-compose version-f 指定yaml文件位置ps 现实所有容器信息restart 重新启动容器logs 查看日志信息config -q 验证yaml配置文件是否正确stop 停止容器start 启动容器up -d 启动容器项目(区别与start 会创建容器, start仅是启动容器)pause 暂停容器unpause 恢复暂停rm 删除容器

容器管理

Docker基础概念和命令

Docker三个概念:仓库(repository),镜像(image),容器(container)

docker run --name MyWordPress -link db:mysql -p 8080 -d wordpress

Docker指令的基本用法:

docker+命令关键字(Command)+一系列参数

docker info // 守护进程的系统资源设置docker search // Docker 仓库的查询docker pull // Docker 仓库的下载docker iamges // Docker 镜像的查询docker rmi // Docker 镜像的删除,已经运行的容器祖耀删除容器docker ps // 容器的查询docker run // 容器的创建启动docker start/stop // 容器启动停止docker rm // 只能删除停止容器# Docker 指令除了单条使用外,还支持复制、解析变量、嵌套使用

镜像的总体使用资源数不能通过简单的Size相加,因为镜像资源分层,镜像可以共用底层的部分资源

容器创建后的操作

docker ps --no-true // 查看docker stop/start CONTAINERID // 停止docker start/stop Name // 通过容器别名启动/停止docker inspect Name // 查看容器所有基本信息docker logs Name // 查看容器日志docker stats Name // 查看容器所占用的系统资源docker exec Name // 容器内执行命令 // 容器内执行命令docker exec -it 容器名 /bin/bash // 登入容器的bash,进行交互式管理-------run的延伸---------restart=always // 容器的自动启动-h x.xx.xx // 设置容器主机名--dns xx.xx.xx.xx //设置容器使用的DNS服务器--dns-search // DNS搜索设置--add-host hostname:IP // 注入hostname<>IP解析--rm // 服务停止时自动删除

镜像、仓库管理

Dokcer镜像特点

容器创建时需要指定镜像,每个镜像都由唯一的标示ImageId,和容器的Container ID一样,默认128位,可以使用前16位缩略形式,也可以使用镜像名和版本号两部分组合唯一标示,如果省略版本号,默认使用最新版本标签(latesr)

镜像分层:Docker的镜像通过联合文件系统(union filesystem)将各层文件系统叠加在一起

  • bootfs:用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被写在以节省内存资源

  • roofs:位于boofs之上,表现为Docker容器的根系统

    • 传统模式中,系统启东时,内核挂在rootfs时会首先将其挂载为“只读”模式,完整性自检完成后将其挂载为读写模式

    • Docker中,rootfs由内核挂载为“只读”模式,而后通过UPS技术挂载一个“可写”层。

  • 已有的分层只能读不能改

  • 上层镜像优先级大于底层镜像

DockerFile

创建镜像

  1. Container >Image: docker commit CID -t xx.xx.xx

    工作在前台的守护进程,至少一个。

  2. DockerFile

    DockerFile是一种被Docker程序解释的脚本,DockerFile由一条条的指令组成,每条指令对应LInux下面的一条命令。Docker程序将这些DockerFile指令翻译真正的Linux命令。DockerFile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于MakeFile。Docker程序将读取DockerFile,根据指令生成指定的Image

    生成命令:docker build -t guyu/jdk-tomcat

Demo commit 创建Mysql镜像

docker pull hub.c.163.com/public/centos:6.7-toolsdocker run --name mysql -d hub.c.163.com/public/centos:6.7-toolsdocker exec -it mysql /bin/bashyum install mysql service mysqld startmysqladmin -uroot password 123docker commit mysql mysql:5.1

[Docker File 教程](https://www.runoob.com/docker/docker-dockerfile.html

Docker 仓库构建(实践一下即可)

官方仓库构建

Harbor 构建

Docker网络通讯

网络通讯

a

容器与容器之间 memspace, docker0网桥进行通讯

容器访问外部网络 snat

iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -o docker0 -j MASQUERADE

外部网络访问容器 dnat

docker run -d -p 80:80 apacheiptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKERiptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80

namespace

a

Docker 网络模式修改

默认网桥 docker 0 add 172.0.0.1

Docker 进程网络修改

-b --bridge="" 指定Docker使用的网桥设备,默认情况下Docker会自动创建和使用docker0网桥设备,通过此参数可以使用已经存在的设备。

--bip 指定Docker0的IP和掩码,使用标准的CIDR形式,如10.10.10.10/24

--dns配置容器的DNS,在启动Docker进程是添加,所有容器全部失效

Docker 容器网络修改

--dns用于指定启动的容器的DNS

--net用于指定容器的网络通讯方式,有以下四个值

  • bridge: Docker默认方式,网桥模式

  • none:容器没有网络栈

  • container:使用其他容器的网络栈,Docker容器会加入其他的容器的netword namespace

  • host:标示容器使用HOst的网络,没有自己独立的网络栈,容器可以完全访问host 的网络,不安全

-p/P选项的使用格式

  • -p :将指定的容器端口映射到主机所有地址的一个动态端口

  • -p :映射到指定的主机端口

  • -p ::映射到指定的主机的IP的动态端口

  • -p ::,映射到指定的主机IP的主机端口

  • -P(大):暴露所需要的所有端口

docker port ContainerName 可以查看容器当前的映射关系

常见隔离方式

docker network ls 查看当前可用网络类型

docker network create -d 类型 网络空间名称

类型分为:

  • overlay network 覆盖性网络,不同主机的通讯

  • bridge network 网桥

docker运行时指定网络空间 --network=XXXX,

创建网桥

数据存储

数据卷特性

  • Docker镜像由多个只读层叠加而成,容器启动时,Docker会家在只读镜像层并在镜像栈顶部添加一个读写层

  • 如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,次即“写时复制”机制。

a

  • 关闭并重启容器,其数据不受影响;但删除Docker容器,则其改变将会全部丢失

  • 存在问题

    • 存在与联合文件系统中,不易于宿主机访问

    • 容器间数据共享不便

    • 删除容器其数据会丢失但

  • 解决方案:“卷”

    • “卷“是容器上的一个或多个“目录”,此类目录可绕过联合文件系统,与宿主机上的某目录“绑定”。

a

  • Volume 可以在运行容器时即完成创建与绑定操作。当然,前提需要拥有对应的声明

  • Volume 的初中就是数据持久化

a

Volume

  • BInd mount volume 绑定卷,人为操作,可为操作系统中的任意目录

  • Docker-managed volueme 人为设置,引导后,转化为Docker自主管理,存储目录一般为var/lib/docker的目录

a

容器中的数据卷(使用)

Docker-managed Volumedocker run -it --name roc -v MOUNTDIR roc/lamp:v1.0docker inspect -f {{.Mounts}} rocBind-mount Volume docker run -it --name roc -v HOSTDIR:VOLUMEDIR roc/lamp:v1.0Union Volume docker run -it --name roc --volumes-from ContainerName roc/lamp:v1.0

学习定义自管理卷

存储驱动

存储驱动(storage driver)是Docker的核心组件,它是Docker实现分成镜像的基础

device mapper(DM):性能和稳定性存在问题,不推荐生产环境使用

btrfs:社区实现了btrfs driver,稳定性和性能存在问题

overlayfs:内核3.18 overlayfs进入主线,性能和稳定性优异,第一选择

overlayer 工作原理

a

内存资源限制

  • CGroup是Control Groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如 cpu memory i/o等等)的机制。2007年进入Linux2.6.24内核,CGroups不是全新创造的,它将进程管理从cpuset中剥离出不来,作者是Google的paulMenage

  • 默认情况下,如果不对容器做任何限制,容器能够詹同当前系统能给容器提供的所有资源

  • Docker限制可以从Memory、CPU、Block I/O三个方面

  • OOME:Out Of Memory Exception

    • 一旦发生OOME,任何进程都有可能被杀死,包括docker daemon在内

    • 为此,Docker调整了docker daemon的OOM优先级,以避免被内核关闭。

为应用做内存压力测试,理解正常业务需求下使用内存情况,然后才能进入生产环境中使用。

  • 一定要限制容器的内存使用上线

  • 尽量保证主机的资源充足,一旦通过监控发现资源不足,就进行扩容或者对容器进行迁移。

  • 如果可以(内存资源充足的情况),尽量不要使用swap,swap的使用会导致内存计算复杂,对调度器非常不友好。

在Docker启动参数中,和内存限制有关的包括(参数的值一般是内存大小,也就是一个正数,后面跟着内存单位b、k、m、g,分别对应bytes、KB、MB和GB);

  • -m --memeory:容器能使用的最大内存大小,最小值为4m

  • --memory-swap:容器能够使用的swap大小

  • --memory-swappiness:默认情况喜爱,主机可以把容器使用的匿名页(anonymous page)swap出来,你可以设置一个0-100之间的值,代表允许swap出来的比例

  • --memory-reservation:设置一个内存使用的soft limit,设置值小于-m设置

  • --kernel-memory:容器能够使用的kernel memory大小,最小值为4m。

  • --oom-kill-disable:是否运行OOM的时候杀死容器。只有设置了-m,才可以把这个选项设置为false,否则容器会耗尽主机内存,而且导致主机应用被杀死。

a

不设置swap时,默认为ram的2倍。一般不启用swap空间

posted @ 2020-10-08 22:20  古宇29  阅读(111)  评论(0)    收藏  举报