概念:
常规的虚拟机,相当于一个完整的主机,有自己的内核,自己的内存,自己的硬盘;然后上面->bin和lib->app。而docker却和宿主机共享一个内核,容器里面只有bin和lib->app
如果一个用户视图基于LAMP(linux+apach+mysql+php)搭建环境。需要安装apach+mysql+php以及它们各自运行所依赖的环境。之后对他们分别配置(包括创建用户,参数,如果涉及到权限管理系统,还有权限)。还需要进行功能测试。可怕的是,如果服务器迁移(如从阿里云迁到腾讯云),需要重新部署。
而docker则是通过容器打包应用,意味着迁徙只需要在新的服务器上启动需要的容器就可以了。这可以节约大量的宝贵时间,并且减少部署过程出现问题的风险。也就是一次创建/配置。在任意时间运用。
docker表面上看其实就有点像windows纯净版,自己跑起来然后安装必要的软件(QQ,Python....)。然后再封装成镜像,以后用这个镜像安装到新的电脑,新电脑当然是系统,QQ,python.....天然自带拉
应用场景:
1,依赖环境的一致性(比如开发的时候需要装一次aliyunSDK,配置到第一台web服务器的时候又要装一次aliyunSDK,配置到第二台web服务器还需要再装。而这仅仅是aliyunSDK)
2,开源技术的试用(开源代码scratch,需要安装nodejs[运行环境],git[拉取scratch],npm[依赖安装工具]。然后再编译,最后再run build。如果像odoo那样,还需要改变添加用户,改变用户权限等。 所以需要很长的时间,开发人员只想用,而不关心部署问题。容器就能很好的解决)
3,环境一致性(window开发,linux系统生产。 在开发上就用mac系统保持一致)
4,弹性伸缩(当启动一个虚拟机(假如划1核2G内存10G硬盘给虚拟机),仅仅是跑linux内核和服务,这些都会占用1核2G内存10G硬盘。所以不能有效的利用资源。而docker就行,并且一个centos7就是1个多G,在docker里面跑才几百兆。就创建一个虚拟机的硬盘空间10G就能至少够10个centos7系统用)
5,微服务(一个容器跑一个服务)
--------------------------------------------------正文---------------------------------------
安装docker:
yum install -y docker
--------------------------------------------------基础->镜像篇(Image)----------------------------------------
说明:
镜像类似于虚拟机镜像,一个镜像可以只包含一个完整的linux系统环境,镜像也可以安装了apache应用程序(镜像相当于windows镜像,创建docker容器的基础)
获取镜像(从docker hub上获取):
docker pull {name}[:version]
ex: docker pull centos:7.6
docker pull daocloud.io/centos:7(百度网址只是举例)
查看镜像列表:
docker images
REPOSITORY(来自哪个仓库) TAG(标签信息) IMAGE ID(镜像唯一ID) CREATED SIZE
docker.io/ubuntu latest 94e814e2efa8 5 weeks ago 88.9 MB
创建镜像标签:
docker tag {oldname} {newName}
ex:docker tag www/baidu.com:5000/ubuntu:latest baidu:latest
这里看出ID是一致的,所以只是别名不同,相当于应用或快捷方式
搜索镜像:
docker search [s,automated] {name}
ex:docker search centos
INDEX NAME DESCRIPTION STARS OFFICIAL(官方) AUTOMATED(自动)
docker.io docker.io/centos The official build of CentOS. 5310 [OK]
docker.io docker.io/ansible/centos7-ansible Ansible on Centos7 121 [OK]
删除镜像:
docker rmi [-f] {id}or{name}
ex:docker rmi docker.io/ubuntu
ps1:id是先删除下面所有tag再删文件,name只删除tag,没有指向会删除文件
ps2:如果有容器在运行,删除该镜像会报错
ps3:带-f是签字删除,不推荐使用。因为删除一个存在容器依赖的镜像,通过docker images可以发现强制删除的镜像换了新的ID继续存在系统中。正确的是删除依赖该镜像的所有容器,再删除镜像。
创建镜像:
1,基于已有镜像创建(依赖一个镜像,不利于自动化开发)
①运行镜像: docker run -ti centos:latest /bin/bash
②记住ID:28039506a2a5
③clone session
④docker commit [-a -m] {ID} {创建名}
-m "提交消息" -a "作者消息"
ex:docker commit a925s3 newdocker
ex:docker commit -m "add a new file" -a "davis" 28039506a2a5 version1.1
④docker images
2,从一个操作系统模板文件导入一个镜像,在这里,推荐使用OpenVZ(此处不写明了) buildfile
查看镜像详细:
docker inspect {id}
docker镜像存出载入
存出镜像到本地(虚拟机):
docker save -o {fileName} {dockerName}
ex:docker save -o test.tar version1.1
从本地载入镜像:
docker loader --input {filename}
或docker loader < {filename}
上传镜像:
docker tag {name} {dockerUser}/{name}
ps:这里必须得改别名(因为需要通过/前面的字符串确定传递到哪个用户的仓库)
ex:docker tag version1.1 davislee/version:1.1
docker push {dockerUser}/{name}
ex:docker push davislee/version:1.1
ps:默认上传到官方的公开
BUG收集:
1,Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 未启动docker
service docker start
2,denied:requested access to the resource is denied 未登录
dokcer login登录,需要有帐号密码
--------------------------------------------------基础->容器篇----------------------------------------
说明:轻量级沙箱,docker利用容器来运行和隔离应用,也就是一个实例。
用镜像创建容器:
1,docker create -it mysql:latest e MYSQL_PASSWORD=123456 -p 10086:3306 mysql
容器处于停止状态,可以通过docker start命令启动
给创建一个mysql容器,
e表示赋予环境变量
p端口映射,把10086映射到容器的3306端口
2,docker run -t -i -v /root:/tmp {name} /bin/bash (create+docker start)
ps: t 分配一个伪终端并绑定到容器的标准输入上, i 让容器的标准输入保持打开, d 后台守护运行,exit后容器都不会关闭
v 把本机的/root 挂载到容器的/tmp目录
流程:1,检查本地是否存在镜像,不存在从公有仓库下载
2,利用镜像创建并启动一个容器
3,分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
4,从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
5,从地址池配置一个IP地址给容器
6,执行用户指定的应用程序
7,执行完毕后容器被终止
ctrl+d或exit退出容器,exit后容器就自动处于终止状态。
查看容器列表:
docker ps [-a] [-q]
ps:aq可以看到终止状态的容器ID信息
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
28039506a2a5 daocloud.io/centos:7 "/bin/bash" 42 minutes ago Up 42 minutes musing_mestorf
获取容器输出:
docker logs ID
ex:docker logs 280
停止容器:
docker stop [-t|--time[=10]] ID
向容器发送sigterm信号,一段时间(默认10s),再发送sigkill信号终止容器
启动容器:
docker start ID
重启容器:
docker restart ID
进入容器:
docker exec -ti ID /bin/bash
删除容器:
docker rm {模糊id}
容器导出导入
导出容器:
docker export ID >test_for_run.tar
导入容器,则成为镜像:
cat test_for_run.tar | docker import - test/ubuntu:v1.0
ps:容器快照将丢弃所有的历史记录和元数据信息,而镜像文件将保存完整记录,所以体积大
--------------------------------------------------实战篇----------------------------------------
实践nginx的方向代理,均衡负载和docker容器。
操作步骤:
1,在dockerhub上拉取了centos系统如下:
2,用centos镜像跑起来docker,然后再里面安装上python,flask库。创建打包成新的镜像。
3,利用新的镜像启动一个容器,可选择把root目录挂载到容器内的tmp目录。docker run -ti v /root:/tmp centos7-python3.7-flask /bin/bash
4,跑起flask,这里值得注意的是web服务器run的时候一定不要是默认的。因为默认的是127.0.0.1。这个是给自己软件之间交互的通道,应该用ipv4地址,即172.17.0.3,当然,端口随意(这个IP地址是宿主机和docker容器的局域网,采用的NAT模式,所以外部是不能访问的)
5,好了,基于docker的web服务器已经跑起来了。用3-4的方法再跑一个web服务器。
6,因为172.17.0网段是宿主机和docker容器之间的局域网,所以我们安装一个nginx来实现方向代理,使公网代理访问局域网,并且分发给两个不同的服务器,并且配置了不同的权重
nginx配置如下:
7,反复访问http://101.132.110.217/,就会发现已经实现外网访问web服务器。(地址会关闭的)
网页上会出现两种内容:
这个是flask服务器1
这个是flask服务器2
反思:个人只学习到这里,觉得应该可以在容器内部使用宿主机的python环境以及flask库。而不是跑一个centos镜像,再在容器内安装python和flask,最后跑web服务