将容器编程镜像:

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. java创建一个空白zip

    String zipath = localpath+zipname+".zip"; public static void createNewzip(String zipath) t ...

  2. Spring中使用到的设计模式

    1.工厂模式:Beanfactory和ApplicationContext 2.单例模式:bean的构建 3.代理模式:AOP 4.模板模式:jdbcTemplate,hibernateTemplat ...

  3. eclipse背景设置什么颜色缓解眼睛疲劳

    eclipse背景设置什么颜色缓解眼睛疲劳 1.打开window->Preference,弹出Preference面板 2.展开General标签,选中Editors选项,展开. 3.选中 Te ...

  4. Java中的并发库学习总结

    我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便.而当针对高质量Java ...

  5. python 识别验证码自动登陆

    # python 3.5.0 # 通过Chrom浏览器访问发起请求 # 需要对应版本的Chrom和chromdriver # 作者:linyouyi from selenium import webd ...

  6. Python 爬取赶集网租房信息

    代码已久,有可能需要调整 #coding:utf-8 from bs4 import BeautifulSoup #有这个bs4不用正则也可以定位要爬取的内容了 from urlparse impor ...

  7. delphi 获取文件图标

    {根据文件的名字得到此文件在系统中对应大小的图标large=true(64*64) false(32*32)}procedure GetFileIcon(TypeName: Widestring; I ...

  8. NX二次开发-获取WCS标识UF_CSYS_ask_wcs

    NX9+VS2012 #include <uf.h> #include <uf_csys.h> UF_initialize(); //获取WCS标识 tag_t WcsId = ...

  9. HTML 技巧

    超过指定宽度以".."显示 width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;

  10. HDU5669

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:传送门  Portal  原题目描述在最下面.  给你n个点 ...