如何使用dockerfile构建mysql镜像

原文地址:http://blog.csdn.net/we_shell/article/details/
Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。Docker程序将读取Dockerfile,根据指令生成定制的image。相比image这种黑盒子,Dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明image是怎么产生的。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。
1. Dockerfile的书写规则及指令使用方法
Dockerfile的指令是忽略大小写的,建议使用大写,使用 # 作为注释,每一行只支持一条指令,每条指令可以携带多个参数。
Dockerfile的指令根据作用可以分为两种,构建指令和设置指令。构建指令用于构建image,其指定的操作不会在运行image的容器上执行;设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。
(1)FROM(指定基础image)
构建指令,必须指定且需要在Dockerfile其他指令的前面。后续的指令都依赖于该指令指定的image。FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库。
该指令有两种格式:
指定基础image为该image的最后修改的版本。或者:
指定基础image为该image的一个tag版本。
(2)MAINTAINER(用来指定镜像创建者信息)
构建指令,用于将image的制作者相关的信息写入到image中。当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。
格式:
(3)RUN(安装软件用)
构建指令,RUN可以运行任何被基础image支持的命令。如基础image选择了ubuntu,那么软件管理部分只能使用ubuntu的命令。
该指令有两种格式:
(4)CMD(设置container启动时执行的操作)
设置指令,用于container启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条。
该指令有三种格式:
当Dockerfile指定了ENTRYPOINT,那么使用下面的格式:
ENTRYPOINT指定的是一个可执行的脚本或者程序的路径,该指定的脚本或者程序将会以param1和param2作为参数执行。所以如果CMD指令使用上面的形式,那么Dockerfile中必须要有配套的ENTRYPOINT。
(5)ENTRYPOINT(设置container启动时执行的操作)
设置指令,指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效。
两种格式:
该指令的使用分为两种情况,一种是独自使用,另一种和CMD指令配合使用。
当独自使用时,如果你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效。
另一种用法和CMD指令配合使用来指定ENTRYPOINT的默认参数,这时CMD指令不是一个完整的可执行命令,仅仅是参数部分;ENTRYPOINT指令只能使用JSON方式指定执行命令,而不能指定参数。
(6)USER(设置container容器的用户)
设置指令,设置启动容器的用户,默认是root用户。
(7)EXPOSE(指定容器需要映射到宿主机器的端口)
设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。
格式:
端口映射是docker比较重要的一个功能,原因在于我们每次运行容器的时候容器的IP地址不能指定而是在桥接网卡的地址范围内随机生成的。宿主机器的IP地址是固定的,我们可以将容器的端口的映射到宿主机器上的一个端口,免去每次访问容器中的某个服务时都要查看容器的IP的地址。对于一个运行的容器,可以使用docker port加上容器中需要映射的端口和容器的ID来查看该端口号在宿主机器上的映射端口。
(8)ENV(用于设置环境变量)
构建指令,在image中设置一个环境变量。
格式:
设置了后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环境变量,也可以通过在docker run --env key=value时设置或修改环境变量。
假如你安装了JAVA程序,需要设置JAVA_HOME,那么可以在Dockerfile中这样写:
ENV JAVA_HOME /path/to/java/dirent
(9)ADD(从src复制文件到container的dest路径)
构建指令,所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0;如果是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;如果文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);如果&src&是文件且&dest&中不使用斜杠结束,则会将&dest&视为文件,&src&的内容会写入&dest&;如果&src&是文件且&dest&中使用斜杠结束,则会&src&文件拷贝到&dest&目录下。
格式:
&src& 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件
&dest& 是container中的绝对路径
(10)VOLUME(指定挂载点))
设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。
格式:
运行通过该Dockerfile生成image的容器,/tmp/data目录中的数据在容器关闭后,里面的数据还存在。例如另一个容器也有持久化数据的需求,且想使用上面容器共享的/tmp/data目录,那么可以运行下面的命令启动一个容器:
container1为第一个容器的ID,image2为第二个容器运行image的名字。
(11)WORKDIR(切换目录)
设置指令,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效。
格式:
(12)ONBUILD(在子镜像中执行)
ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行。
详细资料可参考
2. 创建Dockerfile,构建jdk+tomcat环境
Dockerfile文件
tomcat7.sh
我已经把这些文件上传到了Github
3. 构建镜像
脚本写好了,需要转换成镜像:
默认情况下,tomcat会占用8080端口,刚才在启动container的时候,指定了 -p ,映射到宿主机端口就是8090。
http://&host&:8090&host为主机IP
Docker - Reference - Dockerfile
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4772次
排名:千里之外
原创:16篇
转载:18篇
(1)(1)(5)(5)(1)(2)(8)(1)(3)(6)(1)主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
知道+做到=得到Docker创建镜像两种方法详解_网页漂亮网
您的位置: >
Docker创建镜像两种方法详解
字号:[ & & & & & &
&Docker创建镜像
&&&&&&&&&&& 最近学习Docker 的知识,偶然在网上看到关于Docker 创建对象的两种方法很好,这里记录下,也许可以帮助到你。
&我们都知道Docker中我们是基于镜像来运行的容器,那如何创建镜像呢?创建镜像有两种方法,一是使用docker commit命令,二是使用docker build命令和Dockerfile文件。这里我们说的创建镜像是指基于一个已有的基础镜像比如ubuntu等,而不是从零创建一个全新的镜像。
&&&&&&& 下面分别简单介绍一下两种方法。&
&&&&&&& 第一种,使用docker commit创建。
&&&&&&& 首先我们可以先运行一个容器:
sudo docker run -i-t ubuntu /bin/bash
&&&&&&& 然后我们可以在这个容器中进行修改,比如安装一些软件或者搭建一些环境等:
apt-get install gcc
&&&&&&& 最后我们提交这些修改并创建镜像:
sudo dockercommit 4aa578389 buffoon/gcc
&&&&&& 这里4aa578389是修改过的容器的ID,buffoon/gcc是目标镜像仓库和镜像名。我们也可以在commit时候使用一些参数来扩充更多信息。比如:
sudo dockercommit -m&A new image with gcc& -a&buffoon& 4aa578389 buf/gcc:mm
&&&&&&& 上面-m选项指定了镜像的提交信息,-a选项标注了作者信息,最后的:mm是标签。
&&&&&&& 我们可以sudo dockerimages buffoon/gcc& 来查看新创建的镜像有没有成功。要查看镜像的详细信息,可以sudo docker inspect buf/gcc:mm 。&
&&&&&&& 第二种,使用docker build命令和Dockerfile文件创建。
&&&&&&& 首先我们先创建一个空目录,作为构建环境,即Docker中的构建上下文:
&&&&&&& 然后我们在该目录中创建一个Dockerfile文件:
vim Dockerfile
&&&&&&& 在文件中编辑:
#Version: 0.0.1
FROM ubuntu:latest
MAINTAINERbuffoon
RUN apt-getinstall gcc
&&&&&&& 这个文件中,FROM 必须作为第一条指令,是指定基础镜像;MAINTAINER指令指明作者的一些信息;RUN 指明了镜像运行时要执行的命令。
&&&&&&& 然后我们就可以进入到构建上下文中并执行创建:
sudo dockerbuild -t=&buffoon/gcc:v1& .
//注意最后一个点号
&&&&&&& -t指定仓库镜像标签,最后的点号是表明从当前路径中寻找Dockerfile文件。&
&&&&&&& Dockerfile中的指令有很多,这里就不一一介绍了,具体的指令请见:/engine/reference/builder/
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
本文移动端链接:
相关阅读:
本站已经安全运行:
创建百年品牌风穴眼 的BLOG
用户名:风穴眼
文章数:44
访问量:5161
注册日期:
阅读量:5863
阅读量:12276
阅读量:404608
阅读量:1093443
51CTO推荐博文
要创建自己的Docker镜像,最好的方法是使用Dockerfile文件,在使用过程中,由于国内的网络环境的问题,创建镜像的过程中可能因为需要下载的软件不能及时获得,可能造成创建的镜像出错。为解决这个问题,在编写Dockerfile时,可以通过RUN指令,把软件源的地址换成国内的,虽然这样做有人说做成功了,但我在测试时没有成功,所以我的建议是通过进入容器,手动下载需要的软件,这样能够避免出现这样的错误。软件下载安装好后,再把该容器commit成一个镜像,再写Dockerfile文件,写入需要做的配置,再build出新的镜像。下面是我在ubuntu14.04server下安装好openssh-server后,编写的Dockerfile。#This is a testFROM mysshdMAINTAINER mayue_userUSER rootRUN mkdir -p /var/run/sshd#这里非常重要,一定要加上,因为在启动sshd时脚步会检测有无该目录,没有的话该镜像就不能随启动而启动sshRUN echo "root:111111"|chpasswdRUN sed -i s/without-password/yes/ /etc/ssh/sshd_configENTRYPOINT /usr/sbin/sshd -DEXPOSE 22使用docker build -t myssh .命令即可创建myssh镜像。使用docker run -d -p 22 myssh即可运行该容器。
了这篇文章
类别:未分类┆阅读(0)┆评论(0)创建Dockerfile(以mysql 5.7为例)
可以从上下载官方Dockerfile,以及docker-entrypoint.sh
具体内容太长,还是在Docker Hub上看的吧
进入到Dockerfile目录,执行下面的命令:
docker build -t mysql .
注意后面的的点,表示在当前目录。
创建完之后,就可以通过docker images,看到刚创建的镜像了。
这里可以看到生成了两个镜像,一个是mysql的,一个是基础镜像:debian,
docker run --name mymysql -d mysql:latest \
-v $PWD/f:/etc/f -v $PWD/logs:/logs -v $PWD/data:/mysql_data \
& -e MYSQL_ROOT_PASSWORD=123456
再通过docker ps,就可以看到刚刚生成的容器:
参数说明:
-p :将容器的3306端口映射到主机的3306端口。
-v $PWD/f:/etc/f:将主机当前目录下的 f挂载到容器
-v $PWD/logs:/logs:将主机当前目录下的logs目录挂载到容器的/logs
-v $PWD/data:/mysql_data:将主机当前目录下的data目录挂载到容器的/mysql_data
-e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码
执行命令docker exec -it mymysql /bin/bash进入容器。
显示的主机名即为容器ID:
docker exec参数说明:
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开 (小白不懂啥意思,貌似就是可交互的意思)
-t :分配一个伪终端(tty)
期间遇到的问题
生成容器的过程中总是报RPC错误
docker: Error response from daemon: rpc error: code = 2 desc = "oci runtime error: could not synchronise with container process: not a directory".
我网上查了一下,说是32位系统不兼容的问题,但是我装的是64位系统。我看是目录问题,就把docker run的-p参数去掉执行,还是报错,不过变成了docker: Error response from daemon: Container command 'docker-entrypoint.sh' not found or does not exist..,找不到docker-entrypoint.sh文件,网上查也没有找到答案。折腾了好久,才发现我的docker-entrypoint.sh没有可执行权限,于是,就chmod -x docker-entrypoint.sh,可是不知道为啥docker-entrypoint.sh还是不可执行,就直接执行了 chmod 777 docker-entrypoint.sh,终于可以了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:737次
排名:千里之外
(1)(4)(1)(2)

我要回帖

更多关于 maven 构建docker镜像 的文章

 

随机推荐