云计算之k8s系列_第三回——docker实践

实践操作

用docker部署一个用python编写的web应用

[root@centos7 ~]# vim app.pyfrom flask import Flaskimport socketimport osapp = Flask(__name__)@app.route('/')def hello():html = "<h3>Hello {name}!</h3>" \"<b>Hostname:</b> {hostname}<br/>"return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname())if __name__=="__main__":app.run(host='0.0.0.0', port=80)

这个应用的依赖,并定义在了同目录下的requirements.txt文件中

[root@centos7 ~]# cat requirements.txtFlask

制作Dockerfile

[root@centos7 ~]# vim DockerfileFROM    docker.io/pythonWORKDIR /appADD .   /appRUN pip install --trusted-host pypi.python.org -r requirements.txtEXPOSE  80ENV NAME    WorldCMD [ "python" , "app.py" ]

使用Dockerfile制作这个镜像

[root@centos7 ~]# docker built -t helloworld .
[root@centos7 ~]# docker images

使用生成的镜像启动容器

[root@centos7 ~]# docker run -d -p 4000:80 helloworld
[root@centos7 ~]# ss -anptu | grep :4000tcp    LISTEN     0      1024     :::4000                 :::*                   users:(("docker-proxy-cu",pid=16548,fd=4))
[root@centos7 ~]# curl 127.0.0.1:4000<h3>Hello World!</h3><b>Hostname:</b> d7807cac63e5<br/>

注册docker hub账号,使用docker login登录上传镜像

#此处已有账号,不做注册,如果没有dockerhub账号的话,可以到官网注册
[root@centos7 docker]# docker loginUsername: daneiyunzhijiaPassword: Login Succeeded
[root@centos7 docker]# docker tag helloworld daneiyunzhijia/helloworld:latest
[root@centos7 docker]# docker push daneiyunzhijia/helloworld:latest

进入刚刚创建的容器,创建文件,退出,并使用docker commit生成新的镜像

[root@centos7 docker]# docker exec -it c2 /bin/sh
# touch test.txt
# exit
[root@centos7 docker]# docker commit c2 daneiyunzhijia/helloworld:v2

思考:docker exec是怎么做到进入容器的?

一个进程的namespace在宿主机上是以一个文件的方式存在的。

[root@centos7 docker]# docker inspect c2 | grep Pid"Pid": 16722
[root@centos7 docker]# ls -l /proc/16722/nstotal 0lrwxrwxrwx 1 root root 0 May 26 23:32 ipc -> ipc:[4026532233]lrwxrwxrwx 1 root root 0 May 26 23:11 mnt -> mnt:[4026532231]lrwxrwxrwx 1 root root 0 May 26 23:11 net -> net:[4026532293]lrwxrwxrwx 1 root root 0 May 26 23:32 pid -> pid:[4026532234]lrwxrwxrwx 1 root root 0 May 26 23:40 user -> user:[4026531837]lrwxrwxrwx 1 root root 0 May 26 23:32 uts -> uts:[4026532232]

可以看到,一个进程的每种namespace,都在它对应的/proc/容器进程id/ns下有一个对应的虚拟文件,并且连接到一个真实的namespace文件上。有了这个功能,就可以加入到一个已经存在的namespace当中。

以上就是docker exec的实现原理:一个进程,可以选择加入到某个进程已有的namespace中,从而达到进入这个进程所在容器的目的。

一旦一个进程加入到另一个进程的namespace中,在宿主机的namespace文件上,也会有所体现。

如果创建容器时指定 --net=host,就意味着这个容器不会为进程启用network namespace。

docker commit

实际上就是在容器运行起来后,把最上层的“可读写层” , 加上原先容器镜像的只读层,打包组成一个新的镜像。当然,下面只读层在宿主机上是共享的,不会占用额外的空间。

copy-on-write: cow

在容器里对镜像rootfs所做的任何修改,都会被操作系统先复制到可读写层,然后在修改,这称为copy-on-write。

volume数据卷

