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 ...
随机推荐
- curl命令测试服务器是否支持断点续传
通过curl命令测试服务器是否支持断点续传 curl -i --range 0-9 http://www.baidu.com/img/bdlogo.gif HTTP/1.1 206 Partial ...
- bean创建
看<spring源码解析>的笔记 1.通过@Bean创建bean,类上需要添加@Configuration @Configuration public class MainConfig { ...
- 三种Spring加载机制
方法一. 在main方法中启动Spring ApplicationContext ac = new XmlApplicationContext("applicationContext.xml ...
- vue在v-for循环中绑定v-model
原始示例 <div v-for="item in items"> <input type="text" v-model="'good ...
- 如何在Windows10操作系统下安装superset步骤分享
superset是一个轻量级自助式BI框架,以优雅的界面和根据数据表动态生成数据为主要特点. 一. 环境 windows 10 64位 Python 3.7 二. 安装步骤 安装Python 建议安装 ...
- 线程池 一 ScheduledThreadPoolExecutor
java.util.concurrent public class ScheduledThreadPoolExecutor extends ThreadPoolExecutor implements ...
- bzoj1010题解
[解题思路] 设s[i]=i+∑c[j](j∈[1,n]∩N) 易得转移方程f[i]=min{f[j]+(s[i]-s[j]-L-1)2},朴素算法复杂度O(n2). 考虑斜率优化:记T[i]=s[i ...
- Kafka高级API和低级API
Kafka消费过程分析 kafka提供了两套consumer API:高级Consumer API和低级API. 1 高级API 1)高级API优点 高级API 写起来简单 不需要去自行去管理offs ...
- NX二次开发-UF_MODL_ask_angle_tolerance获取建模的角度公差
NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_ui.h> UF_initialize() ...
- day26-多态、封装、反射
#!/usr/bin/env python # -*- coding:utf-8 -*- # ----------------------------------------------------- ...