文章目录
一、Docker概述
1.1Docker简介
●Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
●Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
●容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
(沙箱是一个虚拟系统程序,沙箱提供的环境相对于每一个运行的程序都是独立的,而且不会对现有的系统产生影响,即沙箱提供一个限制该应用程序对系统资源的访问权限。)
●docker可以在任意环境部署的原因:只要能装上docker-engine 引擎,就能使用;它实现了docker环境的跨平台。
●容器不依赖于系统,依赖于引擎。
●容器是一个应用层抽象;虚拟机(VM)是一个物理硬件层抽象
例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而Docker通常用于隔离不同的应用 ,例如前端,后端以及数据库。
1.2Docker与虚拟机的区别
1.3Docker的使用场景
●打包应用程序简化部署
●可脱离底层硬件任意迁移
二、Docker的核心概念及安装
2.1Docker三要素
●镜像
一个面向Docker容器引擎的只读模板
●容器
从镜像创建的运行实例
●仓库
集中保存镜像的地方;分公有和私有仓库
2.2部署19版Docker-CE(使用yum仓库)
1.安装依赖包
yum -y install yum-utils device-mapper-persistent-data lvm2
#yum-utils提供了yum-config-manager
#device mapper存储驱动程序需要device-mapper-persistent-data和lvm2
#device mapper是Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
2.设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.安装Docker-CE(社区版docker)
yum -y install docker-ce
systemctl stop firewalld.service
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
systemctl start docker.service
systemctl enable docker.service
4.镜像加速(到阿里云镜像加速寻找自己的加速器)
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://3m0ss.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
5.网络优化
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
service network restart
systemctl restart docker
三、Docker基础命令
3.1镜像操作
●查看docker版本
docker version
●搜索nginx镜像(公有仓库)
docker search nginx
●下载nginx镜像
docker pull nginx
AUFS(联合文件系统)若干层下载
下载后存放在/var/lib/docker
下载文件信息/var/lib/docker/image/overlay/repositories.json
●查看镜像列表
docker images #查看下载镜像信息列表
docker inspect 7e4d58f0e5f3 #获取镜像信息
docker inspect nginx:latest
●为镜像添加新标签
docker tag nginx:latest nginx:web
●两种方式删除镜像
注意:删除某一个镜像时,只要有容器在使用某一个镜像,必须先删除容器,才能删除镜像。
(1)删除镜像+标签名
(2)删除镜像id
注意:只有当镜像id对应标签仅剩一个时,才能使用镜像id的方式进行删除;否则出现如下报错
或者也可以在最后加上-f选项,一次性删除
●存出镜像并命名为nginx,存到/opt目录下
docker save -o /opt/nginx nginx:latest
●载入镜像
docker load < /opt/nginx
3.2容器操作
●创建容器
docker create -it nginx:latest /bin/bash
-i:让容器的标准输入保持打开
-t:让Docker分配一个伪终端
●查看容器运行状态
docker ps -a
-a:列出所有的容器,包括未运行的容器
Created:已创建
Up:运行中
●启动容器
docker start cc4a8b1d428c(容器id)
●容器网络原理图
docker0:各个容器之间通信的网关
●启动执行命令查看系统根目录
一般启动容器流程:
(1)docker pull centos --下载镜像
(2)docker create -it centos:latest /bin/bash
(3)docker start d4a99affa677
通过run命令启动:(先去查找现有的镜像中有没有,没有先下载,再启动)
docker run centos:latest /usr/bin/bash -c ls /
执行完成会关闭,状态是Exited(容器可以做一次性的处理,处理完就释放资源,做到了最小成本控制)
容器持续在后台执行(通过执行死循环)
docker run -d centos:latest /bin/bash -c "while true;do echo hello;done"
使用 docker logs 容器id 命令,可以查看容器内的标准输出
●终止容器运行
docker stop 0401f589d5ed(CONTAINER ID)
●进入容器(该容器一定要在Up状态)
docker start 0f0ba9207b21
docker exec -it 0f0ba9207b21 /bin/bash
exit #退出容器
●导出容器
docker export cc4a8b1d428c > /opt/nginx_bak
●导入容器(会生成镜像,而不会创建容器)
cat /opt/nginx_bak | docker import - nginx:bak
●删除容器(容器必须为停止状态)
docker stop e885c37fb2eb
docker rm e885c37fb2eb
●批量删除容器
docker ps -a | sed -n '2,$p' | awk '{print "docker rm "$1}' | bash
四、Docker镜像
4.1Docker镜像介绍
●应用发布的标准格式
●支撑一个Docker容器的运行
4.2Docker镜像的创建方法
●基于已有镜像容器创建
●基于本地模板创建
●基于Dockerfile创建
4.2.1基于已有镜像容器创建
1.docker create -it 原镜像名 /bin/bash
2.docker commit -m "new" -a "chen" 已有容器id 新镜像名:标签
-m:说明信息
-a:作者信息
-p:生成过程中停止容器的运行
docker images | grep 标签
4.2.2基于本地模板创建
1.导入本地镜像debian-7.0-x86-minimal.tar.gz
2.cat debian-7.0-x86-minimal.tar.gz | docker import - 镜像名:标签
3.docker images | grep 标签
4.2.3基于Dockerfile创建
●Dockerfile是由一组指令组成的文件
●Dockerfile结构四部分
基础镜像信息
维护者信息
镜像操作指令
容器启动时执行指令
●Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#”号开头的注释
●Dockerfile操作指令
Dockerfile文件生成apache镜像实例:
创建一个专门的文件夹
mkdir apache
cd apache
1.vim Dockerfile (Dockerfile名字不可更改)
#新镜像基于的基础镜像(基础镜像未下载会先下载)
FROM centos:7
#维护镜像的用户信息
MAINTAINER This is chen
#镜像操作指令安装apache软件
RUN yum -y update
RUN yum -y install httpd
#开启80端口
EXPOSE 80
#复制网址首页文件
ADD index.html /var/www/html/index.html
#将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#启动容器时执行脚本
CMD ["/run.sh"]
此处注意一个细节:每加载一步会生成一个临时的容器,加载完后会删除
2.vim run.sh #和Dockerfile文件位于相同目录下
#!/bin/bash
rm -rf /run/httpd/ * #删除进程文件
exec /usr/sbin/apachectl -D FOREGROUND #启动apache
3.vim index.html #编辑首页文件
<h1>this is web</h1>
4.生成镜像
docker build -t httpd:test . (注意别忘了末尾有".")
5.新镜像运行容器
docker run -d -p 1216:80 httpd:test
-p:映射到宿主机指定端口
-P:映射到宿主机随机端口
6.测试容器是否成功运行
http://14.0.0.10:1126/
五、Docker的数据管理
5.1为什么要进行数据管理操作
●方便查看容器内产生的数据
●多容器间实现数据共享
例如:需要给多个容器中的网站站点上传网页内容时,可以高效的部署网页。
5.2两种管理方式
●数据卷
数据卷是容器和宿主之间的数据共享
●数据卷容器
数据卷容器是容器和容器之间的数据共享
5.3数据卷操作实例
1.将宿主机目录中的/var/www挂载到容器中的/data1中(如果目录不存在都会自动创建)
docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash
2.在容器中/data1目录下创建文件进行测试
[root@bb58030283e7 /]# cd /data1/
[root@bb58030283e7 data1]# touch 123.txt
3.回到宿主机/var/www查看
[root@node1 ~]# cd /var/www/
[root@node1 www]# ls
123.txt
5.4数据卷容器操作实例
1.创建数据卷容器web10
docker run --name web10 -v /data1 -v /data2 -it centos:7 /bin/bash
2.新容器web100挂载数据卷容器web10
docker run -it --volumes-from web10 --name web100 centos:7 /bin/bash
(web100容器会自动关联web10容器中的数据卷)
3.在新容器web100的/data1中创建文件进行测试
[root@2ad42960c2aa data1]# cd /data1/
[root@2ad42960c2aa data1]# ls
[root@2ad42960c2aa data1]# touch 1.txt
4.回到数据卷容器web10的/data1中查看
[root@b10f5d5ae9d5 /]# cd data1/
[root@b10f5d5ae9d5 data1]# ls
1.txt