Dockerfile格式
dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。
类似于Makfile,用户使用docker build就可以编译镜像,使用该命令可以设置编译镜像时使用的CPU数量、内存大小、文件路径等。
dockerfile由多条指令组成,每条指令在编译镜像时执行相应的程序完成某些功能,由指令+参数组成,以逗号分隔,#作为注释起始符,虽说指令不区分大小写,但是一般指令使用大些,参数使用小写。
FROM:指定基于哪个基础镜像
格式:FROM 或者 FROM :
如 FROM centos ; FROM centos:latest
MAINTAINER:指定作者信息
格式:MAINTAINER
如 MAINTAINER lzx [email protected]
RUN:镜像操作指令
格式:RUN 或者 RUN [“executable”,‘param1",“param2”]
如 RUN yum install httpd 或者 RUN ["/bin/bash","-c",“echo hello”]
CMD:指定容器启动时执行的命令,只能有一条
格式:CMD [“executable”,“param1”,“param2] 或
CMD command param1 param2 或
CMD [“param1”,“param2”]
如 CMD [”/bin/bash","/usr/local/nginx/sbin/nginx","-c","/usr/local/nginx/conf/nginx.conf"]
EXPOSE:指定要映射出去的端口
格式:EXPOSE …
(-P(大写)指定容器端口,宿主机端口随机分配;-p(小写)指定宿主机端口和容器端口)
如 EXPOSE 22 80 443 或 EXPOSE -P 80 或 EXPOSE -p 8088:80
ENV:为后续的RUN指令提供一个环境变量
格式:ENV
如 ENV PATH /usr/local/mysql/bin:$PATH
ADD:将本地的一个文件或目录拷贝到容器的某个目录里
格式: ADD
(src为dockfile所在目录的相对路径,也可以是一个url)
如 ADD <conf/vhosts> </usr/local/nginx/conf>
COPY:将本地的一个文件或目录拷贝到容器的某个目录里
格式:COPY
(用法与ADD基本相同,但不支持url)
如 COPY <conf/vhosts> </usr/local/nginx/conf>
ENTRYPOINT:指定容器启动时执行的命令,只能有一条,写多条也只有最后一条生效
格式:ENTRYPOINT [“executable”,“param1”,“param2] 或
ENTRYPOINT command param1 param2 或
ENTRYPOINT [“param1”,“param2”]
(用法与CMD基本相同,但CMD可以被docker run指令覆盖,而ENTRYPOINT不能覆盖,且会比CMD或docker run指定的命令更早执行)
如 ENTRYPOINT [”/bin/bash","/usr/local/nginx/sbin/nginx","-c","/usr/local/nginx/conf/nginx.conf"]
VOLUME:创建一个可以从本机或者其他容器挂载的挂载点
格式:VOLUME ["/data"]
USER:指定运行容器的用户
格式:USER daemon
WORKDIR:为后续的RUN、CMD或者ENTERPOINT指定工作目录
格式:WORKDIR /path/to/workdir
Dockerfile 示例
上面介绍了dockerfile的语法格式,现在我们进行安装nginx实例操作。
编辑dockerfile:
vim Dockerfile
## Set the base image to CentOS
FROM centos
# File Auther / Maintainer
Maintainer jin [email protected]
# Install necessary tools
RUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel
# Install Nginx
ADD http://nginx.org/download/nginx-1.19.5.tar.gz .
RUN tar zxvf nginx-1.19.5.tar.gz
RUN mkdir -p /usr/local/nginx
RUN cd nginx-1.19.5 && ./configure --prefix=/usr/local/nginx && make && make install
RUN rm -fv /usr/local/nginx/conf/nginx.conf
ADD http://www.apelearn.com/study_v2/.nginx_conf /usr/local/nginx/conf/nginx.conf
# Expose ports
EXPOSE 80
# Set the default command to execute when creating a new container
ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /etc/passwd
加上tail -f 防止容器启动完nginx就自动停止
创建镜像:
docker build -t centos_nginx .
(.):表示在当前路径下查找dockerfile,如果在其他路径,可以写路径;
(-t)指定新的镜像名称
…………………………………………….省略一万字
Successfully built 91a1362358a1
Successfully tagged centos_nginx:latest
出现这个就说明运行成功
[root@jinkai02 src]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_nginx latest 91a1362358a1 2 minutes ago 384MB
运行镜像:
[root@jinkai02 src]# docker run -itd -p 81:80 centos_nginx bash
92a9cd33fdd7350af4a3287edde8bd468108ad01f83c5e88014307bdebcae963
[root@jinkai02 src]# docker exec -it 92a9cd bash
[root@92a9cd33fdd7 /]# ps aux | grep nginx
root 8 0.0 0.0 18532 624 ? Ss 15:52 0:00 nginx: master process /usr/localnginx/sbin/nginx
nobody 9 0.0 0.3 41796 3708 ? S 15:52 0:00 nginx: worker process
nobody 10 0.0 0.3 41796 3708 ? S 15:52 0:00 nginx: worker process
root 26 0.0 0.0 9172 720 pts/1 S+ 15:53 0:00 grep --color=auto nginx
[root@92a9cd33fdd7 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 8 bytes 656 (656.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@92a9cd33fdd7 /]# exit
Exit
[root@92a9cd33fdd7 /]# exit
Exit
访问宿主机的81端口
[root@jinkai02 src]# curl 127.0.0.1:81
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>;
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>;
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
成功访问,说明上面使用Dockerfile创建镜像成功