Docker容器应用中,10个要不得的坏习惯
毋庸置疑,容器已经成为企业IT基础设施中必不可少的部分,它具有许多的优点,比如:
- 第一:容器是不可变的——操作系统,库版本,配置,文件夹和应用程序都包装在容器内。你保证在质量检查中测试过的同一镜像将以相同的行为到达生产环境。
- 第二:容器很轻——容器的内存占用量很小。容器将只为主要进程分配内存,而不是数百或数千MB。
- 第三:容器非常快——可以像启动典型Linux进程一样快地启动容器。你可以在几秒钟内启动一个新容器,而不是几分钟。
但是,许多用户仍然像对待典型虚拟机一样对待容器,而忘记了容器具有重要的特征:即容器是一次性的。
这种特征迫使用户改变他们对如何处理和管理容器的看法。那么该如何保持容器的最佳效益呢?以下将介绍Docker容器中应避免的10件事。
1、不要将数据存储在容器中
因为你可以停止,销毁或更换容器。在容器中运行的应用程序版本1.0应该容易地由版本1.1替换,而不会造成任何影响或数据丢失。因此,如果需要存储数据,请批量存储。在这种情况下,还应该注意两个容器是否在同一卷上写入数据,因为这可能会导致损坏。确保你的应用程序是为了写入共享数据存储。
2、不要将应用程序分为两部分进行交付
有些人看到像虚拟机这样的容器,大多数人倾向于认为他们应该将应用程序部署到现有的运行容器中。在开发阶段,你需要不断进行部署和调试,这是正确的。但对于一个连续传递(CD)管道QA和Production,你的应用程序应该是镜像的一部分。
3、不要创建大镜像
因为大镜像将很难分发。确保仅具有运行应用程序/进程所需的文件和库。不要安装不必要的软件包或运行将许多文件下载到新镜像层的“更新” 。
4、不要使用单层镜像
为了有效利用分层文件系统,请始终为操作系统创建自己的基础镜像层,为用户名定义创建另一层,为运行时安装创建另一层,为配置创建另一层,最后是应用程序的另一层。重新创建,管理和分发镜像将更加容易。
5、不要从正在运行的容器中创建镜像
换句话说,不要使用“ docker commit”来创建镜像。这种创建镜像的方法不可复制,应完全避免。始终使用完全可复制的Dockerfile或任何其他S2I(从源到镜像)方法,如果将Dockerfile存储在源代码控制存储库(git)中,则可以跟踪对Dockerfile的更改。
6、不要只使用“最新”标签
对于Maven用户,最新标签就像“ SNAPSHOT”一样。由于容器的分层文件系统性质,因此鼓励使用标签。几个月后生成镜像并发现你的应用程序无法运行是因为父层(Dockerfile中的FROM)被不兼容向后的新版本或错误的新版本所取代,你不会感到惊讶从构建缓存中检索了“最新”版本。在生产环境中部署容器时,也应避免使用“最新”标签,因为你无法跟踪正在运行哪个版本的镜像。
7、不要在单个容器中运行多个进程。
容器非常适合运行单个进程(http守护程序,应用程序服务器,数据库),但是如果有多个进程,则管理起来可能会遇到更多麻烦,检索日志,并分别更新流程。
8、不要将凭据存储在镜像中。
使用环境变量,你不想对镜像中的任何用户名/密码进行硬编码。使用环境变量从容器外部检索该信息。这个原理的一个很好的例子是Postgres镜像。
9、不要以root用户身份运行进程
“默认情况下,docker容器以root用户身份运行。随着docker的成熟,可能会提供更多安全的默认选项。目前,要求root用户对其他人是危险的,可能并非在所有环境中都可用。你的镜像应使用USER指令为运行容器指定一个非root用户。
10、不要依赖IP地址
每个容器都有自己的内部IP地址,如果你启动和停止容器,它可能会更改。如果应用程序或微服务需要与另一个容器通信,请使用环境变量将正确的主机名和端口从一个容器传递到另一个容器。
以上就是Docker容器的应用中,10个要不得的坏习惯的详细内容,更多关于Docker容器应用的资料请关注我们其它相关文章!
相关推荐
-
详解Docker容器数据卷
是什么 先来看看Docker的理念: 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的容器之间希望有可能共享数据 Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了. 为了能保存数据在docker中我们使用卷. 一句话:有点类似我们Redis里面的RDB和AOF 能干嘛 卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系
-
Docker容器编排实现过程解析
在实际的开发环境或者生产环境,容器往往都不是独立运行的,经常需要多个容器一起运行,此时,如果继续使用run命令启动容器,就会非常不便,在这种情况下,docker-compose是一个不错的选择,使用dockercompose可以实现容器编排,本文就来看看docker-compose的使用.本文以jpress这样一个开源网站的部署为例,向读者介绍docker-compose的使用.jpress是Java版的wordPress,不过我们不必关注jpress的实现,在这里我们只需要将之当作一个普通的应
-
Docker 最常用的镜像命令和容器命令详解
本文列出了 Docker 使用过程中最常用的镜像命令和容器命令,以及教大家如何操作容器数据卷,实现容器数据的备份.熟练练习这些命令以后,再来一些简单的应用部署练习,大家就可以学习 Docker 的镜像构建.备份恢复迁移.镜像仓库.网络.集群等等更多的内容. 镜像相关命令 官方文档:https://docs.docker.com/reference/ 查看镜像 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZ
-
如何在docker容器内部安装kibana分词器
步骤: 1.在虚拟机目录下新建docker-compose.yml文件,然后进入yml文件编辑 vi docker-compose.yml 2.在yml文件中添加如下代码: version: "3.1" services: elasticsearch: image: daocloud.io/library/elasticsearch:6.5.4 restart: always container_name: elasticsearch ports: - 9200:9200 #将分词器映
-
Docker容器网络端口配置过程详解
暴露网络端口 实际上,Docker中涉及暴露网络端口的参数有两个,分别是-p和-P.下面分别来介绍. -P 使用-P,Docker会在宿主机上随机为应用分配一个未被使用的端口,并将其映射到容器开放的端口,以Nginx 为例,如下: 可以看到,Docker为应用分配了一个随机端口32768,使用该端口即可访问容器中的 nginx(http://lcalhost:32768). -p -p参数则有几种不同的用法: hostPort:containerPort 这种用法是将宿主机端口和容器端口绑定起来
-
spring boot项目生成docker镜像并完成容器部署的方法步骤
一.问题产生 把spring boot项目生成的jar打成docker镜像并生成docker容器完成部署是比较简单方便的部署方式,而且部署过程很少会出错. 二.部署步骤 1.利用maven或者gradle完成打包工作,打成jar包的形式. 2.在项目中的任意位置创建Dockerfile文件,本人的文件如下: FROM java:8 VOLUME /tmp ADD front-1.0-SNAPSHOT.jar front.jar RUN bash -c 'touch /front.jar'
-
Docker容器搭建并运行实现过程详解
直接拉取镜像,创建容器并运行容器一把梭哈: docker run -d --restart=always \ --privileged=true \ --net=host \ --name=fastdfs \ -e IP=192.168.149.128 \ -e WEB_PORT=80 \ -v ${HOME}/fastdfs:/var/local/fdfs registry.cn-beijing.aliyuncs.com/tianzuo/fastdfs 其中-v ${HOME}/fastdfs
-
Docker数据卷容器创建及使用方法解析
数据卷容器是一个专门用来挂载数据卷的容器,该容器主要是供其他容器引用和使用.所谓的数据卷容器,实际上就是一个普通的容器,举例如下: 创建数据卷容器 使用如下方式创建数据卷容器: docker run -itd -v /usr/share/nginx/html/ --name mydata ubuntu 命令执行效果如下图: 引用容器 使用如下命令引用数据卷容器: docker run -itd --volumes-from mydata -p 80:80 --name nginx1 nginx
-
Docker容器的应用中,10个要不得的坏习惯
毋庸置疑,容器已经成为企业IT基础设施中必不可少的部分,它具有许多的优点,比如: 第一:容器是不可变的--操作系统,库版本,配置,文件夹和应用程序都包装在容器内.你保证在质量检查中测试过的同一镜像将以相同的行为到达生产环境. 第二:容器很轻--容器的内存占用量很小.容器将只为主要进程分配内存,而不是数百或数千MB. 第三:容器非常快--可以像启动典型Linux进程一样快地启动容器.你可以在几秒钟内启动一个新容器,而不是几分钟. 但是,许多用户仍然像对待典型虚拟机一样对待容器,而忘记了容器具有重要
-
Docker容器应用中,10个要不得的坏习惯
毋庸置疑,容器已经成为企业IT基础设施中必不可少的部分,它具有许多的优点,比如: 第一:容器是不可变的--操作系统,库版本,配置,文件夹和应用程序都包装在容器内.你保证在质量检查中测试过的同一镜像将以相同的行为到达生产环境. 第二:容器很轻--容器的内存占用量很小.容器将只为主要进程分配内存,而不是数百或数千MB. 第三:容器非常快--可以像启动典型Linux进程一样快地启动容器.你可以在几秒钟内启动一个新容器,而不是几分钟. 但是,许多用户仍然像对待典型虚拟机一样对待容器,而忘记了容器具有重要
-
Docker容器化应用与结构
目录 容器化应用 什么是容器化应用 应用怎么打包 Docker 镜像组成 联合文件系统 Linux 内核 Docker 结构 Docker 服务与客户端 Docker 客户端 容器运行时 Docker 引擎 Docker 引擎变化 Docker 引擎的架构 containerd shim runc 容器化应用 什么是容器化应用 containerized applications 指容器化的应用,我们常常说使用镜像打包应用程序,使用 Docker 发布.部署应用程序,那么当你的应用成功在 Doc
-
nginx在docker容器中自动生成配置文件
公司在搭建docker自动化部署时,需要制作一个nginx镜像在其docker run时通过外部指定环境变量使得容器中的配置文件自动生成,不需要再到容器里改配置文件. 实现思路 最后运行的命令大概是这样: docker run -d -p 80:80 -e xxx=xx 镜像名称 镜像中脚本路径 这里的脚本会代替dockerfile中的CMD指令,所以我们要构建一个自动生成且启动nginx的shell脚本. #!/bin/bash #从环境变量里面获取lt开头,为了与其他环境变量区别开,例如lt
-
Docker容器中运行flume及启动不输出运行日志问题
flume配置文件如下: # Name the components on this agent app1.sources = r1 app1.sinks = k1 app1.channels = c1 # Describe/configure the source app1.sources.r1.type = avro app1.sources.r1.bind = 0.0.0.0 app1.sources.r1.port = 44444 # Describe the sink #a1.sink
-
VMware中安装CentOS7(设置静态IP地址)并通过docker容器安装mySql数据库(超详细教程)
一位读大二的学弟问我怎么安装配置这些,我简单的整了一个教程,这里记录一下,并分享给需要的朋 安装过程学习使用足够,实际工作中有些繁琐的配置略过了! 打开VM虚拟机,菜单栏[文件]-->选择[新建虚拟机],选择"o自定义(高级)"-->[下一步] 默认一直点[下一步]到选择安装盘的位置,选择自己已经下载好的官方DVD镜像文件(不要整别的镜像,避免走不必要 的坑) [下一步]设置虚拟机名称(取一个合适的名称,设置合适的路径) 处理器设置默认,安装好虚拟centos后可以根据情况
-
在docker容器中使用非root用户执行脚本操作
应用容器化之后,在docker容器启动时,默认使用的是root用户执行命令,因此容器中的应用默认都是使用root用户来运行的,存在很高的安全风险,那么如何能够使用非root的业务用户来运行应用呢, 下面我将举一个简单的例子来说明. 该例子是在容器中使用自建的用户来运行一个简单的shell脚本,并将脚本输出日志持久到容器外部.接下来让我们来看从制作镜像到容器运行的全过程吧. 1.构建镜像: 我将会使用dockerfile的方式来构建镜像,基础镜像使用ubuntu 14.04(需要先拉取该镜像,do
-
Docker容器中挂载NFS共享目录的实现
之前在https://www.jb51.net/article/205922.htm 介绍过使用Dockerfile构建ubuntu 16.04镜像,并在容器中编译执行Messy_Test项目.这里介绍下如何在容器中挂载NFS服务器上的共享目录. Dockerfile内容如下: FROM ubuntu:16.04 LABEL maintainer="FengBingchun fengbingchun@163.com" \ version="1.0" \ descri
-
docker容器中安装vim问题解决
目录 故事的开始 装个 vim 编辑 hadoop-hive.env 大意了没有闪, 居然是 debian 其他方法 总结 故事的开始 很多互联网公司, 业务走过 0-1 的野蛮生长之后必定需要精细化管理; 尤其是 面向自己用户 这一块, 你需要像个渣男一样了解你的用户特点 / 需要 / 才知道怎样哄人家开心; 人家才会死心塌地跟着你. 如果是 面向企业(to B)用户, 问题很简单: 去拜访不同的合作公司/业内翘楚, 大家都是带有目的性, 互惠互利一来二去就清楚了; 但像我们这种 面向用户(t
-
在Docker容器中部署Django的时区问题
目录 Django 中与时区有关的配置 USE_TZ=True USE_TZ=False Linux 容器中时区的设置 进入 Django 环境查看时间和时区 修改 Linux 容器时区 进入 Django 环境查看时间 总结 现在容器化部署已经非常成熟了,我们很多服务都会使用容器部署,更新恢复都非常方便,但是有一个问题比较麻烦,就是时区处理,通常情况下,都采用注入 TZ 环境变量来解决,但是实际这种处理方式在 django 中却是不行的. Django 中与时区有关的配置 在Django的配置
随机推荐
- 正则表达式(regular)知识(整理)
- JavaScript设计模式之单件模式介绍
- 硬盘启动提示verifying DMI Pool Data错误的解决方法
- Java的Spring框架下RMI与quartz的调用方法
- java版实现2048游戏功能
- PHP静态文件生成类实例
- Python深入学习之装饰器
- javascript Zifa FormValid 0.1表单验证 代码打包下载
- asp.ent(C#)中判断空字符串的3种方法以及性能分析
- C#中分部方法和分部类分析
- php实现文件下载代码分享
- php微信开发之带参数二维码的使用
- C#利用WMI操作DNS服务器(可远程操作,需要相应权限)
- 浅析Java中Data类的应用
- 微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
- C#自定义HttpFilter模块完善实例
- Adnroid 自定义ProgressDialog加载中(加载圈)
- Java内部类_动力节点Java学院整理
- C++中结构体的类型定义和初始化以及变量引用
- 多角度发掘VoIP