栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Dockerfile

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Dockerfile

Dockerfile 基础结构

Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义镜像。

Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。

Docker分为四部分:

基础镜像信息
维护者信息
镜像操作指令(做镜像的时候需要做什么事)
容器启动时默认要执行的指令
# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: seancheng  作者
# Command format: Instruction [arguments / command] ...

# 第一行必须指定基于的基础镜像  (有效的)
FROM ubuntu

# 维护者信息
LABEL MAINTAINER='seancheng xianshangxian@126.com'

# 镜像操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "ndaemon off;" >> /etc/nginx/nginx.conf

# 容器启动时默认要执行的指令
CMD /usr/sbin/nginx
指令

指令的一般格式为INSTRUCTION arguments,指令包括:

FROM
LABEL MAINTAINER
RUN
CMD
EXPOSE
ENV
ADD
COPY
ENTRYPOINT
VOLUME
USER
WORKDIR
onBUILD
FROM

格式为FROM 或FROM :

第一条指令必须为FROM指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)。

LABEL MAINTAINER

格式为LABEL MAINTAINER ,指定维护者信息

RUN

格式为RUN 或RUN ["executable","param1","param2"]。

前者将在shell终端中运行命令,即/bin/sh -c;后者则使用exec执行。指定使用其他终端可以通过第二种方式实现,例如:

RUN ["/bin/bash","-c","echo hello"]

每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 来换行,例如:

RUN echo "hello worldnhello tom" > /tmp/abc && 
cat /tmp/abc
CMD

CMD支持三种格式:

CMD ["executable","param1","param2"]使用exec执行,推荐方式
CMD command param1 param2在/bin/sh中执行,提供给需要交互的应用
CMD ["param1","param2"]提供给ENTRYPOINT的默认参数

CMD用于指定启动容器时默认要执行的命令,每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。

如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令。

EXPOSE

格式为EXPOSE […]。
例如:

EXPOSE 22 80 8443
EXPOSE用于告诉Docker服务器容器暴露的端口号,供互联系统使用。

在启动容器时通过-P,Docker主机会自动分配一个端口转发到指定的端口;
使用-p则可以具体指定哪个本地端口映射过来。

ENV
格式为ENV 。指定一个环境变量,会被后续RUN指令使用,并在容器运行时保持。例如:

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-KaTeX parse error: Expected 'EOF', got '&' at position 49: …/src/postgress &̲& ... ENV PATH …PG_MAJOR/bin:$PATH
ADD
格式为ADD 。

该命令将复制指定的到容器中的。其中可以是Dockerfile所在目录的一个相对路径(文件或目录);也可以是一个URL;还可以是一个tar文件(会自动解压为目录)。

COPY
格式为COPY 。

复制本地主机的(为Dockerfile所在目录的相对路径,文件或目录)为容器中的。目标路径不存在时会自动创建。
当使用本地目录为源目录时,推荐使用COPY。

ENTRYPOINT
ENTRYPOINT有两种格式:

ENTRYPOINT [“executable”,“param1”,“param2”]
ENTRYPOINT command param1 param2(在shell中执行)
配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖。而且,如果在docker run的后面提供了参数,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序。

每个Dockerfile中只能有一个ENTRYPOINT,当指定多个ENTRYPOINT时,只有最后一个生效。

VOLUME
格式为VOLUME ["/data"]。

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。

USER
格式为USER daemon。

指定运行容器时的用户名或UID,后续的RUN也会使用指定用户。

当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如:

RUN groupadd -r postgres && useradd -r -g postgres postgres
要临时获取管理员权限可以使用gosu,而不推荐sudo。如果不指定,容器默认是root运行。

WORKDIR
格式为WORKDIR /path/to/workdir。

为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。
可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
则最终路径为/a/b/c。

ONBUILD
格式为onBUILD [INSTRUCTION]。

配置当所创建的镜像作为其他镜像的基础镜像时,所执行的操作指令。

例如,Dockerfile使用如下的内容创建了镜像image-A

[…]
onBUILD ADD . /app/src
onBUILD RUN /usr/local/bin/python-build --dir /app/src
[…]
此时,如果基于image-A创建新的镜像时,新的Dockerfile中使用FROM image-A指定基础镜像时,会自动执行ONBUILD指令的内容,等价于在后面添加了两条指令。

FROM image-A

Automatically run the following

ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src
使用ONBUILD指令的镜像,推荐在标签中注明,例如ruby:1.9-onbuild。

创建镜像

编写完成Dockerfile后,可以通过docker build命令来创建镜像。

基本的格式为docker build [选项] 路径,该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下所有内容发送给Docker服务端,由服务端来创建镜像。因此一般建议放置Dockerfile的目录为空目录。

