docker学习笔记3
第三周笔记:
将容器制作成镜像
docker commit <container> [repo:tag]
当我们在制作自己的镜像的时候,会在container中安装一些工具、修改配置,如果不做commit保存起来,那么container停止以后再启动,这些更改就消失了


这种制作镜像的方式的优点是方便,快速。缺点:不规范和无法自动规范,因为是依赖于某个镜像和docker生命周期规范相悖。一般在本地开发测试时使用
规划建镜像是通过buildfile文件来创建
Buildfile语法和案例
一个java镜像的buildfile
FROM nimmis/ubuntu:14.04 (基础镜像)
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/* (删除安装包)
vi Dockerfile
docker build –t leader/java .
run这些命令都是在内部编译环境的中间容器中执行的,例如在在创建镜像时为什么能在centos系统上能够执行apt-get命令,因为是在中间的容器中执行的,跟宿主机无关。

Buildfile案例


如下截图:开始访问不成功,后来访问成功的原因是虽然在宿主机设置了代理,但是在容器内没有设置。解决办法:使用环境变量传参添加代理之后,访问成功。

制作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 (修改root密码)
# 添加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端口
EXPOSE 22 (expose表示容器中要开放一个端口,这个值的多少,是自己写的,跟程序是否监听22端口无关。)
# 容器需要开放Tomcat 8080端口
EXPOSE 8080
# 设置Tomcat7初始化运行,SSH终端服务器作为后台运行
ENTRYPOINT service tomcat7 start && /usr/sbin/sshd –D (告诉镜像要启动什么指令,需要注意的是指令必须要在前台运行)
单个docker启动多个进程
一般情况下一个docker只运行一个进程,但是有些情况需要启动多个进程,此时需要用到supervisor进程。
Using Supervisor with Docker
supervisord.conf
[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D
[program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
镜像制作中的常见问题
Ssh server是否应该包含到镜像里?(K8S 独立了鉴权基础模块)一个容器究竟运行几个程序?程序参数和配置文件的问题(开发设计相关,程序的参数和配置参数如果放在镜像中,升级会出现问题。如果不放在镜像中,那么需要放在哪?目前是放在环境变量中,但是一旦参数多了,这种方式也不可用,这个是docker设计的问题)?程序日志输出的问题(这也是docker系统架构下的程序设计问题,解决办法:日志通过value的方式绑定到本地磁盘输出来,另外也可以通过端口写入的方式,比如syslog等)?
Docker友好程序架构
Etcd也是zookeeper的升级,本质上是keepvalue数据存储结构。Dockers image把配置和参数相关的放在Etcd中,container运行时从etcd中获取


浙公网安备 33010602011771号