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 ...
随机推荐
- ElementUI的Loading组件 —— 想实现在请求后台数据之前开启Loading组件,请求成功或失败之后,关闭Loading组件
我在实际项目开发中,遇到了这个需求,记录一下~~~~~~ 在ElementUI官网上有几种实现Loading的方法,但官网上是在一个方法里写了开启与关闭组件,所以可以根据官网的实现方法进行一个封装,便 ...
- vue 外卖app(3) 利用slot分发内容
1. 增加一个HeaderTop.vue <template> <header class="header"> <slot name="le ...
- Delphi txt文件读取及写入
简介:Delphi支持三种文件类型:文本文件.记录文件.无类型文件.文本文件的读... 在进行win32开发中对文件的读写是最常用的操作之一 Delphi 支持三种文件类型: 文本文件.记录文件 ...
- 基本算数定理快速求约数个数——lightoj1208
#include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 1000005 bool vi ...
- css Sticky footers
写在前面 做过网页开发的同学想必都遇到过这样尴尬的排版问题:在主体内容不足够多或者未完全加载出来之前,就会导致出现(图一)的这种情况,原因是因为没有足够的垂直空间使得页脚推到浏览器窗口最底部.但是,我 ...
- 转:这里有些sscanf()的一些使用说明,都是从论坛,Blog里整理出来的。供大家使用。
http://www.cnblogs.com/gmh915/archive/2009/09/30/1576995.html 这里有些sscanf()的一些使用说明,都是从论坛,Blog里整理出来的.供 ...
- Day15:Python 【模块】及__name__:
什么是模块: 在Python中,随着这代码的撰写,代码越来越长,所以产生了,模块这个概念,模块是什么?模块就是一个.py文件,在撰写代码时,我们把不同的功能的代码封装到一个.py文件里,用得时候导入 ...
- 本地 win7 与虚拟机Centos7 ping互通和Centos7 上网设置
VM 12 安装虚拟机我就不表示了 很简单网上找找 一 .虚拟机设置 1.修改使用了 VMWare 12 虚拟机,Oracle VM 用得有点晕 2.配置VM 的NET环境 3.在VMware虚拟机任 ...
- 天道神诀---DHCP服务(下篇)
DHCP作用域详解 subnet 定义一个作用域 netmask 定义作用域的掩码 range 允许发放的IP范围 option routers 指定网关地址 option domain-nam ...
- static/extern&const个人理解
//const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p) static NSString *const keyA = @"keyA"; static NSString ...