Docker系列(三):Docker自定义容器镜像
将容器编程镜像:
docker commit [repo:tag]
网上有这句话:当我们在制作自己的镜像的时候,会在container中安装一些工具、修改配置,如果不做commit保存 起来,那么container停止以后再启动,这些更改就消失了。
docker create --name myjava -it java /bin/bash
docker ps 得到container id 假如是123
docker start myjava
docker exec -it 123 /bin/bash
mkdir test
ls
--------------------------以上操作是在容器中加了一个test文件
docker stop 123(containerid)
docker start 123
ls
--------------------------发现还是有的。
说明网上说的是错误的。
优点:方便、快速 缺点:不规范、无法自动化
Buildfile
一个Java镜像的buildfile
FROM nimmis/ubuntu:14.04 (建议是linux的基础镜像例如centos等)
MAINTAINER nimmis <kjell.havneskold@gmail.com> (由哪个人维护的人 邮箱)
# disable interactive functions
ENV DEBIAN_FRONTEND noninteractive
# set default java environment variable
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64 (环境变量)
RUN apt-get install -y software-properties-common && \ add-apt-repository ppa:openjdk-r/ppa -y && \
apt-get update && \
apt-get install -y --no-install-recommends openjdk-8-jre && \ rm -rf /var/lib/apt/lists/* DATAGURU专业 (执行的命令,行尾的\是执行完本次命令执行下个命令)
docker build -t java . ( -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。 java是镜像名称 .是在当前目录找buildfile文件)
step1:
step2:
...
注意:所有的每一步不是再docker的宿主机上执行的,是在docker容器中执行的!
证实案例:
在宿主机中/bin 下创建hello.sh
在上面的buildfile中加入如下语句:
ADD hello.sh /bin/hello.sh
RUN /bin/hello.sh
分析:如果只加入RUN /bin/hello.sh的话,是会报错的,因为虽然宿主机有这个文件,但是执行命令的时候是在容器中,容器中是没有这个文件的,所以要在容器中创建ADD hello.sh /bin/hello.sh,这就充分的验证了“所有的每一步不是再docker的宿主机上执行的,是在docker容器中执行的”
证实案例:
在上面的buildfile中加入如下语句:
ENV http_proxy=http:///xxxx
RUN curl http://baidu.com
如果只加入RUN curl http://baidu.com的话,会出现timeout,虽然宿主机是配置了proxy的,但是容器中并没有配置,加上env,运行成功,同样验证了上面的观点
复杂案例实战:制作ubuntu+java+tomcat+ssh server镜像
FROM ubuntu
MAINTAINER yongboy "yongboy@gmail.com"
# 更新源,安装ssh server
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list RUN apt-get update
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
# 设置root ssh远程登录密码为123456
RUN echo "root:123456" | chpasswd
# 添加orache java7源,一次性安装vim,wget,curl,java7,tomcat7等必备软件
RUN apt-get install python-software-properties
RUN add-apt-repository ppa:webupd8team/java
RUN apt-get update
RUN apt-get install -y vim wget curl oracle-java7-installer tomcat7
# 设置JAVA_HOME环境变量
RUN update-alternatives --display java
RUN echo "JAVA_HOME=/usr/lib/jvm/java-7-oracle">> /etc/environment RUN echo "JAVA_HOME=/usr/lib/jvm/java-7-oracle">> /etc/default/tomcat7
# 容器需要开放SSH 22端口 这里的22根据实际情况而定
EXPOSE 22
# 容器需要开放Tomcat 8080端口
EXPOSE 8080
# 设置Tomcat7初始化运行,SSH终端服务器作为后台运行
ENTRYPOINT service tomcat7 start && /usr/sbin/sshd -D
#ENTERPOINT 是docker run后面的参数 一个buildfile只能有一个,多个最后的会覆盖前面的,
#并且不可被 docker run 提供的参数覆盖
#关于CMD和ENTERPOINT的区别:https://blog.csdn.net/allocator/article/details/70490218
Using Supervisor with Docker(多进程)
允许docker同时运行多个进程,在配置文件中进行配置,把Supervisor作为docker的启动进程。
优点:如果某个进程死了,会自动将它重新启动起来。,所以他是一个监管者。
supervisord.conf
[supervisord]
nodaemon=true
[program:sshd] c
ommand=/usr/sbin/sshd -D
[program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
镜像制作中的问题
ssh server是否应该包含到镜像里 ?
不要,容器不是虚拟机,再者ssh有配置,写死在容器中,泄密的话,需要重新打。
一个容器究竟运行几个程序?
最好是一个,如果有进程死了是不知道的,只有前台的进程知道。
程序参数和配置文件到底放在哪的问题 ?
放在环境变量中(不适合参数多的)
程序日志输出的问题
1.绑定到本地磁盘输出 2.端口写入
docker友好程序架构
Docker images------->(配置剥离到)-------->Etcd/Zookeeper(key value形式)
coreos内嵌了etcd kuberbetes也把etcd作为资源调度的核心
Docker系列(三):Docker自定义容器镜像的更多相关文章
- Docker系列之Docker镜像(读书笔记)
一.基本概念 Docker包括三个基本概念镜像.容器.仓库. Docker镜像:就是一个只读的模板.例如:一个镜像可以包含一个完整的ubuntu操作系统环境,里面仅安装了Apache或其他应用程序.用 ...
- AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排
一.前言 上一篇部署了一个最基础的helloworld应用,创建了两个容器和一个network,还算应付得过来. 如果该应用继续引入mysql.redis.job等若干服务,到时候发布一次得工作量之大 ...
- docker学习(三) - docker理解及命令
Docker 包括三个基本概念 镜像(Image) 容器(Container) 仓库(Repository) 镜像 Docker 镜像就是一个只读的模板. 例如:一个镜像可以包含一个完整的 ubunt ...
- VSTO之旅系列(三):自定义Excel UI
原文:VSTO之旅系列(三):自定义Excel UI 本专题概要 引言 自定义任务窗体(Task Pane) 自定义选项卡,即Ribbon 自定义上下文菜单 小结 引言 在上一个专题中为大家介绍如何创 ...
- Docker 系列三(容器管理).
一.运行容器 1.基于镜像新建一个容器并启动 : tomcat:8.0 -i:交互式操作 -t:终端 -rm:容器退出后随之将其删除,可以避免浪费空间 -p :端口映射 -d :容器在后台运行 指明了 ...
- 【Docker学习之四】Docker自定义容器镜像
环境 docker-ce-19.03.1-3.el7.x86_64 centos 7 一.使用已有容器创建镜像-docker commit1.查看本地已有镜像 [root@node105 ~]# do ...
- Docker系列三:Docker容器管理
Docker容器管理 1. 单一容器管理 1) 容器的启动 $ docker run --name gitlab-redis -d --volume /srv/docker/gitlab/redis: ...
- Docker系列(26)- 发布镜像到阿里云容器服务
1.登录阿里云 2.找到容器镜像服务 3.创建命名空间 4.创建镜像仓库 5.上传镜像
- Docker系列(三)常用命令
命令说明 docker pull 格式: docke pull [OPTIONS] NAME[:TAG] 作用:下载名称为 name 的镜像 例子: sudo docker pull dl.docke ...
随机推荐
- vue之vue-router嵌套路由
1.定义路由 routes: [ { path: '/product', //第一层路由 name: 'product', component: Vproductcontent,//父组件渲染的是子组 ...
- Ruby 安装 – Windows
Ruby 安装 – Windows 下面列出了在 Windows 机器上安装 Ruby 的步骤. 注意:在安装时,您可能有不同的可用版本. - Window 系统下,我们可以使用 RubyInstal ...
- 01二重退背包+组合数学——cf1111d
退背包进阶,还是挺难想的 /* dp1[k]表示取到体积k的方案数 dp2[i][j][k]表示左侧必选ij的情况下,取到体积k的方案数 dp2[i][j][k]=dp1[k]-左侧不选ij的方案数 ...
- python pillow模块用法
pillow Pillow是PIL的一个派生分支,但如今已经发展成为比PIL本身更具活力的图像处理库.pillow可以说已经取代了PIL,将其封装成python的库(pip即可安装),且支持pytho ...
- 今天工作整整一个月了,来记录一下(web前端)
25号,工作整整一个月了,时光飞逝, 这一个月以来,无论是工作上还是生活上,都让我成长了很多,也多了些对人生的思考… 先回顾一下找工作的那段时间吧年前找工作有多辛酸,年后找工作就有多幸运那段日子,我这 ...
- NX二次开发-UF_MODL_ask_point_containment获取一个点是在体(面,边)的边界内部,外部,还是边界上
NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_curve.h> #include < ...
- 执行SQL语句---INSERT/UPDATE/DELETE
1.执行SQL语句函数: int mysql_query(MYSQL* mysql, const char * query); query:所有的sql语句 2.例子: 向children表插入一条语 ...
- 英语影视台词---The Professor
英语影视台词---The Professor 一.总结 一句话总结: brilliant and liberty:厉害且自在 understand and forgive and not care:f ...
- fedora 18~20 中Qt 5.2.1 解决连接mysql数据库出现QMYSQL driver not loaded的问题
QT += sql //在.pro文件里加入这一句 //包含头文件 #include <QDebug> #include <QSqlQuery> #include ...
- Centos7.5安装kafka集群
Tags: kafka Centos7.5安装kafka集群 Centos7.5安装kafka集群 主机环境 软件环境 主机规划 主机安装前准备 安装jdk1.8 安装zookeeper 安装kafk ...