关于安装Docker可以看《在Mac、Windows、Linux上安装Docker以及常用的操作命令》,更多相关内容看Docker系列。
Dockerfile是用来构建docker镜像的文件,是一个包含用户可以在命令行上调用组装镜像所有命令的文本文档,Docker可以通过从Dockerfile中读取指令来自动构建镜像。
Dockerfile指令语法
Docker镜像是分层构建、联合挂载的结构,Dockerfile中每一条指令构建一层镜像,用FROM来指定基础镜像,如果不以任何镜像为基础就写成“FROM scratch”。
Dockerfile中,以“#”开头的为注释行,指令(Instruction)采用大写格式,常用的指令说明如下。
FROM:指定当前自定义镜像依赖的环境。
MAINTAINER:镜像创建者信息,已经被标记为过时指令,官方推荐用LABLE。
USER:设置启动容器的用户,可以是用户名或UID,使用这个命令要确认容器中拥有这个用户,并且拥有足够权限。
EXPOSE:开放的端口。
VOLUME:在容器中创建一个挂载点,相当于-v,指定镜像的目录挂载到宿主机上。
ADD:复制文件到镜像,源文件要与Dockerfile位于相同目录中,若源文件是压缩包则会将其解压缩。
COPY:将相对路径下的内容复制到自定义镜像中,源文件要与Dockerfile位于相同目录中,copy只能用于复制,copy比add节省资源。
ARG:设置变量,只在build构建的时候有效,在docker build创建镜像的时候可以用“--build-arg 变量名=变量值”来指定参数。只能先定义ARG,build-arg传递的参数才生效。在multiple stages,每个stages的变量不能通用。
ENV:设置环境变量,只在容器运行的时候有效。
RUN:制作镜像时执行的命令,可以有多个,上而下依次运行,每次运行都会形成新的层,建议用“&&” 放入一行运行。
WORKDIR:定义容器默认的工作目录,对RUN、CMD、ENTRYPOINT、ADD、COPY生效,如果不存在则会创建,可以设置多次。
CMD:指定启动容器时需要运行的命令或者脚本,可以写多个,只以最后一个为准。CMD有三种形式:CMD ["executable","param1","param2",...] (exec形式,这是首选形式)、CMD ["param1","param2"] (作为ENTRYPOINT的默认参数)、CMD command param1 param2 (shell形式)。
ENTRYPOINT:设定容器启动时第一个运行的命令及其参数,有两种形式:ENTRYPOINT ["executable","param1","param2",...](exec形式,这是首选形式)、“ENTRYPOINT command param1 param2”(shell形式)。可以通过使用命令“docker run --entrypoint”来覆盖镜像中ENTRYPOINT指令的内容。如果有多个ENTRYPOINT,只有最后一个运行。如果CMD和ENTRYPOINT共存,只有ENTRYPOINT运行,且最后的CMD会当做ENTRYPOINT的参数。
ONBUILD:当构建一个被继承的Dockerfile时,这个时候就会运行ONBUILD指令,是一个触发指令。
HEALTHCHECK:用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
构建镜像
按照上面的Dockerfile语法编写完Dockerfile文件以后就可以通过下面的命令来构建镜像了。
docker build -t 镜像名:版本号 .
运行到容器中
构建完镜像可以通过“docker images”查看上面构建好的镜像,然后通过下面的命令把镜像运行到容器中,再通过“docker ps”(加“-a”查看所有容器)命令查看运行容器。
docker run -it 镜像名字:TAG
docker run -d --name 唯一的容器名 镜像名字:TAG
另外,还可以通过“docker inspect CONTAINER ID/NAMES”查看容器信息、“docker exec -it CONTAINER ID/NAMES bash或sh”进入容器、“docker logs CONTAINER ID/NAMES”查看日志、“docker rm CONTAINER ID/NAMES”删除容器(加“-f”强制删除正在运行的容器)、“docker rmi IMAGE ID/REPOSITORY:TAG”删除镜像。
更多dockerfile相关信息请查看官网文档。
历史上的今天:
展开阅读全文
上一篇: 使用docker exec -it xxx /bin/bash命令进入容器时报错OCI runtime exec failed