docker基础

概念:

常规的虚拟机,相当于一个完整的主机,有自己的内核,自己的内存,自己的硬盘;然后上面->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服务

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值