volume机制,允许你将宿主机上指定的目录或者文件,挂载到容器里面进行读取和修改操作。

方法:冒号前面的部分对应宿主机目录,冒号后面的部分代表容器目录,不写冒号,代表宿主机和容器目录一样

#方法1
docker run -v /test centos ...
#方法2
docker run -v /home:/test ...

执行 -v 挂载操作时,容器进程已经创建了,所以,这个挂载只在容器可见,宿主机不可见,保证了容器的隔离性不会被volume打破。

所以,在一个正确的时机,进行一次绑定挂载,docker就可以成功地将一个宿主机上的目录或文件挂载到容器中。

docker 命令补充:

docker images           #查看已有的本地镜像
docker search rhel  #搜索docker镜像,本地和远程都会搜索
docker pull 镜像名 #下载镜像
docker push 镜像名 #上传镜像
docker load < busybox.tar   #导入镜像
docker save 镜像名  > busybox.tar  #保存镜像到本地文件
docker run -itd -v /a:/b -p 8080:80 镜像名 #使用镜像启动容器
docker ps -aq           #查看已经运行的和没有运行的容器
docker history          #查看镜像制作的历史
docker inspect          #查看容器或者镜像的详细信息
docker rmi 镜像名      #删除镜像
docker tag 镜像名  新名:v1   #修改镜像标签
docker run / stop / restart #启动/停止/重启容器
docker attach | exec            #进入容器
docker top                          #查看进程
docker rm                           #删除容器
docker commit 容器id  镜像名:标签  #使用容器,创建镜像
DockerfileFROM                        #基础镜像MAINTAINER          #维护者EXPOSE                  #开放端口ENV                         #设置环境变量ADD                         #将本地文件加入到容器中RUN                         #在容器中执行命令WORKDIR             #定义工作目录CMD                     #容器启动时执行的命令
docker build -t imagename  .   #使用Dockerfile创建镜像

docker私有仓库

    docker pull registryvim /etc/docker/daemon.json{"insecure-registries": [ "仓库宿主机ip:5000" ]}docker run -d -p 5000:5000 registrydocker tag 镜像   ip:5000/镜像:标签docker push ip:5000/镜像:标签

docker网络

网络模型:bridgehostnone
docker network create --driver bridge docker1
docker network list
docker run --network=docker1 -itd nginx

docker 总结:

docker是分层显示地,最下层是docker镜像的只读层。在只读层纸上,是docker自己添加的init层,用来存放被临时修改过的/etc/hosts等文件。而rootfs之上是一个读写层,它以copy-on-write 的方式存放任何对只读层的修改,容器声明的volume的挂载点,也出现在这一层。

