1、Docker概述
容器:一种依赖于linu内核特性Namespace和Croups的虚拟化技术
-
是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源
-
是在Linux容器里运行应用的开源工具
-
是一种轻量级的"虚拟机'
-
Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。
Docker与虚拟机的区别
特性 | Docker容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算能力损害 | 几乎无 | 损耗50% |
性能 | 接近原生 | 弱于 |
系统支持量(单机) | 上千个 | 几十个 |
隔离性 | 资源隔离/限制 | 完全隔离 |
技术支持
namespace实现资源隔离
cgroups实现资源限制
(写时复制技术)copy-on-write实现高效的文件操作
核心概念
-
镜像:创建容器的基础,类似于虚拟机快照,面向Docker容器引擎的只读模板
-
容器:用镜像创建的运行实列
-
仓库:用来保存镜像的地方
Docker的镜像、容器、日志等内容全部默认存储在/var/lib/docker
2、安装Docker
注:目前Docker只能支持64位系统。
1、关闭防火墙
systemctl stop firewalld.service
setenforce 0
2、将repo.bak里面以CtenOS的都移到上层目录
[root@localhost yum.repos.d]# ls
abc.repo bak docker-ce.repo
[root@localhost yum.repos.d]# mv bak/* ./
[root@localhost yum.repos.d]# ls
--------------------------------------------
备注:这一步不能少,不然后续第五步有问题
3、安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
-------------------------------------
yum-utils:提供了yum-config-manager工具。
devicemapper:是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
device mapper:存储驱动程序需要device-mapper-persistent-data和lvm2。
4、设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5、安装Docker-CE并设置为开机自动启动
yum install -y docker-ce docker-ce-cli containerd.io
-----------------------------------
报错解决:
这个报错是container-selinux版本低或者是没安装的原因
yum 安装container-selinux 一般的yum源又找不到这个包
需要安装epel源 才能yum安装container-selinux
然后在安装docker-ce就可以了。
########################
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install epel-release
yum makecache
yum install container-selinux
####################
systemctl start docker.service
systemctl enable docker.service
--------------------------------------------------
安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,负责管理所有容器。
Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。
3、Docker镜像创建与操作
3.1、操作
1、查看版本信息
docker version
2、查看docker信息
docker info
3.2、镜像管理命令
3.2.1、搜索镜像
1、搜索镜像
--------------------------------
格式:docker search <仓库/镜像名>
例:docker search nginx
3.2.2、下载镜像
2、下载镜像
--------------------------------
格式:docker pull <仓库名称/镜像名>
#如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为latest标签
例:docker pull mysql
例:docker pull soscscs/myapp:v1
3.2.3、镜像加速下载
3、镜像加速下载(去阿里巴巴查看)
当您下载安装的Docker Version不低于1.10时,建议通过daemon config进行配置。
修改配置文件/etc/docker/daemon.json(没有时新建该文件)。
-------------------
{
"registry-mirrors": ["镜像加速器地址"] #地址:https://sbqw40em.mirror.aliyuncs.com
}
---------------------
systemctl daemon-reload ###然后重启Docker Daemon。
systemctl restart docker
3.2.4、查看本地镜像
5、查看下载的本地镜像
例:docker images
---------------------------------------
[root@localhost yum.repos.d]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0e901e68141f 3 weeks ago 142MB
3.2.5、查看镜像信息
4、查看镜像信息
--------------------------------------
镜像下载后存放在/var/lib/docker/image/overlay2下的repositories.json文件
docker inspect <ID> ##获取容器/镜像的元数据。
3.2.6、更改镜像标签
6、更改镜像文件标签
docker tag 镜像名:旧标签 镜像名:新标签(仓库/镜像名:新标签)
--------------------------------------------
例:docker tag nginx:latest nginx:ky18
3.2.7、删除镜像
7、删除镜像
docker rmi 仓库名/镜像:标签
docker rmi ID -f (-f:强制删除) ######一个镜像有多个标签需要强制删除
---------------------------------
例:docker rmi mysql:latest
3.2.8、打包镜像
8、打包镜像到当前目录
docker save -o 镜像文件.tar 镜像名称:标签
--------------------------------
例:docker save -o nginx.tar nginx
3.2.9、解压加入镜像文件
9、解压加入镜像文件
[root@localhost kervin24]# docker load -i nginx.tar ## -i指定压缩包
[root@localhost kervin24]# docker load < nginx.tar ## <重定向也可以
3.2.10、登录docker仓库
官方仓库https://hub.docker.com/
--------------------------------------------
10、登录仓库
[root@localhost ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: kervin24
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
3.2.11、上传镜像
11、上传镜像到仓库
docker push 仓库名/镜像名:标签
---------------------------------------
例:docker push kervin24/mysql:ky18
3.3、容器管理命令
3.3.1、创建容器
格式:docker create [选项] 镜像
常用选项:
-i:让容器开启标准输入
-t:让Dokcer分配一个伪终端tty
-it:合起来实现和容器交互的作用,运行一个交互式会话shell
----------------------------------------------------------
docker create -it [--name=容器名称] 镜像名 <命令>
例:docker create -it kervin24/centos:ky18 /bin/bash
-----------------------------------------------------------
遇到警告:WARNING: IPv4 forwarding is disabled. Networking will not work.
解决方案:
662385f7b48c4a0aac74838378e9836a1d0ccb2d95211af22c757178c5cfb5cc
[root@localhost ~]# vim /etc/sysctl.conf
[root@localhost ~]# echo 'net.ipv4.ip_forward=1' > /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@localhost ~]# systemctl restart docker
[root@localhost ~]#
3.3.2、查看容器状态
docker ps -a
----------------------
-q:只查看ID号
-a:所有
3.3.3、启动容器
docker start <容器ID/名称>
没有指定名称(会随机分配)
3.3.4、停止容器
docker stop <容器ID/名称>
docker kill <容器ID/名称>
3.3.5、删除容器
docker rm [-f强制删除] <容器ID/名称>
3.3.6、创建并启动容器
docker run等于docker create + docker start
------------------------------------------
注意:容器是与其中运行的shell命令共存亡的终端,命令运行容器运行, 命令结束容器退出。
docker容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果docker容器中pid=1的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。
当利用docker run来创建容器时,
Docker在后台的标准运行过程是:
(1)检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载
(2)利用镜像创建并启动一个容器;
(3)分配一个文件系统给容器,在只读的镜像层外面扭载层呵读写层;
(4)从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中
(5)分配一个地址池中的IP地址给容器
(6)执行用户指定的应用程序,执行完毕后容器被终止运行。
docker run [--name] -itd 名称 bin|bash
-------------------------------------------------------
例:docker run -itd [--name] c4 kervin24:mysql bash -c ls
-d:后台启动
-c:不进入执行
3.3.7、进入容器
需要进入容器进行命令操作时,使用docker exec命令进入运行着的容器
---------------------------------------
格式:docker exec -it 容器ID/名称 /bin/bash
-it:合起来实现和容器交互的作用,运行一个交互式会话shell
例:docker exec -it zealous_tharp /bin/bash
3.3.8、查看容器日志
docker logs 容器ID/名称 ###查看容器pid=1的进程日志
----------------------------------
3.3.9、容器复制文件到主机
docker cp 容器ID/名称:路径
---------------------------
例:docker cp 8453e1cc0109:/opt/abc.txt ~/xikai.txt
3.3.10、容器的导入导出
导入:docker export 容器ID/名称 > 导出文件
导入:cat 导入文件 |docker import - 镜像名:标签
--------------------------------------------------
例:
docker export 8453e1cc0109 > xikai.tar
scp xikai.tar 192.168.80.200:/opt
cat xikai.tar | docker import - xikai:ky18
4、Docker网络
4.1、Docker网络实现原理
#Docker网络实现原理
---------------------------
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0)
Docker启动一个容器时会根据网桥的网段分配给容器一个IP地址,称为Container-IP,
Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
4.1.1、端口映射
docker run -P ###映射容器端口到宿主主机(端口映射) [宿主机IP]:[容器端口]访问容器
docker run -p
---------------------------
Docker网桥是宿主机虛拟出来的,并不是真实存在的网络设备,
外部网络是无法寻址到的,外部网络无法直接通过Container-IP参数来启动访问到容器。
4.1.2、查看端口网络模式
Host:使用宿主机的IP和的端口
Container:和一个指定容器共享IP、端口范围
None:关闭了容器的网络功能
Bridge:默认模式,为每一个容器分配、设置IP等,容器连接到一个docker0网桥,利用网桥及iptables nat表配置与宿主机通信
----------------------------------
查看端口网络模式
docker network ls
docker network list
4.1.3、指定端口模式
docker run --net|--network
--net=host:指定host模式
--net=none:指定none模式
--net=container:指定container
--net=bridge:指定bridge模式。默认设置,可省略
4.2、Docker网络模式
4.2.1、Host模式
共享端口范围,相互之间不能重复
IP地址用的是宿主机的IP地址
4.2.2、Container模式
新创建的容器和已经存在的容器共享网络,但是不能共享端口
容器IP和宿主机的IP地址不一致
4.2.3、None模式
Docker容器没有网卡、IP、路由等信息,容器只有lo回路,没有其他网卡,没有办法联网
4.2.4、Bridge模式
docker模型是docker默认网络模式,不用--net参数
相当于Vmware中的nat模式,容器使用独立network Namespace,连接到docker0虚拟网卡
4.2.5、自定义网络
直接使用bridge模式,是无法支持指定IP运行docker
1、创建自定义网络
##先自定义网络,再使用指定IP运行docker
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
docker run -id --name c6 --network mynetword --ip 172.18.0.10 centos:latest bash
5、资源控制
5.1、对cpu限制
cpu资源控制
cgroups,是一个非常强大的1inux内核工具,
可以限制被namespace隔离起来的资源,为资源设置权重、计算使用量、操控进程启停等,实现了对资源的配额和度量。
cgroups有四大功能
-
资源限制:可以对任务使用的资源总额进行限制
-
优先级分配:通过分配的cpu时间片数量以及磁盘I0带宽大小,实际上相当于控制了任务运行优先级
-
资源统计:可以统计系统的资源使用量,如cpu时长, 内存用量等
-
任务控制: cgroup可以对任务执行挂起、恢复等操作
5.1.1、设置cpu使用率上限
CFS(Completely Fair Scheduler,完全公平调度器)调度各个进程对CPU的使用。默认的调度周期是100ms
-----------------------------------------------------------------------
CFS周期有效范围:1ms~1s
--cpu-period:设置调度周期,数值范围是1000~1000000。
--cpu-quota:设置在每个周期内容器能使用的CPU时间。有效值>=1000。
默认路径:/sys/fs/cgroup/cpu/
5.1.2、设置cpu资源占用比(设置多个容器才有效)
--cpu-shares:指定cpu份额,默认值为1024,值为1024的倍数
---------------------------------------------------
#创建两个容器为c1和c2,若只有这两个容器,设置容器的权重,使得c1和c2的CPU资源占比为1/3和2/3。
docker run -itd --name c1 --cpu-shares 618 centos:7
docker run -itd --name c2 --cpu-shares 1024 centos:7
5.1.3、设置容器绑定指定的cpu
docker run -itd --name test --cpuset-cpus 1,3 centos:latest /bin/bash
####绑核(第一个cpu从0开启)
5.2、对内存限制
-m(--memory=) 物理内存 --memory-swap=总值 总值=物理内存+可用swap
######--memory-swap必须要和--memory一起使用
--memory-swap=0或者不设置, 容器可使用的swap大小为-m值的两倍
--memory-swap的值与-m值相同,容器不能使用swap
--memory-swap的值为-1,表示容器程序使用的内存受限,可使用的swap不受限制
-------------------------------
例:docker run -itd --name c4 -m 512m centos:latest bash
docker stats 查看内存
5.3、对磁盘IO配置控制(blkio)的限制
--device-read-bps:限制某个设置上的读速度
--device-write-bps:限制某个设置上的写速度
--device-read-iops:限制读某个设备的iops(次数)
--device-write-iops:限制读某个设备的iops(次数)
例:docker run -itd --name c6 --device-write-bps /dev/sda:1mb centos:latest bash
测试:dd if=/dev/zero of=/opt/test.out bs=10M count=5 oflag=direct
5.4、清理docker占用的磁盘空间
docker system prune -a ##可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络