容器

使用runc来启动容器

本秂侑毒 提交于 2020-03-22 23:44:16
runc简介 ​ RunC 是一个轻量级的工具,它是用来运行容器的,只用来做这一件事,并且这一件事要做好。我们可以认为它就是个命令行小工具,可以不用通过 docker 引擎,直接运行容器。事实上,runC 是标准化的产物,它根据 OCI 标准来创建和运行容器。而 OCI(Open Container Initiative) 组织,旨在围绕容器格式和运行时制定一个开放的工业化标准。 如何使用 ​ 使用runc的话也是比较简单的。首先我们要基于现有已运行的docker容器来制作runc需要的rootfs,具体如下 需要机器上安装有docker # 首先建立一个工作目录以及rootfs目录 mkdir testc cd testc mkdir rootfs # 运行一个容器并根据自己的需要在容器中定制一些内容 docker run --name=test1 --rm -it centos bash # 容器运行后可根据自己需要定制安装一些内容,比如说这里安装一个ansible yum install ansible -y ... # 定制话内容完成后 此窗口不要关闭,从新开一个shell窗口执行如下命令 # 将上述运行的容器导出为文件并解压 cd testc/rootfs docker export test1 -o test1.tar tar xvf test1.tar rm -rf

Tomcat源码分析

爷,独闯天下 提交于 2020-03-22 08:27:02
前言:   本文是我阅读了TOMCAT源码后的一些心得。 主要是讲解TOMCAT的系统框架, 以及启动流程。若有错漏之处,敬请批评指教! 建议:   毕竟TOMCAT的框架还是比较复杂的, 单是从文字上理解, 是不那么容易掌握TOMCAT的框架的。 所以得实践、实践、再实践。 建议下载一份TOMCAT的源码, 调试通过, 然后单步跟踪其启动过程。 如果有不明白的地方, 再来查阅本文, 看是否能得到帮助。 我相信这样效果以及学习速度都会好很多! 1. Tomcat的整体框架结构   Tomcat的基本框架, 分为4个层次。   Server和Service   Connector     HTTP     AJP   Container     Engine     Host     Context   Component     manager     logger     loader     pipeline     valve     ...    站在框架的顶层的是Server和Service   Server: 其实就是BackGroud程序, 在Tomcat里面的Server的用处是启动和监听服务端事件(诸如重启、关闭等命令。 在tomcat的标准配置文件:server.xml里面, 我们可以看到“<Server port="8005" shutdown=

Spring扩展:替换IOC容器中的Bean组件 -- @Replace注解

痴心易碎 提交于 2020-03-22 02:13:39
1、背景: 工作中是否有这样的场景?一个软件系统会同时有多个不同版本部署,比如我现在做的IM系统,同时又作为公司的技术输出给其他银行,不同的银行有自己的业务实现(比如登陆验证、用户信息查询等); 又或者你的工程里依赖了公司的二方包A,A又依赖了B...这些jar包里的组件都是通过Spring容器来管理的,如果你想改B中某个类的逻辑,但是又不可能让架构组的人帮你打一份特殊版本的B;怎么办呢?是否可以考虑下直接把Spring容器里的某个组件(Bean)替换成你自己实现的Bean? 2、原理&实现 2.1 先看看Spring开放给我们的扩展 Spring框架超强的扩展性毋庸置疑,我们可以通过BeanPostProcessor来简单替换容器中的Bean。 @Component public class MyBeanPostProcessor implements ApplicationContextAware, BeanPostProcessor { private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this

pod的yaml说明

只谈情不闲聊 提交于 2020-03-21 22:42:39
apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 kind: Pod #指定创建资源的角色/类型 metadata: #资源的元数据/属性 name: test-pod #资源的名字,在同一个namespace中必须唯一 labels: #设定资源的标签 k8s-app: apache version: v1 kubernetes.io/cluster-service: "true" annotations: #自定义注解列表 - name: String #自定义注解名字 spec: #specification of the resource content 指定该资源的内容 restartPolicy: Always #表明该容器一直运行,默认k8s的策略,在此容器退出后,会立即创建一个相同的容器 nodeSelector: #节点选择,先给主机打标签kubectl label nodes kube-node1 zone=node1 zone: node1 containers: - name: test-pod #容器的名字 image: 10.192.21.18:5000/test/chat:latest #容器使用的镜像地址 imagePullPolicy: Never #三个选择Always、Never

Docker数据管理

泄露秘密 提交于 2020-03-21 22:25:22
因为docker 重启所有的docker数据都会丢失。怎么保存数据到本址 1、挂载本地的目录到容器里(备份) : docker run -itd -v /data/:/data centos bash -v 指定挂载目录,前面的是宿主机目录,后面的是容器目录。创建成功后两个目录内容会同步,从面达到备份的目的。 2、挂载数据卷 其实我们挂载目录的时候,可以指定容器name,如果不指定就随机定义了。比如上面我们没有指定,它就生成了一个名字为relaxed_franklin,这个名字可以使用命令 docker ps 看最右侧一列![] docker run -itd --volumes-from relaxed_franklin centos bash --volumes-from后面跟已启动的主机名,使用 relaxed_franklin的数据卷。我们使用了centos 创建了新的容器 3、定义数据卷容器 有时候,我们需要多个容器之间相互共享数据,类似于linux里面的NFS,所以就可以搭建一个专门的数据卷容器,然后其他容器直接挂载该数据卷。 首先建立数据卷容器 docker run -itd -v /data/ --name testvol centos bash //注意这里的/data/是容器的/data目录,并非本地的/data/目录。 然后让其他容器挂载该数据卷 docker

Docker网络模式

一曲冷凌霜 提交于 2020-03-21 22:25:10
host模式,使用docker run时使用--net=host指定 docker使用的网络实际上和宿主机一样,在容器内看到的网卡ip是宿主机ip container模式,使用--net=container:container_id/container_name 多个容器使用共同的网络,看到的ip是一样的 none模式,使用--net=none指定 这种模式下,不会配置任何网络 bridge模式,使用--net=bridge指定默认模式 不用指定默认就是这种网络模式。这种模式会为每个容器分配一个独立的Network Namespace。类似于vmware的nat网络模式。同一个宿主机上的所有容器会在同一个网段下,相互之间是可以通信的。 1、从外部访问容器 首先使用centos镜像新建一个容器,然后在该容器中安装httpd服务,并启动 ###启动镜像 docker run -itd centos docker ps docker exec -it 1ce0ec25afeb bash ###安装nginx yum install -y epel-release yum install -y nginx ###再把该容器导成一个新的镜像(centos-httpd),然后再使用新镜像创建容器,并指定端口映射 docker commit -m "install nginx" -a "test

有状态Stateful,富含数据的CI/CD怎么做?

本秂侑毒 提交于 2020-03-21 21:56:57
CI/CD with Data: 通过AWS Developer Tools、 Kubernetes和Portworx来实现软件交付Pipeline的数据迁移能力 数据是应用最重要的部分。容器技术让应用打包和部署变得更快更容易。对于软件的可靠交付来说,测试环节变得更加重要。由于所有的应用都包含数据,开发团队需要办法来可靠的控制、迁移、和测试真实的应用数据。 对于一些团队来说,通过CI/CD pipeline来移动应用数据,为了保持合规性和兼容其他一些问题,一直是通过手动方式来完成的,无法有效扩展。通常只能适用于一小部分应用,而且无法在不同环境中迁移。目标应该是运行和测试有状态容器,如同无状态容器一样简单(有状态容器 – 例如数据库或者消息总线,其中运行是被追踪的;无状态容器 – 例如网页前端) 为什么测试场景中“状态-State”十分重要?一个原因是许多bug只会在真实数据的环境下才会产生。例如,你需要测试一个数据库的schema的升级,而一个小的数据集并不能完全代表包含复杂商业逻辑的关键应用。如果你需要进行端到端的完整测试,我们需要能够容易的管理我们的数据和State。 在本篇文章中,我们定义CI/CD Pipeline的参考架构,从而能够达到应用间的自动数据迁移。我们也展示如何配置CI/CD pipeline的步骤。 有状态Pipelines: 需要可迁移的卷 作为持续集成

docker学习2

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-21 19:16:33
今天继续学习docker! 搜索镜像 docker search centos 下载镜像 docker pull name(镜像名字) 查看镜像 docker images 字段含义分析: TAG:仓库 ,镜像属于哪个仓库 latest:标签 IMAGE ID:ID号 SIZE:镜像大小 CREATED:创建的时间 导出镜像 docker save contos > /opt/centos.tar.gz 找别人拿一个镜像: (导入) docker load < /opt/centos.tar.gz 每一个镜像都有一个唯一的ID: 如何删除一个镜像: docker rmi IMAGE ID #镜像创建了容器是不能被删除的 启动容器方式; 第一次启动容器: docker run centos /bin/echo "hehe" docker run --help 查看 run参数 查看容器: STATUS这个属性表示状态的意思 :退出状态 怎么不让他退出那?,这个容器还没有名字 之前那个我并没有给他命名是系统自动生成的 。 下面来看看这个操作; docker run --name mydocker -t -i centos /bin/bash -t:表示分配一个伪终端tty -i:标准输入保持打开的 t ,i一起使用 声明:容器的主机名和ID一样 执行这个命令(docker run -

docker 知识点

断了今生、忘了曾经 提交于 2020-03-21 19:16:03
docker 教程: http://www.runoob.com/docker/docker-tutorial.html docker 仓库地址: https://store.docker.com/ docker run参数说明: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 参数 说明 --name [name] 为容器指定一个名称 -d --detach,后台运行容器,并返回容器ID -P --publish-all,容器内部使用的网络端口,随机映射到主机的端口 -p, --publish [主机端口]:[容器内部端口] 容器内部使用的网络端口,绑定到指定的主机端口,比如:80:80,8080:80 --add-host [host]:[ip] 添加host到ip的映射(host:ip), 比如:m1.baidu.com:10.10.10.10 -v, --volume [宿主机目录]:[镜像目录] 把宿主机上的目录挂载到镜像目录,比如:/soft:/data -t --tty,在新容器内指定一个伪终端或终端。 -i --interactive,允许你对容器内的标准输入 (STDIN) 进行交互。 -v --volume value,绑定本机目录到容器目录 --rm 如果容器存在,自动将其删除 docker run 命令示例: 命令

stl内存管理

心已入冬 提交于 2020-03-21 18:50:23
STL提供了很多泛型容器,如vector,list和map。程序员在使用这些容器时只需关心何时往容器内塞对象,而不用关心如何管理内存,需要用多少内存,这些STL容器极大地方便了C++程序的编写。例如可以通过以下语句创建一个vector,它实际上是一个按需增长的动态数组,其每个元素的类型为int整型: stl::vector<int> array; 拥有这样一个动态数组后,用户只需要调用push_back方法往里面添加对象,而不需要考虑需要多少内存: array.push_back(10); array.push_back(2); vector会根据需要自动增长内存,在array退出其作用域时也会自动销毁占有的内存,这些对于用户来说是透明的,stl容器巧妙的避开了繁琐且易出错的内存管理工作。 隐藏在这些容器后的内存管理工作是通过STL提供的一个默认的allocator实现的。当然,用户也可以定制自己的allocator,只要实现allocator模板所定义的接口方法即可,然后通过将自定义的allocator作为模板参数传递给STL容器,创建一个使用自定义allocator的STL容器对象,如: stl::vector<int, UserDefinedAllocator> array; 大多数情况下,STL默认的allocator就已经足够了