云计算之k8s系列_第三回相关推荐

  1. Lync Server 2010的部署系列_第三章 证书、架构、DNS规划

    Lync Server 2010的部署系列_第三章 证书.架构.DNS规划 一.证书规划 组件 使用者名称 使用者备用名称条目/顺序 证书颁发机构 (CA) 备注 边缘外部接口 Sip.Giantha ...

  2. 服务器图片加载慢_张云雷开工拍杂志,昕薇服务器一定优化好别崩,手机被卡已三回...

    美好的九月第一天,也是周末,张云雷发微博,今天你们开学我开工,还没下班转场中,辫儿哥哥有才华呀,说话都一套一套的押韵. 他说摩羯座太难了,难不难不知道,就看出摩羯座的张云雷颜值要逆天的节奏,工作中不忘 ...

  3. K8s系列之:网络原理

    K8s系列之:网络原理 一.K8s网络模型 二.Docker的网络模型 三.网络的命名空间 1.网络命名空间的实现 2.网络命名空间的操作 3.网络命名空间的一些技巧 四.Veth设备对 1.Veth ...

  4. mysql分布式事务wcf_[转载]WCF系列_分布式事务(下)

    浏览到chnking的WCF的分布式事务处理不错,转载过来分享一下.1. WCF分布式事务例子这里也用转账的例子说事. 用户在系统A和系统B都有账户,账户间的资金可以互转,系统A的资金减少多少,系统B ...

  5. K8s系列之:Deployment应用实战和Deployment相关命令整理

    K8s系列之:Deployment应用实战和Deployment相关命令整理 一.Pod和Controller关系 二.Deployment应用场景 三.创建deployment的yaml文件 四.根 ...

  6. 《精通数据仓库设计》中英对照_第三章

    <精通数据仓库设计>中英对照_第三章 第二部分 模型开发 数据仓库应该表示企业数据的各个方面,这些方面以主题域和业务数据模型开始.我们将在第3章使用一个假想的公司,指导一步一步地开发这两个 ...

  7. k8s系列(四)——资源对象

    k8s系列四--资源对象 pod概念 思考:为什么k8s会引出pod这个概念,容器不能解决么? 我的理解:一组密切相关的服务使用容器的话,如果他们的镜像不在一个容器里的话,那么就需要配置反向代理进行通 ...

  8. 菜鸟学Kubernetes(K8s)系列——(七)关于Kubernetes底层工作原理

    菜鸟学Kubernetes(K8s)系列--(七)关于Kubernetes底层工作原理 Kubernetes系列文章 主要内容 菜鸟学Kubernetes(K8s)系列--(一)关于Pod和Names ...

  9. Linux Shell脚本入门教程系列之(三)Shell变量

    本文是Linux Shell脚本系列教程的第(三)篇,更多shell教程请看:Linux Shell脚本系列教程 Shell作为一种高级的脚本类语言,也是支持自定义变量的.继上一篇之后,今天就为大家介 ...

  10. K8s系列之:DNS服务搭建指南

    K8s系列之:DNS服务搭建指南 一.skydns配置文件说明 二.修改每台Node上的kubelet启动参数 三.创建skydns RC和Service 四.通过DNS查找Service 五.DNS ...

最新文章

  1. swoole 简单的聊天室
  2. Spring IOC快速入门
  3. 从特斯拉到计算机视觉之「图像语义分割」
  4. java怎么显示qt文件后缀,在qt中执行java文件
  5. 用Java读取/写入压缩和非压缩文件
  6. matlab qtdecomp,Opencv图像识别从零到精通(25)------区域分裂与合并
  7. 阿里云TSDB在大数据集群监控中的方案与实战
  8. 字节跳动想取消大下周,遭到部分员工激烈反对
  9. docker for windows无法共享硬盘
  10. vsftp 配置参数详解
  11. 解决Tomcat中文乱码问题——windows平台
  12. 学术英语理工(第二版)Unit4课文翻译
  13. 帝国CMS[!--onclick--]标签动态显示页面点击数,解决刷新页面浏览量无变化的问题
  14. PCIEBXMCx4板卡
  15. ⚡豆瓣告诉你《扫黑风暴》如何【短评爬取+词云】 ⚡
  16. ubuntu18.04 alt+ctrl+t 无响应解决方法
  17. 在Docker中使用Python Selenium和Headless Chrome进行网站自动化测试的方法
  18. Linux系统软件安装 Jdk MySQL Tomcat
  19. 一些 IT 公司确实存在着很多能够把狼蒸发掉的小白兔
  20. 人生苦短,我用python实现人脸(口罩)识别(及时行代码搞定)

热门文章

  1. 电子商务B2C之未来-刘爽
  2. dp 完全背包问题python
  3. 中兴ZXR10_5952E交换机配置SNMP
  4. SQL数据分析常用案例总结
  5. 图像加密标准测试图库
  6. flutter:实现扫码枪获取数据
  7. 网易云音乐 网络错误 linux,在Linux下网易云音乐打不开的另一种解决方法
  8. 2021-03-08动力学方程
  9. 重心选址法matlab,在运用重心法选址时,需要已知哪些变量? 答案:物流量物流点坐标...
  10. 马尔可夫链 以及 隐马尔可夫模型(HMM)