1、写在前面的话
学习整个docker的环境,网络,原理,而不是浅尝辄止的docekr run一个镜像,然后就装着自己很diao的样子
2、学习目的
- 1)进行容器的制作(商业级容器化制作,并不是简单的简单的类似docker tag),包括开发中直接对镜像进行编译生成,后期可能会结合Jenkins进行CI/CD集成
docker镜像制作的两种方法:docker commit + Dockerfile
- 2)学习使用dockerFile编写和使用,深入理解dockerfile的参数含义,结合自身的业务场景进行编写
- 3)学习使用supervisor(监视者),可以只保留一个前端容器(镜像不能以后台进程存在,会自耦当停掉),可以进行运行多个容器(可以扮演监视者的角色,当容器停止后,会自动重启):https://blog.csdn.net/bbwangj/article/details/81059730
3、学习内容
- 3.1)将容器变成镜像:docker commit <container> [repo:tag]
docker commit hjjhweq76231j58 myjava:1.1.1
- commit之后,再进行容器访问,容器内的修改就不会丢失了
- 但是【缺点不规范】
- 3.2)将容器变成镜像:Dockerfile
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/*
- 3.3)对容器编译的过程进行分析(基于Dockerfile)
可以看到所有的编译动作都是在进程容器中完成的,所以和当前的linux机器没有任何关系
- 进行验证1):因为文件hello.sh没有上传到容器内,所以执行报错
- 进行验证2):上传文件hello.sh到容器内,所以执行不报错
- 进行验证3):没有在容器内配置代理时,报错;配置后不报错
- 3.3)复杂案例实战:制作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
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
# 容器需要开放Tomcat 8080端口
EXPOSE 8080
# 设置Tomcat7初始化运行,SSH终端服务器作为后台运行
ENTRYPOINT service tomcat7 start && /usr/sbin/sshd -D
- 3.3)使用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"
4、镜像问题
1)ssh server是否应该包含到镜像里?
1)增加一个新的进程来管理容器并不是非常好的一个办法,2)ssh server本身室友配置的,root登录密码应该放在什么地方?上面的演示是放在镜像中(Dockerfile),如果密码泄露了,镜像要重新进行打包编译,类比mysql中的密码是通过环境变量传递进去的,也不是非常安全的
2)一个容器究竟运行几个程序?
一般是一个容器中启动一个程序,因为运行多个程序时,有程序死掉,容器是无法检测到的,docker只关注你的前台进程是否在运行
3)程序参数和配置文件的问题?
如果放在进行里面,程序的升级,运维就麻烦了,参数少可以写在Dockerfile中,如果参数多了该怎么办?如果参数变动,要重新进行镜像打包,有没有更好的方式
4)程序日志输出的问题?
等不能把容器的日志存放在容器以外的地方,更专业一点,进行网络磁盘挂载(可能就不再是本地文件目录了)
2)至此引发Docker的友好架构
网友评论