一、Docker 介绍与部署:
(1)Docker:
Docker 是一个开源的应用容器引擎:让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。是一个轻量级的“虚拟机”,容器是完全使用沙箱机制,相互之间不会有任何接口。
(2)Docker 与虚拟机的区别:
!!!相同点:
①可在不同的主机之间迁移;
②都具备 root 权限;
③都可以远程控制;
④都有备份、回滚操作。
!!!不同点:
1、操作系统上:
docker:在性能上有优势,可以轻易的运行多个操作系统;
虚拟机:可以安装任何系统,但是性能不及容器。
2、原理:
docker:和宿主机共享内核,所有容器运行在容器引擎之上,容器并非一个完整的操作系统,所有容器共享操作系统,在进程级进行隔离。
虚拟机:每一个虚拟机都建立在虚拟的硬件之上,提供指令级的虚拟,具备一个完整的操作系统。
3、优点:
docker:高效、集中。一个硬件节点可以运行数以百计的的容器,非常节省资源,QoS 会尽量满足,但不保证一定满足。内核由提供者升级,服务由服务提供者管理。
虚拟机:对操作系统具有绝对权限,对系统版本和系统升级具有完全的管理权限。具有一整套的的资源:CPU、RAM 和磁盘。QoS 是有保证的,每一个虚拟机就像一个真实的物理机一样,可以实现不同的操作系统运行在同一物理节点上。
4、缺点:
docker:对内核没有控制权限,只有容器的提供者具备升级权限。只有一个内核运行在物理节点上,几乎不能实现不同的操作系统混合。容器提供者一般仅提供少数的几个操作系统。
虚拟机:每一台虚拟机都具有更大的负载,耗费更多的资源,用户需要全权维护和管理。一台物理机上能够运行的虚拟机非常有限。
(3)Docker的使用场景:
1、打包应用程序简化部署;
2、可脱离底层硬件任意迁移;
例:服务器从腾讯云迁移到阿里云。
(4)Docker 核心概念:
- 镜像;
- 容器;
- 仓库;
Centos 安装Docker 的两种方式:
- 使用 curl 获得 Docker 的安装脚本进行安装;
- 使用 yum 仓库来安装 Docker(推荐使用!!!)。
(5)安装 Docker:
1、先安装依赖包:
yum install -y yum-utils device-mapper-persitent-data lvm2
2、设置阿里云镜像源:
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、安装Docker-CE:
yum install -y docker-ce
systemctl stop firewalld.service
setenforce 0
4、开启服务:
systemctl start docker
systemctl enable docker //设置开启自启动
二、Docker 镜像操作:
(1)镜像加速:此操作会让我们下载镜像时,速度会有明显的加快。
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://05vz3np5.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload //重载
systemctl restart docker //重启
(2)搜索镜像:docker search 关键词
docker search nginx //搜索nginx镜像
(3)获取/下载镜像:docker pull 仓库名称
docker pull nginx
(4)查看镜像:
- docker images 仓库名称;
- docker inspect 镜像ID号;
(5)添加新标签:
示例:将标签更新为 abner/nginx:web(用户名/仓库名:标签)
docker tag nginx:latest abner/nginx:web
(6)删除镜像:
示例:
docker rmi nginx:web
docker rmi 231d40e811cd
(7)存出镜像:这样其他服务器就可以直接拿来用了,无需额外再下载了
docker save -o 存出文件名 存出的镜像
示例:
docker save -o nginx nginx:latest //nginx为存出文件名
(8)载入镜像:
方式一: docker load --input 存出文件名
方式二: docker load < 存出文件名
docker load < nginx
(9)上传镜像:需要有公有仓库
docker login //登录
docker push 仓库名称:[:标签]
示例:
docker push nginx:web
三、Docker 容器操作:
镜像是不可以直接使用的,只有加载给容器,再启动容器,才可以使用镜像。
(1)创建容器:
docker create [选项]镜像运行的程序
-i :让容器的标准输入保持打开;
-t :让 Docker分配一个伪终端。
示例:docker create -it nginx:latest /bin/bash
(2)查看容器运行的状态:
docker ps -a
// -a :列出最近一次启动的容器
(3)启动容器:
docker start 容器的id
(4)创建容器并启动执行shell命令:
docker run [选项]镜像运行的程序 执行的命令
-d :在后台运行
示例:docker run nginx /usr/local/bash -c ls /
//含义:nginx是镜像名称;
/usr/local/bash是指定环境
-c ls /:指定命令查看/目录下的文件列表
docker run :是一个综合体的命令,先帮你下载镜像,再创建一个容器,再启动容器,并进入容器做相关操作后再退出。
如果想让容器一直在后台保持执行的状态,可以写一个循环语句:
docker run -d nginx /bin/bash -c "while true;do echo hello;done"
(5)终止容器:
docker stop 容器的id/名称
(6)进入容器:
docker exec [选项] 容器的id(或者名称) /bin/bash
示例:docker exec -it f5683d53d83 /bin/bash
(7)导出容器:
docker export 容器的id > 文件名
示例:docker export j684ds68w358 > nginx_c
(8)导入容器:会生成镜像,但是不会创建容器
cat 文件名| docker import -生成的镜像名称:标签
示例:
cat nginx_c | docker import - nginx:web
有了nginx:web 这个镜像,就可以利用这个镜像再创建容器,开启等相关操作了。
(9)删除容器:
1、删除单个容器:
docker rm [选项] 容器的id/名称
2、批量删除(不会删除正在运行的容器,只会删除不在用的容器):
docker ps -a | awk '{print "docker rm "$1}' | bash
//前面的命令会输出容器的id号,并没有删除,加上bash,是指这条命令在bash环境下运行,即删除
四、Docker 资源控制:
(1)限制CPU使用速率:
示例一:
docker run --cpu-quota 20000 nginx:latest //上限值设置为20%
示例二:通过修改配置文件实现
文件位置:/sys/fs/cgroup/cpu/docker/b6a358e3452d15285e23360491a6a4ccff0d914914fe05f1c3f27919983d9708/cpu.cfs_quota_us
修改数值就可以。
(2)多任务按比例分享CPU:
示例1:创建两个容器为c1和c2,将这两个容器cpu资源占比设置为1/3和2/3
[root@localhost docker]# docker run -itd --name c1 --cpu-shares 512 centos
[root@localhost docker]# docker run -itd --name c2 --cpu-shares 1024 centos
示例2:内存使用限制
[root@localhost docker]# docker run --name c4 -m 512m centos //限制使用512m的内存
(3)使用 --cpuset-cpus 选项限制 CPU 内核使用权:
示例:限制容器使用指定的CPU
[root@localhost docker]# docker run --name c3 --cpuset-cpus 0 centos //限制使用一个核心数的cpu
(4)对 blkio 的限制(对某一块磁盘的读写):
1、限制读某个设备的bps(数据量):
--device-read-bps
2、限制写入某个设备的bps(数据量):
--device-write-bps
3、限制读某个设备的iops(次数):
--device-read-iops
4、限制写入某个设备的iops(次数):
--device-write-iops
五、Docker 数据卷管理:
在Docker中,为了方便查看容器内产生的数据或者将多个容器中的数据实现共享,就需要容器中的数据管理操纵;
管理 Docker 容器中数据有两种方式:
- 数据卷(容器 — 宿主机);
- 数据卷仓库(容器 — 容器);
(1)数据卷:
数据卷是一个供容器使用的特殊目录,位于容器中,可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新不会影响镜像,从而实现数据在宿主机与容器之间的迁移。(类似于,linux系统上对目录的 mount操作)
1、使用 centos 镜像,在宿主机目录 /var/www 挂载容器中的 /data1
docker run -v /var/www:/data1 --name web1 -it centos /bin/bash
// -v:指定卷
/var/www:宿主机的路径
/data1:容器中的路径
2、此时进入容器,就可以看见这个数据卷已经创建成功,挂载到 /data1目录上了(为了测试,我们可以在这个目录下创建一个文档):
[root@8e82cab75872 /]# cd data1/
[root@8e82cab75872 data1]# echo "123" > test01.txt ##创建一个test01.txt
[root@8e82cab75872 data1]# exit
exit
退回到宿主机上,也可以看到这个文件的存在:
[root@localhost docker]# cd /var/www/
[root@localhost www]# ls
test01.txt
[root@localhost www]# cat test01.txt
123
(2)数据卷容器:
这个是在容器与容器之间使用的,数据卷容器就是一个普通的容器,专门提供数据卷给其他容器挂载使用。
1、首先创建一个名为 web100 的容器:
docker run --name web100 -v /data1 -v /data2 -it centos /bin/bash
在两个目录下创建两个文件:
[root@b2b9b7c908ed /]# cd data1/
[root@b2b9b7c908ed data1]# echo "111" > 111.txt
[root@b2b9b7c908ed data1]# cd ..
[root@b2b9b7c908ed /]# cd data2/
[root@b2b9b7c908ed data2]# echo "222" > 222.txt
[root@b2b9b7c908ed data2]# exit
exit
2、使用 --volumes-from 来挂载 web100 容器中的数据卷到新的容器,新容器名为 db1:
docker run -it --volumes-from web100 --name db1 centos /bin/bash
查看目录和文件是否都存在:
[root@d97174e0ca99 /]# cd data1/
[root@d97174e0ca99 data1]# ls
111.txt
[root@d97174e0ca99 data1]# cat 111.txt
111
[root@d97174e0ca99 data1]# cd ..
[root@d97174e0ca99 /]# cd data2
[root@d97174e0ca99 data2]# ls
222.txt