将容器编程镜像:

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自定义容器镜像的更多相关文章

  1. Docker系列之Docker镜像(读书笔记)

    一.基本概念 Docker包括三个基本概念镜像.容器.仓库. Docker镜像:就是一个只读的模板.例如:一个镜像可以包含一个完整的ubuntu操作系统环境,里面仅安装了Apache或其他应用程序.用 ...

  2. AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排

    一.前言 上一篇部署了一个最基础的helloworld应用,创建了两个容器和一个network,还算应付得过来. 如果该应用继续引入mysql.redis.job等若干服务,到时候发布一次得工作量之大 ...

  3. docker学习(三) - docker理解及命令

    Docker 包括三个基本概念 镜像(Image) 容器(Container) 仓库(Repository) 镜像 Docker 镜像就是一个只读的模板. 例如:一个镜像可以包含一个完整的 ubunt ...

  4. VSTO之旅系列(三):自定义Excel UI

    原文:VSTO之旅系列(三):自定义Excel UI 本专题概要 引言 自定义任务窗体(Task Pane) 自定义选项卡,即Ribbon 自定义上下文菜单 小结 引言 在上一个专题中为大家介绍如何创 ...

  5. Docker 系列三(容器管理).

    一.运行容器 1.基于镜像新建一个容器并启动 : tomcat:8.0 -i:交互式操作 -t:终端 -rm:容器退出后随之将其删除,可以避免浪费空间 -p :端口映射 -d :容器在后台运行 指明了 ...

  6. 【Docker学习之四】Docker自定义容器镜像

    环境 docker-ce-19.03.1-3.el7.x86_64 centos 7 一.使用已有容器创建镜像-docker commit1.查看本地已有镜像 [root@node105 ~]# do ...

  7. Docker系列三:Docker容器管理

    Docker容器管理 1. 单一容器管理 1) 容器的启动 $ docker run --name gitlab-redis -d --volume /srv/docker/gitlab/redis: ...

  8. Docker系列(26)- 发布镜像到阿里云容器服务

    1.登录阿里云 2.找到容器镜像服务 3.创建命名空间 4.创建镜像仓库 5.上传镜像

  9. Docker系列(三)常用命令

    命令说明 docker pull 格式: docke pull [OPTIONS] NAME[:TAG] 作用:下载名称为 name 的镜像 例子: sudo docker pull dl.docke ...

随机推荐

  1. php上传(二)

    上传的主体页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  2. bzoj1029题解

    [解题思路] 贪心,先按结束时间排序,从左到右扫描过去,如果当前建筑可以修复则入大根堆,否则,若其修复时间比堆顶小则弹出堆顶并入堆,处理完堆后则更新总时间.复杂度O(nlog2n). [参考代码] # ...

  3. 在DELPHI中显示GIF动画

    想没想过在DELPHI中显示GIF动画?Delphi的用户是非常幸运的,因为有免费控件可以使用.最著名的控件是Anders Melander编写的TGifImage,并提供完整的源程序.它原来的主页是 ...

  4. NTT数论变换

    数论变换NTT 前置知识 FFT:NTT的思想和FFT一样(FFT介绍) 概述 数论变换,即NTT(Number Theory Transformation?),是基于数论域的FFT,一般我们默认FF ...

  5. NX二次开发-UFUN计算两点距离UF_VEC3_distance

    NX11+VS2013 #include <uf.h> #include <uf_curve.h> #include <uf_vec.h> UF_initializ ...

  6. 笨办法学Python记录--习题1-11

    20140412(习题1-10),和打印较劲: 1. 读这本书时没有按照要求安装Python2,我选择的是最新版3.4.0(官方release),然后悲剧发现完全不兼容,现在摘录2,3区别: 这个星期 ...

  7. px2rem-loader(Vue:将px转化为rem,适配移动端)

    转载:https://www.cnblogs.com/WQLong/p/7798822.html 1.下载lib-flexible 使用的是vue-cli+webpack,通过npm来安装的 npm ...

  8. 2018-2019-2-20175323 java实验四 Android程序设计

    (一)安装及配置Andriod Studio,执行HelloWorld 我选择的安装网址下载了3.2.0版本的Andriod Studio 此处应该选择cancel 报错 点击所给链接,安装相应SDK ...

  9. ionic-CSS:ionic select

    ylbtech-ionic-CSS:ionic select 1.返回顶部 1. ionic select ionic select 的 select 相比原生的要更加美观些.但是弹出的可选选项样式是 ...

  10. NetBeans简介和简单使用

    1.什么是NetBeans? NetBeans IDE:可以使开发人员利用Java平台能够快速创建Web.企业.桌面以及移动的应用程序: 支持语言:PHP.Ruby.JavaScript.Groovy ...