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中获取

 

posted @ 2019-02-21 13:34  日拱一卒,聚沙成塔  阅读(5)  评论(0)    收藏  举报