dockerfile的组成
1.基础镜像信息,指定发行版本 FROM centos
2.制作镜像操作指令 RUN yum install openssh-server -y
3.容器启动指令执行 CMD [/bin/bash]
dockerfile常用指令
指令 | 含义 |
FROM | 指定基础镜像 |
MAINTAINER | 指定维护人信息,可省略 |
RUN | 基于基础镜像执行命令,docker内每执行一条命令都是run开头 |
ADD | 添加宿主机文件到容器内,会识别压缩格式并且自动解压 |
COPY | 作用和ADD一致,但是不会自动解压 |
WORKDIR | 设置当前工作目录 |
VOLUME | 设置卷,挂载主机目录 |
EXPOSE | 指定对外端口 |
CMD | 指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令, 如果指定多条则只能最后一条被执行 |
ENV | 设置环境变量,会被后面的run使用 |
ENTRYPOINT | 容器启动后执行的命令 |
一个简单的dockerfile运行实例
需求:通过dockerfile,构建nginx镜像,运行容器后nginx的访问首页显示“hello hello,这是docke运行的nginx!!!”
实现:
1.创建Dockerfile
文件名必须是Dockerfile
执行vi Dockerfile 创建Dockerfile 文件录入以下内容
#基于nginx镜像
FROM nginx
# 把内容重定向输入到nginx的欢迎页面中
RUN echo '<meta charset=utf8> hello hello,这是docke运行的nginx!!!' >/usr/share/nginx/html/index.html
2.构建dockerfile
点是在当前目录寻找Dockerfile
3.修改镜像名称
docker tag 52496b401a3d my_nginx
4.运行镜像并验证
docker run -d -p 80:80 my_nginx
访问宿主机的80端口
常用指令的具体用法
COPY
ADD
特性和copy一致,不过多了些功能
CMD
作用: 用于启动容器后指定具体运行参数,docker不是虚拟机,容器就是一个进程,所以需要在启动的时候需要指定运行参数,在指定了entrypoint之后,用CMD指定具体参数,
语法: CMD ["参数1","参数2"]
例如:执行了docker run -it centos 就等于执行了 docker run -it centos bash 可以看出centos的cmd参数是 CMD ["/bin/bash"]
docker run -it centos cat /etc/os-release 就等同于 CMD ["cat","/etc/os-release"]
注意:CMD指定容器内的应用启动,必须是前台启动,否则容器在启动后会直接停掉
ENTRYPOINT
作用和cmd一样,都是指定容器启动程序以及参数。
当指定了ENTRYPOINT之后,CMD的语义就有了变化,是把CMD的内容当做参数传递给ENTRYPOINT指令。
我们创建一个dockerfile
运行之后我们拿到一个结果
在这个镜像的基础上,我想启动的时候加个 -I 获取一下请求头信息,发现直接报错了,无法直接传参,会覆盖CMD的参数。
docker run centos_curl -I
解决方案使用ENTRYPOINT,修改Dockerfile 把CMD 改为ENTRYPOINT
修改重新构建镜像之后,在后边添加参数运行成功
ARG 和 ENV
作用:设置环境变量
ARG 和 ENV一样都是设置环境变量
ENV设置的环境变量在镜像构建或容器运行时都可以使用
ARG只用于构建镜像,容器运行时就消失了
VOLUME
容器在运行时,应该保证在存储层不写入任何数据,运行在容器内产生的数据我们推荐是挂载写入到宿主机上。
创建一个dockerfile 生成两个目录挂载到宿主机上
构建运行使用 docker inspect 容器id 可以看到 data1 被挂载到了宿主机的 /var...目录
EXPOSE
指定容器运行时的对外端口
WORKDIR
拥有在dockerfile中的目录切换,更改工作目录
WORKDIR 容器目录
USER
用于改变环境切换用户
USER 用户名