--------------------------------------------------------------------------------------
Blog: http://blog.csdn.net/chinagissoft
QQ群:16403743
宗旨:专注于"GIS+"前沿技术的研究与交流,将云计算技术、大数据技术、容器技术、物联网与GIS进行深度融合,探讨"GIS+"技术和行业解决方案
转载说明:文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
--------------------------------------------------------------------------------------
题记一般情况下,我们使用容器并不是前面提到的只是从在一个操作系统镜像里面操作,而是需要在里面安装一系列的软件,例如我们做一个网站需要部署apache,MySQL、PHP等,具体的操作应该是这样
1、下载一个Linux操作系统的镜像
2、在该OS里面安装apache
3、再安装MySQL
4、再安装PHP
...
如果有一个逻辑顺序可以支持批量自动化操作,岂不是一件非常方便的事。
Dockerfile就是做上述的事情,它支持一些常用的命令,例如支持类似于Linux Shell命令,可以实现将本地文件传入到Docker容器里面,然后进行解压缩,安装,设置相关命令,安装相关的操作系统软件包....
Dockerfile
•Docker通过对于在Dockerfile中的build命令顺序解析实现自动的Image构建
•通过源代码路径方式
•Dockerfile需要放置在项目的根目录位置
•在构建时,DockerClient会把整个context打包发送给Docker Server,然后由Server端负责builder镜像,构建成功会删除context目录。
•dockerbuild -t{image name}{项目路径}
•
•通过标准输入流方式
•client不会打包上传context目录,对add、copy等涉及本地文件复制的操作支持不够
•dockerbuild -t{image name}-<Dockerfile路径
关键字
那么DockerFile包括以下主要的关键字,每个关键字实现不同的功能需求
•FROM:基于哪个镜像
•RUN:安装软件用
•MAINTAINER:镜像创建者
•CMD:container启动时执行的命令
•ENTRYPOINT:container启动时执行的命令
•USER:选择用户运行container
•EXPOSE:container内部服务开启的端口
•ENV:用来设置环境变量
•ADD/COPY:用户宿主机与容器文件拷贝
•VOLUME:将本地文件夹挂载到container中。
•WORKDIR:切换目录
•ONBUILD:指定的命令在构建镜像时不执行,在它的子镜像中执行
示例
我们创建一个Dockerfile,目标就是为了部署一个基于Ubuntu14.04的iCloudManager容器,由于iCM需要安装一些操作系统软件包,所以我们的Dockerfile编写逻辑为:
1、USe一个操作系统镜像
2、将ICM安装包挂载到容器里
3、安装必要的OS软件包和许可
4、解压缩ICM
5、启动ICM服务
注意:我们使用了网络的主机模式,使用端口映射的方式,iCM的默认端口为8080
FROM ubuntu:14.04
ADD SuperMapiCloudManager7C/ /sm/iCloud/
RUN apt-get update
RUN sudo apt-get -y install libx11-dev
RUN sudo apt-get -y install xinit
RUN sudo apt-get -y install gcc
RUN sudo apt-get -y install libgomp1
RUN sudo apt-get -y install libxtst6
RUN sudo apt-get -y install libxi6
RUN sudo apt-get -y install libc6-i386
RUN sudo apt-get -y install lib32z1
RUN sudo apt-get -y install lib32ncurses5
RUN sudo apt-get -y install lib32bz2-1.0
RUN sudo apt-get -y install language-pack-zh-hans
.....省略.....
附带一个针对MySQL操作的Dockerfile
FROM ubuntu:14.04.3
MAINTAINER lishaohua <lishaohua@supermap.com>
RUN sed -i 's/archive.ubuntu.com/mirrors.163.com/' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y software-properties-common
RUN apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
RUN add-apt-repository 'deb http://mirror2.hs-esslingen.de/mariadb/repo/10.0/ubuntu precise main'
RUN apt-get install -y mariadb-server
RUN echo "[mysqld]" >/etc/mysql/conf.d/docker.cnf
RUN echo "bind-address = 0.0.0.0" >>/etc/mysql/conf.d/docker.cnf
RUN echo "innodb_flush_method = O_DSYNC" >>/etc/mysql/conf.d/docker.cnf
RUN echo "skip-name-resolve" >>/etc/mysql/conf.d/docker.cnf
RUN echo "init_file = /etc/mysql/init" >>/etc/mysql/conf.d/docker.cnf
RUN echo "GRANT ALL ON *.* TO sm@'%' IDENTIFIED BY 'sm';" >/etc/mysql/init
EXPOSE 3306
USER mysql
ENTRYPOINT mysqld