Docker教程:镜像构建和自动镜像构建dockerfile
http://blog.csdn.net/pipisorry/article/details/50805379
Docker透过Dockerfile来记录建立Container映象文件的每一个步骤,可以将建立应用程序执行环境的过程和配置参数,完整地记录下来。开发人员和维运人员之间可以利用Dockerfile来沟通对执行环境的讨论。甚至结合版本控制服务如GitHub,可以让Dockerfile具备版本控制功能,能将基础架构程序化(Infrastructure as code)来管理。
构建自定义的镜像
Docker能自动创建镜像,构建自定义的镜像,有两种方法:
1、使用docker commit 命令
关于commit命令,其实就是使用docker run -i -t XXX /bin/bash 进入容器的交互界面,进行各种操作后,再将这个容器通过提交命令提交上去来达到目的。
$docker ps -l命令获得安装完命令之后容器的id如698***
$docker commit 698 pika/py_ubuntu #把这个容器保存为镜像py_ubuntu
2、使用Dockerfile
这里介绍dockerfile方法,因为使用Dockerfile构建拥有比提交命令更高的灵活性和可维护性。
易于自动化的命令:
Dockerfile包含创建镜像所需要的全部指令。基于在Dockerfile中的指令,我们可以使用Docker build命令来创建镜像。通过减少镜像和容器的创建过程来简化部署。
Dockerfile支持的语法命令如下:INSTRUCTION argument。指令不区分大小写。但是,命名约定为全部大写。在文本文件或Dockerfile文件中这些命令的顺序就是它们被执行的顺序。
Dockerfile命令
如果一个镜像存在相同的父镜像和指令(除了ADD),Docker将会使用镜像而不是执行该指令,即缓存。为了有效地利用缓存,你需要保持你的Dockerfile一致,并且尽量在末尾修改。
使用 # 作为注释,但是lz试过,注释很多时候必须单独成行,否则如果接在目录后面,会出现No
such file or directory报错。
所有Dockerfile都必须以FROM命令开始。
FROM命令会指定镜像基于哪个基础镜像创建,接下来的命令也会基于这个基础镜像(CentOS和Ubuntu有些命令可是不一样的)。FROM命令可以多次使用,表示会创建多个镜像。
具体语法如下:FROM <image name> 或者:FROM
<image>:<tag>
1. MAINTAINER:用来指定维护者的姓名和联系方式。MAINTAINER <author name>
更改MAINTAINER指令会使Docker强制执行RUN指令来更新apt,而不是使用缓存。
2. RUN:在shell或者exec的环境下执行的命令。RUN指令会在新创建的镜像上添加新的层面,接下来提交的结果用在Dockerfile的下一条指令中。每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行。也就是说RUN命令会在上面FROM指定的镜像里执行任何命令,然后提交(commit)结果,提交的镜像会在后面继续用到。
RUN命令等价于:
docker run image command docker commit container_id
格式为 RUN <command> 或 RUN
["executable", "param1", "param2"]。
前者将在shell终端中运行命令,即 /bin/sh -c ;后者则使用 exec 执行。指定使用其它终端可以通过第二种方式实现,例如 RUN
["/bin/bash", "-c", "echo hello"] 。
3. ADD:复制文件指令。它有两个参数<source>和<destination>。
语法如下:ADD 《src》 《destination》
<src> 是相对被构建的源目录的相对路径!,可以是文件或目录的路径,也可以是一个远程的文件url。<dest> 是container中的绝对路径
4. CMD:提供了容器默认的执行命令。 Dockerfile只允许使用一次CMD指令。多个只有最后一个指令生效。
支持三种格式
CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;
5. EXPOSE:指定容器在运行时监听的端口。
语法如下:EXPOSE <port> [<port>...]
比如memcached使用端口 11211,可以把这个端口暴露在外,这样容器外可以看到这个端口并与其通信。
Note: <port>后面不能接空格或者注释什么的,否则会报错:EXPOSE 22 INFO[1063] Invalid containerPort:
Docker的核心概念是可重复和可移植。镜像应该可以运行在任何主机上并且运行尽可能多的次数。
在Dockerfile中你有能力映射私有和公有端口,但是你永远不要通过Dockerfile映射公有端口。通过映射公有端口到主机上,你将只能运行一个容器化应用程序实例。(运行多个端口不就冲突啦)
#private and public mapping
EXPOSE 80:8080
#private only
EXPOSE 80
如果镜像的使用者关心容器公有映射了哪个公有端口,他们可以在运行镜像时通过-p参数设置,否则,Docker会自动为容器分配端口。
切勿在Dockerfile映射公有端口。
[计算机端口]
6. ENTRYPOINT:配置给容器一个可执行的命令,这意味着在每次使用镜像创建容器时一个特定的应用程序可以被设置为默认程序。同时也意味着该镜像每次被调用时仅能运行指定的应用。类似于CMD,Docker只允许一个ENTRYPOINT,多个ENTRYPOINT会抵消之前所有的指令,只执行最后的ENTRYPOINT指令。
ENTRYPOINT 命令设置在容器启动时执行命令,也就是配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
# cat Dockerfile
FROM ubuntu
ENTRYPOINT echo "Welcome!"
# docker run 62fda5e450d5
Welcome!
两种语法格式,一种就是上面的(shell方式):ENTRYPOINT cmd param1 param2 ...
第二种是 exec 格式:ENTRYPOINT ["cmd", "param1", "param2"...]
USER 命令:镜像正在运行时设置一个UID。语法如下:USER <uid>
比如指定 memcached 的运行用户,可以使用上面的 ENTRYPOINT 来实现:ENTRYPOINT ["memcached", "-u", "daemon"]
更好的方式是:
ENTRYPOINT ["memcached"]
USER daemon
ENTRYPOINT echo这个运行时一直调用不出bash命令,显示过后就退出了,不知道为嘛?所以lz在dockerfile中注释了这一句。
7. WORKDIR:指定RUN、CMD与ENTRYPOINT命令的工作目录。语法如下:WORKDIR /path/to/workdir
8. ENV:设置环境变量。它们使用键值对,增加运行程序的灵活性。
语法如下:ENV <key> <value>
设置了后,后续的RUN命令都可以使用
使用此dockerfile生成的image新建container,可以通过 docker inspect 看到这个环境变量:
root@pika:~# docker inspect 49bfc7a9817f
也可以通过在docker run时设置或修改环境变量:
docker run -i -t --env name="pi" ubuntu:newtest /bin/bash
9. VOLUME:授权访问从容器内到主机上的目录。用于containers之间共享数据
语法如下:VOLUME ["/data"]
Dockerfile示例
/media/pi/files/mine/python_workspace/DockerEnv/dockerfile
#python3 development environment
FROM ubuntu:14.04
MAINTAINER pi "pipisorry@126.com"
#ENTRYPOINT echo "python3 development environment\n"
# 更新源,原生ubuntu镜像中的下载源速度太慢,然而下面这个源并不是最新的,居然没有python3-pip!!!
#RUN echo "deb http://mirrors.163.com/ubuntu precise main universe" > /etc/apt/sources.list
#RUN echo "deb http://mirrors.163.com/ubuntu/ precise main restricted universe multiverse" > /etc/apt/sources.list
RUN apt-get update
#安装ssh server进行远程操控
RUN apt-get install -y openssh-server
RUN mkdir /var/run/sshd
# 设置root ssh远程登录密码
RUN echo "root:249784435" | chpasswd
# 容器需要开放SSH 22端口,以使外部能够访问容器内部
EXPOSE 22
#常用安装
#软件冲突,要先将vim-common卸载,再装vim
RUN apt-get remove -y vim-common
RUN apt-get install -y vim
RUN apt-get install -y git
RUN apt-get install -y wget
#安装python3开发环境
RUN apt-get install -y python3
RUN apt-get install -y python3-pip
RUN ln -sf /usr/bin/python3.4 /usr/bin/python
RUN ln -sf /usr/bin/pip3 /usr/bin/pip
#apt-get安装python3拓展包(有的包pip安装会出错)
RUN apt-get install -y python3-numpy
RUN apt-get install -y python3-scipy
#extra packages installed : python3-six ... + python3-numpy
RUN apt-get install -y python3-matplotlib
#extra packages installed : python3-dateutil python3-nose python3-pil python3-pyparsing python3-tk python3-pytz python3-tornado ... + python3-numpy
RUN apt-get install -y python3-pandas
RUN apt-get install -y mysql-server mysql-client
#pip安装python3拓展包(有的只能pip安装)
ADD requirements.txt /tmp/requirements.txt
RUN pip3 install -r /tmp/requirements.txt
[python_webapp/blob/master/Dockerfile]
构建自定义ubuntu镜像
使用Dockerfile构建镜像命令
docker build [options] PATH | URL
额外选项,如:
--rm=true表示构建成功后,移除所有中间容器
--no-cache=false表示在构建过程中不使用缓存
-t 给该镜像赋予一个tag,用以将来的调用与搜索
. 表示调用当前目录的Dockerfile
$cd /media/pi/files/mine/python_workspace/DockerEnv
$docker build -t py-ubuntu .
之后可以通过用"docker images"命令查看镜像
最佳实践:注意事项
当构建镜像时使用可理解的标签,以便更好地管理镜像;
避免在Dockerfile中映射公有端口;
CMD与ENTRYPOINT命令请使用数组语法。
在使用apt-get安装软件时,需要加上"-y"的参数,如果不指定-y参数的话,apt-get命令会进入交互模式,需要用户输入命令来进行确认,但在docker环境中是无法响应这种交互的。所以就会造成安装中断这种问题。
如果安装了ssh,chpasswd方法给ssh添加root用户登录密码为123456。"chpasswd"可以批量的为ssh添加以"username:passwd"为格式的用户与密码。可以将username:passwd批量的写在一个txt文件中,然后使用xxx.txt chpasswd方法为ssh批量添加用户。
from: http://blog.csdn.net/pipisorry/article/details/50805379
ref:Docker 4 -- 总结
Docker教程:镜像构建和自动镜像构建dockerfile的更多相关文章
- Spring Boot教程(十一) springboot程序构建一个docker镜像
准备工作 环境: linux环境或mac,不要用windows jdk 8 maven 3.0 docker 对docker一无所知的看docker教程. 创建一个springboot工程 引入web ...
- Docker Buildx使用教程:使用Buildx构建多平台镜像
写在前边 记录一下前阵子在X86_64平台使用Docker Buildx构建多平台镜像的办法,包含但不限于构建ARM镜像. 构建环境 软件名 版本 Ubuntu 18.04.2 LTS Docker ...
- Docker使用Dockerfile构建新的镜像
构建镜像步骤; 1.创建Dockerfile文件,该文件是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. vim Dockerfile //每一个指令都会在镜像上创建一个新 ...
- Docker 使用 Dockerfile 构建自己的镜像
可以使用Dockerfile的配置文件方式进行构建自己的镜像 下面利用docker构建一个Caddy web服务器 构建脚本 Dockerfile有自己的命令,下面使用了一些比较常用的命令,更多的Do ...
- 使用Docker构建jdk1.8镜像
一.下载centos镜像 下载自己需要的版本TAG,详见: docker安装指定版本TAG的镜像 $ sudo docker pull centos:centos7 二.下载jdk1.8,并上传到/u ...
- Ubuntu18.04安装Docker并部署(编译、发布、构建镜像)Asp.NetCore项目全过程笔记
环境准备:阿里云Ubuntu18.04 全新安装 一.安装Docker 1.删除旧版本并更新包索引: sudo apt-get remove docker docker-engine dock ...
- docker通过dockerfile构建JDK最小镜像,Docker导出导入镜像
docker通过dockerfile构建JDK最小镜像,Docker导出导入镜像 一.docker通过dockerfile构建JDK最小镜像 1.1 下载JRE 1.2 解压JRE,删除相关不需要文件 ...
- docker: 构建自己的镜像
我们给予ubuntu的镜像然后拷贝python的requirement.txt文件进去,再根据这个文件安装对应的python库 拷贝文件到docker容器.首先查找对应的容器ID.然后执行命令 doc ...
- 使用Docker构建基于centos7镜像的python环境
Dcokerfile配置信息 ############################################## # 基于centos7构建python3运行环境 # 构建命令: 在Dock ...
随机推荐
- MySql查询不区分大小写解决方案(两种)
当我们输入不管大小写都能查询到数据,例如:输入 aaa 或者aaA ,AAA都能查询同样的结果,说明查询条件对大小写不敏感. 解决方案一: 于是怀疑Mysql的问题.做个实验:直接使用客户端用sql查 ...
- 谷歌Chrome浏览器之No Sandbox
想着还是要把这个分享出来,前两天,早上过来,Chrome打开后,输入网址回车,毫无反应,不加载,不跳转,打不开浏览器设置.总之就是除了能打开Chrome浏览器,不能进行任何其他操作,关闭重开也是这样 ...
- 9.QT-标准对话框
Qt提供的可复用的标准对话框,全部继承自QDialog类,如下图所示: QMessageBox:信息对话框,用于显示信息.询问问题等: QFileDialog:文件对话框 QColorDialog:颜 ...
- log4j的终极封装
通用型(再也不用每个类new一个logger了) public class Log { private static Map<String,Logger> loggerMap = new ...
- 利用 Win32 启动和检测 UWP App 的方法
一种启动和检测 UWP 应用的方法 背景 我们发布过多款 UWP 平台的同类型 App ,最近有一个需求:用传统 Win32 程序启动我们的 UWP 程序.因为我们的每一个UWP App在客户机器上都 ...
- android 欢迎界面的制作
再打开手机app的时候,最先映入我们眼帘的是一个覆盖手机全屏的欢迎界面,在这个界面显示出来的时候整个手机屏幕只会显示这一个界面,上面的标题栏,以及手机最顶端的状态栏都会消失,只有欢迎页面结束跳转到其他 ...
- ubuntu安装fat32和exfat文件系统支持
vftp(fat32) apt install -y dosfstools exfat apt install -y exfat-fuse exfat-utils
- MySQL系列教程(四)
文件打开数(open_files) 我们现在处理MySQL故障时,发现当Open_files大于open_files_limit值时,MySQL数据库就会发生卡住的现象,导致Nginx服务器打不开相应 ...
- JDK、JRE和JVM的关系
JDK中包含了JRE,JRE中包含了JVM. 详解: JDK是JAVA的核心,包括JRE(JAVA 虚拟环境).编译器等,JDK的主流产品是由SUN公司开发的,JDK本身是用JAVA编写的,安装包的S ...
- log4j日志记录级别是如何工作?
级别p的级别使用q,在记录日志请求时,如果p>=q启用.这条规则是log4j的核心.它假设级别是有序的.对于标准级别它们关系如下:ALL < DEBUG < INFO < WA ...