25.13/25.14 Dockerfile格式
25.15/25.16 Dockerfile示例(安装nginx)
25.13/25.14 Dockerfile格式
使用dockerfile可以快速创建镜像
dockerfile命令
FROM
指定基于哪个基础镜像
格式: FROM <image>
或者 FROM <image>:<tag>
1
2FROM centos
FROM centos:latest
MAINTAINER
指定作者信息
格式:MAINTAIN <name>
1
MAINTAINER aming aming@aminglinux.com
RUN
镜像操作指令
格式: RUN <command>
或者 RUN ["executable","param1","param2"]
1
2RUN yum install httpd
RUN ["/bin/bash", "-c", "echo hello"]
CMD
RUN和CMD看起来挺像,但是CMD用来指定容器启动时用到的命令,只能有一条。
三种格式:CMD ["executable", "param1", "param2"]
或者 CMD command param1 param2
或者 CMD ["param1", "param2"]
1
CMD ["/bin/bash", "/usr/local/nginx/sbin/nginx", "-c", "/usr/local/nginx/conf/nginx.conf"]
ENTRYPOINT
容器启动时要执行的命令,它和CMD很像,也是只有一条生效,如果写多个只有最后一条有效。和CMD不同是:CMD 是可以被 docker run 指令覆盖的,而ENTRYPOINT不能覆盖。
格式:ENTRYPOINT ["executable", "param1", "param2"]
或者 ENTRYPOINT command param1 param2
或者 ENTRYPOINT ["param1", "param2"]
容器名字为aming,我们在Dockerfile中指定如下CMD:CMD ["/bin/echo", "test"]
启动容器的命令是 docker run aming
这样会输出 test
假如启动容器的命令是 docker run -it aming /bin/bash
什么都不会输出
ENTRYPOINT不会被覆盖,而且会比CMD或者docker run指定的命令要靠前执行ENTRYPOINT ["echo", "test"]
docker run -it aming 123
则会输出 test 123
,这相当于要执行命令 echo test 123
EXPOSE
用来指定要映射出去的端口
格式:EXPOSE <port> [<port>...]
1
EXPOSE 22 80 8443
容器内部我们启动了sshd和nginx,所以我们需要把22和80端口暴漏出去。这个需要配合-P(大写)
来工作,也就是说在启动容器时,需要加上-P,让它自动分配。如果想指定具体的端口,也可以使用-p(小写)
来指定。
ENV
为后续的RUN指令提供一个环境变量,我们也可以定义一些自定义的变量
格式:ENV <key> <value>
1
2ENV PATH /usr/local/mysql/bin:$PATH
ENV MYSQL_version 5.6
ADD
将本地的一个文件或目录拷贝到容器的某个目录里。 其中src为Dockerfile所在目录的相对路径,它也可以是一个url。
格式:ADD <src> <dest>
1
ADD <conf/vhosts> </usr/local/nginx/conf>
COPY
使用方法和add一样,不同的是,它不支持url
格式:COPY <src> <dest>
1
COPY 1.txt /tmp/2.txt
VOLUME
创建一个可以从本地主机或其他容器挂载的挂载点。
格式: VOLUME ["/data"]
USER
指定运行容器的用户
格式: USER daemon
WORKDIR
为后续的RUN、CMD或者ENTRYPOINT指定工作目录
格式:WORKDIR /path/to/workdir
25.15/25.16 Dockerfile示例(安装nginx)
1.创建Dockerfile文件
1 | [root@kun01 ~]# vim Dockerfile |
添加下面代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17## Set the base image to CentOS 下载本地镜像
FROM centos
# File Author / Maintainer 作者
MAINTAINER kun@180923
# 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.8.0.tar.gz .
RUN tar zxvf nginx-1.8.0.tar.gz
RUN mkdir -p /usr/local/nginx
RUN cd nginx-1.8.0 && ./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 暴露80端口
EXPOSE 80
# Set the default command to execute when creating a new container 启动服务 tail -f /etc/passwd 为了让容器不中断
ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /etc/passwd
2.创建镜像
1 | [root@kun01 ~]# docker build -t centos_nginx . |
-t
指定创建镜像的名字
1 | [root@kun01 ~]# docker images |
centos_nginx是我们用dockerfile创建的镜像
3.启动镜像为容器
1 | [root@kun01 ~]# docker run -itd -p 8888:80 centos_nginx bash |
可以正常访问Nginx服务
[root@kun01 ~]# curl 127.0.0.1:8888 -I
HTTP/1.1 200 OK