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