docker入门简介

简介

docker(容器技术)是实现虚拟化技术的一种方案,通过利用linux中命名空间,控制组和联合文件系统这个三个主要技术,来实现应用程序空间的隔离.通过对应用程序运行环境的封装来生成镜像并部署来实现跨平台,一定程度上加快了服务交付的整体流程.这篇文章主要介绍docker的一些基本概念来对容器技术有个简单的认识.

docker与传统的虚拟机方案的对比

  1. 传统的虚拟机技术主要通过虚拟机监控器实现虚拟操作系统和宿主操作系统之间的交互.docker通过操作系统提供的能力实现了应用程序之前的隔离,减少了语言转换的过程,因此在启动速度和运行效率上更胜一筹.
  2. 容器技术更加偏向于程序的移植和依赖的打包而虚拟机技术则是侧重于完全的虚拟出一个另一个虚拟环境.
  3. docker能提供更快的交付过程.通过合理的对宿主操作系统资源的划分,能有效地提高系统的资源利用率.

核心技术介绍

namespace(隔离)

通过NameSpace技术可以修改容器的视图.

int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);
复制代码

在linux中可以通过系统调用clone来创建新的进程,当第三个参数flags指定CLONE_NEWNS就会在新的namespace下启动新进程.

在上面的例子中系统本身有已经运行的很多进程,通过运行镜像并且执行bin/sh进程可以进入容器的交互界面.在容器中只能看到root进程和ps进程.这样通过namespace技术就实现了不同进程间的隔离.

Control Groups(限制)

namespace创建的进程与其他进程之前对主机的资源是竞争关系的.Linux Control Group技术就是限制进程组能够使用资源上限的一种技术.通过对容器使用资源的上线进行设置能有效地使用主机的资源和防止资源的过渡占用.

Union File System

联合文件系统可以同时挂载不同的实际文件或者目录到同一目录.Docker基于联合文件系统提出AUFS(Advanced Union File System).AUFS通过将更新挂载到老的文件之上,来实现文件的保存修改.(空间的减少).

docker核心概念介绍

镜像

镜像是封装了虚拟环境的运行内容的文件包,docker通过利用AUFS实现了增量的镜像结构.

容器

容器是隔离的虚拟环境,里面运行着docker镜像.容器有以下的几种状态:

状态含义
Created容器已经被创建资源已经就绪,应用程序未运行
Running容器中的应用容器处于运行中
Paused容器暂停
Stopped容器停止
Deleted容器被删除,占有的资源以及资源的的管理信息已经被删除

数据卷

docker运行时的持久化目录,通过将外部目录挂载到容器中,来实现数据的持久化.

docker engine


docker engine是负责启动镜像的服务,通过docker client提供的指令调用docker server提供的接口来实现对镜像和容器的操作.

使用镜像

启动指令

docker run --name nginx -p 80:80 -d nginx // --name 执行容器名 -p 宿主端口:容器端口 将宿主端口映射到容器的端口 -d 后台的方式启动 docker run --name myredis redis
docekr run --name test --link  myredis:redis debian  // --link Container:Alias 目标容器的名称:目标容器的别名 建立容器之间的链接
复制代码

操作容器指令

docker ps -a // 查看所有的容器  
docker images // 查看所有本地镜像 
docker stop name/ID  // 停止某个容器
docker rm name/ID // 删除某个容器
docker rm $(docker ps -aq) // 删除所有容器
docker rmi $(docker images -q) // 删除所有本地镜像
复制代码

使用docker创建一个hello world应用

编写程序文件

创建一个目录结构如下:

在index.py中编写程序的主要功能如下:

from flask import Flask
app = Flask(__name__)@app.route('/')
def hello_world():return 'Hello world\n'if __name__ == '__main__':app.run(debug=True,host="0.0.0.0") // 创建一个服务 在/路径下返回Hello world
复制代码

编写Dockerfile

镜像的构建可以通过Dockerfile和构建环境的上下文来完成.通过Dockerfile可以将镜像的构建过程持久化.

From python:3.4 // 从某一个基础镜像开始 From语句必须是Dockerfile的第一条语句
Run pip install Flask==0.10.1 // 执行指定的指令  由于每次执行的执行都会行成新的镜像层,可以将多个指令进行合并
WORKDIR /app // 执行Dockerfile指令执行的工作目录
COPY app /app  // src dest 这个指令将上下文的app目录复制到容器的app目录
CMD python index.py // 容器启动时执行的指令
复制代码

构建镜像和启动容器

docker build -t hello . //在当前目录的上下文上构建镜像
docker run --name haha -p 5000:5000 helloworld // 以haha容器名字启动helloword镜像 并且将容器的5000端口映射到外部的5000端口
复制代码

调试tips

  • 当执行启动镜像的命令,可以查看镜像的状态看镜像是否启动成功,对于没有成功启动的镜像可以通过docker logs查看启动的日志来排查原因.

                                                       

                                                           欢迎大家关注我的公众号,一起学习



转载于:https://juejin.im/post/5cc5c216e51d456e2500056b

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Highcharts 配置选项详细说明

http://www.runoob.com/highcharts/highcharts-setting-detail.html 转载于:https://www.cnblogs.com/mengfangui/p/8969121.html

linux下的启停脚本

linux下的根据项目名称,进行进程的启停脚本 #!/bin/bashJAVA/usr/bin/java APP_HOME/opt/program/qa/wechat APP_NAMEprogramname.jar APP_PARAM"--spring.config.location${APP_HOME}/application.properties --logging.path${APP_HOME}"case $1 in star…

python 网页爬取数据生成文字云图

1. 需要的三个包: from wordcloud import WordCloud #词云库 import matplotlib.pyplot as plt #数学绘图库 import jieba; 2. 定义变量(将对于的变量到一个全局的文件中): import re; pdurl_firsthttps://movie.do…

