使用Dockerfile创建容器
-
创建目录:
mkdir dockerfile_test && cd dockerfile_test
-
创建文件:
vim index.html
, 文件内容:
<html>
<h1>Hello Dockerfile!</h1>
</html>
- 创建Dockerfile文件:
vim Dockerfile
, 文件内容:
FROM UBUNTU
MAINTAINER wikid
RUN apt-get update
RUN apt-get install -y nginx
COPY index.html /var/www/html
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
EXPOSE 80
-
根据Dockerfile创建容器:
docker build -t wikid/hello_dockfile .
-
执行
docker images
,即可看到 wikid/hello_dockfile 这个容器 -
运行查看 docker容器:
docker run -p 8080:80 -d wikid/hello_dockfile
,打开浏览器访问localhost:8080,页面输出: Hello Dockerfile!
镜像分层
dockerfile的每一行都会产生一个新的层
Dockerfile 语法简介
语法 | DEMO | 用途 |
---|---|---|
FROM | FROM scratch | base image,其中sratch是官方提供的一个最小化且干净的镜像。尽量使用官方的image作为base image,主要是为了安全。 默认是拉取最新的镜像最新的版本,也可以指定版本,如 FROM ubuntu:14.04 |
LABEL | LABEL maintainer="auth@gmail.com" | 该镜像的描述说明信息,比如该镜像的维护者,当前版本号等metadata信息,类似于代码注释 |
RUN | yum update && yum install vim | 执行命令,且每运行一次命令都会生成新的一层,所以为了避免无用分层,建议合并多条命令成一行。还有在书写方式上,为了美观,建议将负责的 RUN 赢反斜线换行。 |
CMD | CMD echo “hello world!” | 设置容器启动后默认执行的命令和参数 |
ENTRYPINT | ENTRYPINT echo “hello world!” | 设置容器启动时运行的命令 |
WORKDIRA | WORKDIR /root | 用来设置当前的工作目录,如果没有会自动创建目录,并进入该目录。尽量使用 WORDDIR,不要使用 RUN cd(创建新层);尽量使用绝对目录(清晰明了)。 |
ADD | ADD test.tar.gz / | 将本地文件添加到容器中。ADD 可以在添加文件的同时,对文件进行解压缩,而 COPY 不行,可以结合 WORKDIR 一起使用。 |
COPY | COPY hello / | 拷贝文件。大部分情况优先使用 COPY。如果是远程文件可使用 curl 和 wget |
ENV | ENV NODE_ENV production | 指定环境变量,后续命令引用:yarn start:"$NODE_ENV",尽量使用 ENV,维护性好 |
EXPOSE | EXPOSE 8080 | 暴露端口 |
USER | 指定用户 | |
VOLUME | 指定挂载点 |
RUN、CMD、ENTRYPOINT 对比
- 调用格式
// shell 格式
RUN apt-get install -y vim
CMD echo "hello docker"
ENTRYPOINT echo "hello docker"
// Exec 格式
RUN ["apt-get", "install", "-y", "vim"]
CMD ["/bin/echo", "hello docker"]
ENTRYPOINT ["/bin/echo", "hello docker"]
- CMD 命令
(1)容器启动时默认执行的命令
(2)如果docker run 指定了其他命令,CMD命令被忽略
(3)如果定义了多个CMD,只有最后一个命令会输出
- ENTRYPOINT
(1)让容器以应用程序或者服务的形式运行(后台进程,如数据库等)
(2)不会被忽略,一定会执行
(3)最佳实践:写一个 shell 脚本作为 entrypoint
COPY dokcer-entrypoint.sh /usr/local/bin
ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 27017
CMD ["mongod"]