Docker学习笔记
Docker
概念

容器是什么
Linux Container(LXC) 是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源
Docker是PAAS(平台服务,Platform-as-a-service)提供商dotCloud开源的一个基于LXC(Linux Container)的高级容器引擎,源代码托管在Github上,基于go语言并遵从Apache2.0协议开源
Docker设想是交付运行环境如同海运,OS如同一个货轮。每一个在OS基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同事集装箱的内容可以由用户自定义,也可以由专业人员制造。(集装箱:容器隔离, 集装箱内容可以用过自动化手段进行自由组装,集装箱内容就是容器的内容,如Appliaction)
容器虚拟化VS传统虚拟化

-
VM:完全虚拟化 寄居架构 不同应用程序内核隔离 安全性高
-
Container: 简化Guest OS 节省空间 安全性差(应用程序共享同一个内核Docker Engine)
镜像仓库
Docker自身组件
-
Docker Client
-
Docker Server 接受用户通过客户端发送的请求,按照相应的路由规则实现路由分发
-
Docker 镜像 运行之后变成容器(docker run)/封装好的运行环境/
空白层:应用优先级大于底层 为应用特殊配置作处理
Docker 分层管理资源
Docker安装配置体验
Docker安装
-
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
-
rpm
https://download.docker.com/linux/centos/7/x86_64/stable/Packages
-
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
创建镜像
-
Container >Image: docker commit CID -t xx.xx.xx
工作在前台的守护进程,至少一个。
-
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网络通讯
网络通讯

容器与容器之间 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

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会家在只读镜像层并在镜像栈顶部添加一个读写层
-
如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,次即“写时复制”机制。

-
关闭并重启容器,其数据不受影响;但删除Docker容器,则其改变将会全部丢失
-
存在问题
-
存在与联合文件系统中,不易于宿主机访问
-
容器间数据共享不便
-
删除容器其数据会丢失但
-
-
解决方案:“卷”
- “卷“是容器上的一个或多个“目录”,此类目录可绕过联合文件系统,与宿主机上的某目录“绑定”。

-
Volume 可以在运行容器时即完成创建与绑定操作。当然,前提需要拥有对应的声明
-
Volume 的初中就是数据持久化

Volume
-
BInd mount volume 绑定卷,人为操作,可为操作系统中的任意目录
-
Docker-managed volueme 人为设置,引导后,转化为Docker自主管理,存储目录一般为var/lib/docker的目录

容器中的数据卷(使用)
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 工作原理

内存资源限制
-
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,否则容器会耗尽主机内存,而且导致主机应用被杀死。

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

浙公网安备 33010602011771号