另外,可以通过 .dockerignore 文件(每一行添加一条匹配模式)来让Docker忽略路径下的目录和文件。

要指定镜像的标签信息,可以通过-t选项。

例如,指定Dockerfile所在路径为/tmp/docker_builder/,并且希望生成镜像标签为build_repo/first_image,可以使用下面的命令:

docker build -t build_repo/first_image /tmp/docker_builder/
ockerfile制作apache镜像
[root@localhost ~]# docker run -dit --name centos httpd:latest /bin/bash
36e89499947a5a4a257763018ab1e16b04f4c716b65ea32295409d9e0be5deb6
[root@localhost ~]# docker ps -a
ConTAINER ID   IMAGE          COMMAND       CREATED         STATUS         PORTS     NAMES
36e89499947a   httpd:latest   "/bin/bash"   7 seconds ago   Up 6 seconds   80/tcp    centos

[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
httpd        latest    ea28e1b82f31   5 days ago   143MB

[root@localhost ~]# docker commit -m "new" -a "docker" 36e89499947a ll/httpd:latest
sha256:9c84483969ee190601a9d4f0684cf591f949ed2f351447ad8d6f31f665d75bf7
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
ll/httpd     latest    9c84483969ee   3 seconds ago   143MB
httpd        latest    ea28e1b82f31   5 days ago      143MB

基于Dockerfile创建,编写需要的文件
[root@localhost ~]# cd /opt/
[root@localhost opt]# mkdir apache
[root@localhost opt]# cd apache/
[root@localhost apache]# vim Dockerfile
[root@localhost apache]# cat Dockerfile 

FROM httpd:latest #基于的基础镜像,在centos内核运行
MAINTAINER ll #维护者信息
RUN yum -y update  
RUN yum -y install httpd
EXPOSE 80  #开启80端口,给外部映射用
ADD index.html /var/www/html/index.html #将宿主机网站文件加入到镜像内
ADD run.sh /run.sh #将执行脚本复制到镜像内
RUN chmod 755 /run.sh #提权
CMD ["/run.sh"] #启动容器时执行脚本,开启Apache服务

[root@localhost apache]# vim run.sh
[root@localhost apache]# cat run.sh 
#!/bin/bash

rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
[root@localhost apache]# echo "this is web test" > index.html

上面的文件准备好后,生成镜像
[root@localhost apache]# docker build -t 1163582076/httpd-ll:latest  .
Sending build context to Docker daemon  4.096kB
Step 1/7 : FROM httpd:latest
 ---> ea28e1b82f31
Step 2/7 : MAINTAINER ll
 ---> Using cache
 ---> 418be4d2d842
Step 3/7 : EXPOSE 80
 ---> Running in f2788646cb9a
Removing intermediate container f2788646cb9a
 ---> 26fba0e74ece
Step 4/7 : ADD index.html /var/www/html/index.html
 ---> 0e8261064379
Step 5/7 : ADD run.sh /run.sh
 ---> 9473d3354cdc
Step 6/7 : RUN chmod 755 /run.sh
 ---> Running in cd220116942b
Removing intermediate container cd220116942b
 ---> 9ba196879123
Step 7/7 : CMD ["/run.sh"]
 ---> Running in f14fa654a5d2
Removing intermediate container f14fa654a5d2
 ---> e758b05fe0b9
Successfully built e758b05fe0b9
Successfully tagged 1163582076/httpd-ll:latest

上传镜像
[root@localhost apache]# docker push 1163582076/httpd-ll
Using default tag: latest
The push refers to repository [docker.io/1163582076/httpd-ll]
a9f1e677c397: Preparing 
bbf3c998364d: Preparing 
55aa15fdc60a: Preparing 
f2ca16412796: Preparing 
7b17db00576b: Preparing 
afd73b741139: Waiting 
de86fc8fb2bd: Waiting 
9321ff862abb: Waiting 
denied: requested access to the resource is denied

基于新镜像创建容器
denied: requested access to the resource is denied
[root@localhost apache]#  docker run  --name httpd -dit -p 80:80 1163582076/httpd-ll
f47783d66537c16245c5a7637a065003311521642bd7116d6add5b91b5529b38
[root@localhost apache]# docker ps
ConTAINER ID   IMAGE          COMMAND       CREATED          STATUS          PORTS     NAMES
36e89499947a   httpd:latest   "/bin/bash"   25 minutes ago   Up 25 minutes   80/tcp    centos
[root@localhost apache]# docker exec -it centos /bin/bash
root@36e89499947a:/usr/local/apache2# cd
root@36e89499947a:~# ss -anlt

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/643558.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号