文章目录
DockerFile概述
DockerFile规则
格式
- #为注释
- 指令(大写) 内容(小写)
- 尽管指令是大小写不敏感的,但是,还是强烈建议指令使用大写,内容使用小写。
DockerFile是按顺序执行指令集合的(从上到下依次执行)。
每一个DockerFile的第一个非注释指令,必须是“FROM”指令,用于为镜像构建过程中,指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境中。
- 实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机(本地)上查找指定的镜像文件,当本地不存在时,则会从Docker registry(远端)上拉取所需的镜像文件。
4组核心的DockerFile指令:
- USER/WORKDIR指令
- ADD/EXPOSE指令
- RUN/ENV指令
- CMD/ENTERPOINT指令
USER/WORKDIR指令
创建Dockerfile文件:
vim /data/docker/Dockerfile
Dockerfile文件内容:
# 基础镜像
FROM nginx:1.12.2
# 指定在docker中使用nginx用户启动进程,默认:root
USER nginx
# 默认的工作目录,也就是使用`docker exec -it nginx /bin/bash`命令进入容器后,直接进入的目录,默认:/
WORKDIR /usr/share/nginx/html
执行构建命令:
docker build . -t nginx:1.12.2_with_user_workdir
运行镜像:
docker run --rm -it --name nginx-test nginx:1.12.2_with_user_workdir /bin/bash
ADD/EXPOSE指令
注意:
- 如果源路径是个文件,且目标路径是以 / 结尾, 则docker会把目标路径当作一个目录,会把源文件拷贝到该目录下。如果目标路径不存在,则会自动创建目标路径。
- 如果源路径是个文件,且目标路径是不是以 / 结尾,则docker会把目标路径当作一个文件。
- 如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件;
- 如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名。
- 如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。
- 注意,这种情况下,最好显示的以 / 结尾,以避免混淆。
- 如果源路径是个目录,且目标路径不存在,则docker会自动以目标路径创建一个目录,把源路径目录下的文件拷贝进来。如果目标路径是个已经存在的目录,则docker会把源路径目录下的文件拷贝到该目录下。
- 如果源文件是个归档文件(压缩文件,比如 .tar文件),则docker会自动帮解压。但是.tar.gz文件是不会自动解压的。
创建Dockerfile文件:
vim /data/docker/Dockerfile
Dockerfile文件内容:
# 基础镜像
FROM nginx:1.12.2
# 添加本地文件到镜像中
ADD index.html /usr/share/nginx/html/index.html
# 指定容器端口,可以通过`docker run -P`实现容器端口随机映射到宿主机的某个端口
# EXPOSE只有和`-P`配合使用才生效,如果使用`-p`指定端口映射,则EXPOSE指令无意义
EXPOSE 80
执行构建命令:
docker build . -t nginx:1.12.2_with_add_expose
运行镜像:
docker run --rm -d --name nginx-test -P nginx:1.12.2_with_add_expose
RUN/ENV指令
创建Dockerfile文件:
vim /data/docker/Dockerfile
Dockerfile文件内容:
# 基础镜像
FROM centos:centos7
# 环境变量
ENV VER v9.11.4
# 在构建镜像时,执行一些可执行命令
RUN echo $VER
执行构建命令:
docker build . -t centos:centos7_with_env_run
CMD/ENTERPOINT指令
CMD指令
创建Dockerfile文件:
vim /data/docker/Dockerfile
Dockerfile文件内容:
# 基础镜像
FROM centos:centos7
# 在构建镜像时,执行一些可执行命令
RUN yum install -y httpd
# 指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。
# 如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。
CMD ["httpd","-D","FOREGROUND"]
执行构建命令:
docker build . -t centos:centos7_with_run_cmd
运行镜像:
docker run --rm -d --name centos-test -p 83:80 centos:centos7_with_run_cmd
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DCCajmfc-1620439574079)(https://gitee.com/tanyongqiang/images/raw/master/img/image-20201124094803480.png)]
ENTRYPOINT指令
创建Dockerfile文件:
vim /data/docker/Dockerfile
Dockerfile文件内容:
# 基础镜像
FROM centos:centos7
# 添加本地文件到镜像中
ADD entrypoint.sh /entrypoint.sh
# 在构建镜像时,执行一些可执行命令
RUN yum install epel-release -q -y && yum install -y nginx
# 配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
ENTRYPOINT /entrypoint.sh
entrypoint.sh内容:
#! /bin/bash
/sbin/nginx -g "daemon off;"
注意:记得在本地给entrypoint.sh授权。
授权命令:
chmod 777 entrypoint.sh
执行构建命令:
docker build . -t centos:centos7_with_run_entrypoint
运行镜像:
docker run --rm -d --name centos-test -p 83:80 centos:centos7_with_run_entrypoint
使用Docker容器化封装应用程序的意义(好处)
-
Docker引擎统一了基础设施环境–docker环境
硬件配置、操作系统的版本、运行时环境的差异。
-
Docker引擎统一了程序打包(装箱)方式–docker镜像
java程序、python程序、nodejs程序。
-
Docker引擎统一了程序部署(运行)方式–docker容器
java -jar --> docker run
npm run dev --> docker run
使用Docker容器化封装应用程序的缺点
- 单机使用,无法有效集群。(虽然可以搭建集群,但是很繁琐,非常不便利)
- 随着容器数量的上升,管理成本攀升。
- 没有有效的容灾/自愈机制。
- 没有预设编排模版,无法实现快速、大规模容器调度。
- 没有统一的配置管理中心工具。
- 没有容器生命周期的管理工具。
- 没有图形化运维工具。
总结
综上所述,我们需要一套容器编排的工具!
基于Docker容器引擎的开源容器编排工具目前市场上主要有:
- docekr compose、docker swarm
- Mesosphere + Marathon
- Kubernetes(k8s)