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

创建镜像

编写完成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/

dockerfile制作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

上一篇:Sending build context to Docker daemon 9.362GB


下一篇:Docker+SpringBoot快速构建和部署应用