python---重点(设计模式)

前戏:设计模式简介 设计模式是面向对象设计的解决方案,是复用性程序设计的经验总结。(与语言无关,任何语言都可以实现设计模式) 设计模式根据使用目的的不同而分为创建型模式(Creational Pattern&#xff0…

洛谷 题解 P2010 【回文日期】

因为有8个字符,所以可得出每一年只有一个回文日期。 因此只要判断每一年就行了。 做法: 我们先把年倒过来,例如2018年就倒为8102,就得出8102就是回文日期的后四个字符,我们只要判断一下有没有这个月份和这个日期。 具体…

线程相关

1、启动线程1.11 new Handler()形式new Handler(mContext.getMainLooper()).post(newOnekeyBindFrameActivity.NetworkThread());1.12new Handler().postDelayed(new StatusCheckLoginBindFrameThread(), IoTCultivatePlantConfig.START_ACTIVITY_POST_DELAYED);1.2 new Thread…

验证Oracle收集统计信息参数granularity数据分析的力度

最近在学习Oracle的统计信息这一块,收集统计信息的方法如下: DBMS_STATS.GATHER_TABLE_STATS (ownname VARCHAR2, ---所有者名字tabname VARCHAR2, ---表名partname VARCHAR2 DEFAULT NULL, ---要分析的分区名estimate_percent NUMBER DEFAULT NULL, …

Python之NumPy(axis=0 与axis=1)区分

Python之NumPy(axis0 与axis1)区分 转载于:https://www.cnblogs.com/greatljg/p/10802392.html

Python Web开发:开发wsgi中间件

本文参考了: github.com/alanctkc/ws…Youtube : Creating WSGI Middleware上篇文章简要提到:wsgi 规范中的 app 是一个可调用对象,可以通过嵌套调用的方式实现中间件的功能。这篇文章就来亲自动手实现一下。 此文的重点在于 app 端&#xff…

20165320 第九周学习总结

主要内容: 1.URL类 URL类是java.net包中的一个重要的类,使用URL创建对象的应用程序称为客户端程序。URL 的构造方法:try { URL url new URL ("http://www.google.com"); } catch (MalformedURLException e) {System.out.println(&…

Python 函数的执行流程-函数递归-匿名函数-生成器

1 函数的执行流程函数的执行需要对函数进行压栈的,什么是压栈呢,简而言之就是在函数执行时在栈中创建栈帧存放需要变量以及指针的意思。具体涉及的知识非常多,这里就已一个Python脚本简单进行分析。当我们运行上面代码时,它的执行…

python 课堂笔记-for语句

for i in range(10):print("----------",i)for j in range(10):print("world",j)if j> 5:break 转载于:https://www.cnblogs.com/leon-zyl/p/7542466.html

【2】信息的表示和处理

1.现代计算机存储和处理的信息都以二值信号表示。 2.机器为什么要使用二进制进行存储和处理? 答:二值信号能够很容易的被表示、存储、传输。例如: 可以表示为穿孔卡片上有洞和无洞、导线上的高压和低压,顺逆时针的磁场。 3.大多数…

java版b2b2c社交电商spring cloud分布式微服务(二) 服务消费者(rest+ribbon)

一、ribbon简介 Ribbon is a client side load balancer which gives you a lot of control over the behaviour of HTTP and TCP clients. Feign already uses Ribbon, so if you are using FeignClient then this section also applies. —–摘自官网 ribbon是一个负载均衡客…

[学习笔记]支配树

被支配树支配的恐惧 定义 显然,这个支配关系是一个树(或者如果有的点不能从r到达,就是一个树一堆点)。 首先不会成环,其次也不会是DAG 即如果A支配C,B支配C,那么A和B之间必然有支配关系 解法 首…

RBAC 权限设计(转载)

来源 :https://blog.csdn.net/rocher88/article/details/43190743 这是我在网上找的一些设计比较好的RBAC权限管理不知道,像新浪、搜狐、网易、百度、阿里巴巴、淘宝网的RBAC用户权限这一块,都是这种细颗粒的RBAC设计开发,还是把他…

54.get set

当程序查询对象属性时调用get方法,如果只有get方法那么他是一个只读属性&#xff0c;//程序对对象属性进行赋值操作时调用set方法&#xff0c;如果只有set方法那么他是是一个只读属性 <script type"text/javascript">var p {x:1.0,y:1.0,//当程序查询对象属性…

Codeforces Round #554 Div.2 E - Neko and Flashback

欧拉路径 神题啊神题&#xff01;这道题的突破口就是后两个数组每个元素是一一对应的。 也就是说&#xff0c;对于一个p的排列&#xff0c;b和c取得每一个元素的下标在p中都是一样的。 根据b和c数组的性质可以得出&#xff0c;b[i] < c[i]。 这也是我们输出-1的一个判断方法…

20172311 2017-2018-2 《程序设计与数据结构》第八周学习总结

20172311 2017-2018-2 《程序设计与数据结构》第八周学习总结 教材学习内容总结 本周对JAVA中的多态性进行了学习 多态性引用能够随时间变化指向不同类型的对象&#xff0c;是通过后绑定实现的。实现多态性的主要途径有两种&#xff1a; 1.由继承实现多态性 2.利用接口实现多态…

Linux系统安装Apache 2.4.6

http://www.cnblogs.com/kerrycode/p/3261101.html Apache简介 Apache HTTP Server&#xff08;简称Apache&#xff09;是Apache软件基金会的一个开放源码的网页服务器&#xff0c;可以在大多数计算机操作系统中运行&#xff0c;由于其多平台和安全性被广泛使用&#xff0c;是最…