一直以来的开发流程都是先从Docker Hub中获取到基础镜像,之后在这个镜像的基础上做开发,以满足一定的需求或者提供某种服务,并由此产生新的镜像,然后就可以push到Docker Hub中。
那么究竟如何在制作自己的的Docker镜像的?
本次,我会介绍Dockerfile的基本知识语法,带大家构建一个自己的镜像。
二、Dockerfile简介 2.1 先看一个简单例子Dockerfile的注释都是以“#”开始的,每一行都是一个指令,一般情况下,Dockerfile由4个部分组成:基础镜像信息,维护者信息,镜像操作指令和容器启动指令。例如:
# Version 0.1
# 基础镜像
FROM Ubuntu:latest
# 维护者信息
MAINTAINER zhangyongli
# 镜像操作命令
RUN apt-get -yqq update && apt-get install -yqq apache2 && apt-get clean
# 容器启动命令
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
注意:如果是使用Dockerfile来构建镜像,Dockerfile第一条有效指令(注释除外),必须是基础镜像指令,维护者信息紧随其后。下面具体介绍下其指令。
2.2 Dockerfile指令 2.2.1 FROM指令指定即将制作的镜像,继承哪位镜像。
格式:FROM <image> 或 FROM <image>:<tag>
2.2.2 MAINTAINER指令
指定维护者信息
格式:MAINTAINER <name>
2.2.3 RUN指令
执行shell命令的,当解析Dockerfile时,遇到RUN指令,将自动翻译为/bin/sh -c “xxxx”
格式:RUN <command>
2.3.4 CMD指令
指启动容器时执行的命令,每个Dockerfile只能有一条CMD指令,如果指定了多条CMD,只有最后一条会被执行。
格式:1. CMD command param1 param2
2. CMD [“executable”,”param1”,”param2”]
3. CMD [“param1”,”param2”]
(特别说明,如果用户启动容器时制订了运行的命令,则会覆盖掉CMD指定的指令)
2.3.5 ENV指令指定一个环境变量,会被后续的RUN指令使用,并在容器运行时保持。
ENV <key> <value>
2.3.6 ADD指令
复制指定<src>到容器中的<dest>中,可以是Dockerfile所在目录的一个相对路径,也可以是一个URL,还可以是一个tar文件(自动解压为目录)
ADD <src> <dest>
2.3.7 COPY指令
复制本地主机<src>到容器中的<dest>中,当使用本地目录为源目录时,推荐使用
COPY <src> <dest>
三、Docker镜像制作 3.1 编写Dockerfile文件
新建一个Dockerfile文件,里面填写上之前简单例子所包含内容
vi Dockerfile
文件内容如下:
# Version 0.1
# 基础镜像
FROM ubuntu:latest
# 维护者信息
MAINTAINER zhangyongli
# 镜像操作命令
RUN apt-get -yqq update && apt-get install -yqq apache2 && apt-get clean
# 容器启动命令
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
3.2 制作镜像
进入Dockerfile目录,执行
docker build -t 镜像名称:tag标识 .
当执行一步步执行完成后,出现Successfully built 时,则表示创建镜像成功。
3.3 验证输入命令:
docker run -d -p 80:80 --name webtest myiserver:v1
然后浏览器访问80端口 即可看到apache2 默认页面。
四、进阶 4.1 准备工作将iServer 811安装包,放到/opt/docker_images下。
4.2 使用国内源当前目录下,
vi sources.list_aliyun
添加以下内容:
deb trusty main restricted
deb-src trusty main restricted
deb trusty-updates main restricted
deb-src trusty-updates main restricted
deb trusty universe
deb-src trusty universe
deb trusty-updates universe
deb-src trusty-updates universe
deb trusty multiverse
deb-src trusty multiverse
deb trusty-updates multiverse
deb-src trusty-updates multiverse
deb trusty-backports main restricted universe multiverse
deb-src trusty-backports main restricted universe multiverse
deb trusty-security main restricted
deb-src trusty-security main restricted
deb trusty-security universe
deb-src trusty-security universe
deb trusty-security multiverse
deb-src trusty-security multiverse
# deb cdrom:[Ubuntu-Server 14.04 LTS _Trusty Tahr_ - Release amd64 (20140416.2)]/ trusty main restricted
#deb cdrom:[Ubuntu-Server 14.04 LTS _Trusty Tahr_ - Release amd64 (20140416.2)]/ trusty main restricted
4.3 编写shell脚本(配置许可)
建议提前先解压一个tar包,用于确认目录和名称,
当前目录下执行
vi run.sh
添加以下内容:
# 初始化许可驱动
cd /opt/supermap_iserver_8.1.1a_linux64_deploy/support/SuperMap_License/Support/aksusbd-2.4.1-i386
./dunst
./dinst
echo
# 运行iServer
cd /opt/supermap_iserver_8.1.1a_linux64_deploy/bin
./catalina.sh run
4.4编写iServer Dockerfile
当前目录下执行
vi Dockerfile
添加以下内容:
FROM ubuntu:14.04
MAINTAINER zhangyongli
ENV ISERVER_VERSION 8.1.1
ENV iServer true
# 国内的Ubuntu镜像源
ADD sources.list_aliyun /etc/apt/sources.list
# 安装iServer产品包
ADD supermap_iserver_8.1.1a_linux64_deploy.tar.gz /opt/
# 安装依赖库
RUN cd /opt/supermap_iserver_8.1.1a_linux64_deploy/support && \
./dependencies_check_and_install.sh install -yu && \
echo
RUN apt-get update
RUN cd /opt/supermap_iserver_8.1.1a_linux64_deploy/support/SuperMap_License/Support && \
tar xvf aksusbd-2.4.1-i386.tar && \
echo
ADD run.sh /opt/
RUN chmod 777 /opt/run.sh
# Container启动时立即运行iServer
CMD /opt/run.sh
4.5 最终目录内容 4.6 制作镜像
docker build -t supermap/iserver:c811a
4.7 创建容器
docker run --name iserver1 -p 8090:8090 -d supermap/iserver:c811a
然后使用 IP:8090访问即可。
更多Docker相关教程见以下内容: