dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币13236枚
  • 威望5838点
  • 银元150个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
阅读:2135回复:1

使用 dockerfile 创建镜像

楼主#
更多 发布于:2016-03-15 14:48
dockerfile 的作用?

图片:150720214578651.png


1. docker 通过读取 dockerfile文件中的指令,自动执行步骤并且创建一个新的镜像。
2. 执行 docker build 命令,它会按照文档执行并最终创建一个镜像。


举个栗子:使用dockerfile 创建镜像,并以此镜像运行容器.
镜像资源中创建一个镜像,在你的根目录下创建一个描述文件叫做Dockerfile,这个将描述你创建镜像的步骤.

1. 创建Dockerfile
cat Dockerfile
# loan-bms
#
# VERSION               0.1

FROM    openjdk:8-jre
MAINTAINER    dongnan <http://zongming.net>

# apt
ADD conf/sources.list /etc/apt/sources.list

# env
ENV TZ=Asia/Shanghai
ENV LANG C.UTF-8

# jar package
ADD src/loan-bms.jar /root/loan-bms.jar

# workdir
WORKDIR /root/

# run
CMD ["java","-jar","/root/loan-bms.jar"]

2. 使用 dockerfile 创建镜像
docker build -t my-image .
Sending build context to Docker daemon 2.048 kB
省略....
 ---> cd34135ed904
Removing intermediate container da61766d2676
Successfully built cd34135ed904

3. 验证
#运行容器
docker run -tid --name test my-image

4. 帮助
docker build --help
Usage:    docker build [OPTIONS] PATH | URL | -

Build an image from a Dockerfile

  --build-arg=[]                  Set build-time variables
  --cpu-shares=0                  CPU shares (relative weight)
  --cgroup-parent=                Optional parent cgroup for the container
  --cpu-period=0                  Limit the CPU CFS (Completely Fair Scheduler) period
  --cpu-quota=0                   Limit the CPU CFS (Completely Fair Scheduler) quota
  --cpuset-cpus=                  CPUs in which to allow execution (0-3, 0,1)
  --cpuset-mems=                  MEMs in which to allow execution (0-3, 0,1)
  --disable-content-trust=true    Skip image verification
  -f, --file=                     Name of the Dockerfile (Default is 'PATH/Dockerfile')
  --force-rm=false                Always remove intermediate containers
  --help=false                    Print usage
  -m, --memory=                   Memory limit
  --memory-swap=                  Total memory (memory + swap), '-1' to disable swap
  --no-cache=false                Do not use cache when building the image
  --pull=false                    Always attempt to pull a newer version of the image
  -q, --quiet=false               Suppress the verbose output generated by the containers
  --rm=true                       Remove intermediate containers after a successful build
  -t, --tag=                      Repository name (and optionally a tag) for the image
  --ulimit=[]                     Ulimit options

扩展: 如何使用 Git 仓库,构建 Docker 镜像?
除了使用本的 Dockerfile 文件构建镜像,docker build 还支持从 URL 构建,比如可以直接从 Git repo 中构建镜像。
docker build -t my-node https://github.com/xxxx/my-node.git

参考:
1. docker 入门命令示例
2. Docker之Dockerfile 参考
#
dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币13236枚
  • 威望5838点
  • 银元150个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
沙发#
发布于:2016-03-23 18:54
docker dockerfile 中的指令
举个栗子:dockerfile 文件
参考: 1楼。

基本格式
# Comment
指令 参数
指令是不区分大小写的, 然而约定指令是大写的以便区分其他的参数
注释,以#开头表示是注释,例如 # Comment


一些指令
1. FROM 指令
FROM,指令用来构建基础镜像。因此,一个有效的Dockerfile 必须是用FROM做第一个指令
镜像可以是任何有效的镜像,它会很容易从公共存储卡中获取。

FROM,指令可以在 Dockerfile中出现多次创建多个镜像,在用新的FROM之前简单的记录下镜像的id
如果FROM指令没有tag,就假设tag是latest.如果tag不存在,就会输出一个错误信息。

2. MAINTAINER 指令
MAINTAINER,这个指令是允许你设置作者信息

3. RUN 指令
RUN,指令将会在当前镜像执行任何命令并提交结果,提交的镜像的结果,将作为用户 Dockerfile的下一步操作;

4. CMD 指令
#有三种形式:
    CMD "executable","param1","param2"
    CMD ["param1","param2"] (作为ENTRYPOINT默认参数)
    CMD command param1 param2 (像shell一样)
Dockerfile 只能有一个CMD,如果你写了多个CMD,最后那个CMD会生效。

CMD,指令主要给一个容器执行提供默认参数,这些默认值可以是一个?可执行的,或者他们可以省略可执行文件,在这种情况下,你必须指定一个ENTRYPOINT你交号

当shell 中使用执行格式,CMD指令会设置镜像运行的指令,这个功能相当于docker 提交 -run 将会执行在/bin/sh -c
FROM ubuntu
CMD echo "This is a test." | wc -

如果你希望你的容器每次都执行相同的可执行文件,那么你应该考虑使用ENTRYPOINT结合CMD,可以查看ENTRYPOINT.

RUN 与 CMD 的区别
不要混淆RUN 与 CMD,RUN 在构建镜像时执行CMD则是在镜像构建成功后在容器中执行

5. EXPOSE 指令
格式:EXPOSE  [...]
EXPOSE 指令开放端口使用,这个功能相当于运行docker提交 -run '{"PortSpecs": ["", ""]}',相当于docker run -p
注意,多个端口使用空格分隔,例如 EXPOSE 4100 6000 6060 6420 6430

6. ENV 指令  
ENV 指令设置环境变量key对应值value,这个值将会被传递给后边使用的指令,这个功能相当于在指令前面加了=
注意:环境变量会持续到一个镜像的生成

7. ADD 指令
ADD,指令是将复制新文件,并将它们添加到容器的文件系统
必须是一个文件或者目录相对于源目录(也就是构建的环境)或者一个远程文件的URL。

是容器将被复制的目录地址。
所有新创建的文件和目录都是0755权限,uid和gid 0。
如果是目录,将整个目录复制,包含文件的原始数据
如果是压缩文件个事(譬如,gzip、bzip2或者xz),那么它会解压到目录,从URL资源不解压
如果一个目录被复制或者解压,他们都会执行相同的行为tar -x 作为结果的集合
    无论目标路径是否存在
    源的tree内容是否存在
产生冲突的时候会按照2来解决
如果是其它文件类型,她被单独复制连同它的数据。这种情况下,如果以斜线结尾,它就会被认为是一个目录,并将src中的写入/base().
如果不已斜线结尾,它会被认为是一个常规文件,并且的文件会被写入到文件中。
如果不存在,创建连同所有缺失的目录路径

8. ENTRYPOINT 指令
有两种形式:
    ENTRYPOINT ["executable", "param1", "param2"] (像 exec, 首选)
    ENTRYPOINT command param1 param2 (作为shell执行)
Dockerfile 中只能有一个ENTRYPOINT,如果你有多个ENTRYPOINT,则Dockerfile中只能最后一个会被执行
一个ENTRYPOINT会帮你配置容器作为容器的一个可执行文件,也就是说当你指定一个ENTRYPOINT,那么整个容器中都会运行这个可执行文件;

ENTRYPOINT 指令将会被当作一个不会被覆盖的指令参数传给运行的docker,不像CMD,这就是允许参数传递给入口,即docker run  -d 将会通过 -d参数来作为执行入口

你可以指定参数在 ENTRYPOINT JSON数组(如exec执行多个),或者通过使用一个CMD指令语句,这个入口的参数不会被docker run所重写,但是通过指定CMD的参数来重写docker run 参数

像CMD,你可以指定一个ENTRYPOINT的字符串,它将会在/bin/sh -c中执行
FROM ubuntu
ENTRYPOINT wc -l -
例如,Dockerfile的镜像经常会将stdin作为输入("-")或者但列出行数("-l"),如果你像让这个可选,默认情况下你可以使用CMD
FROM ubuntu
CMD ["-l", "-"]
ENTRYPOINT ["/usr/bin/wc"]

示例
ENTRYPOINT ["java","-jar","/root/scf-sign.jar"]

9. VOLUME 指令
格式:VOLUME ["/data"]
VOLUME 指令会创建一个挂载点根据指定的名字和标记挂在外部的主机或者其他容器,更多实例可以查看docker安装说明,共享文档和目录

10. USER 指令
USER daemon
USER质量设置镜像运行时的用户名或者Uid

11. WORKDIR 指令
WORKDIR /path/to/workdir
WORKDIR指令执行工作目录的来执行CMD

12 .COPY指令  
COPY指令和ADD指令功能和使用方式类似。只是COPY指令不会做自动解压工作。

#
游客

返回顶部