Docker是开发和系统管理员用来开发,部署和运行应用程序的容器。 使用linux容器部署应用程序叫做容器化。容器的概念并不新鲜,但是使用容器易于部署应用却很新鲜。
镜像 VS 容器
容器由运行的image启动;
image是一个可执行的包,包括运行应用程序需要的所有内容---代码,运行时环境,库,环境变量和配置文件;
container是一个image的运行实例---image执行的时,内存中的样子(即有状态的image或者说是用户进程)
你可以使用docker ps,查看正在运行的容器列表;
docker container ls -a 查看所有容器
容器 VS 虚拟机
一个特定容器运行在linux,和其他容器共享主机内核。
容器运行在分散的进程中,不会因为其他运行程序占用更多内存,使其保持轻量;
相反,虚拟机完全运行在虚拟操作系统上,这个虚拟系统通过虚拟机监视器来访问主机资源。
总之,虚拟机提供了一个比应用程序需要的资源更多的环境。
容器
过去,如果你写一个python程序,要首先安装一个python运行环境,而且要创建一个在你机器上完美运行且在生产环境一样效果的运行环境;
使用docker,你可以提前一个轻便的Python运行环境作为image,不需要安装,
然后你的构建包括基本的Pythonimage个你的程序代码,保证了你的应用程序的依赖,运行是环境,是一个整体。
这些轻便的images是通过Dockerfile定义的。
使用Dockerfile 定义容器
Dockerfile定义了 container环境要做的事情;
诸如访问网络接口和磁盘驱功能已经被虚拟到了这个环境里,它是和你的系统隔离的,
所以你需要和外部世界映射端口,并且指定你想复制哪个文件到这个环境里;
然而,做完这些之后,你就可以做到使用定义在Dockerfile的来构建的应用运行效果是一样的。
RUN、CMD、ENTRYPOINT命令的区别在哪里?
RUN 指令是在镜像构建时运行,执行结果都会打包进入 image 文件;而后两个是在容器启动时执行!
CMD 指令设置的命令是容器启动时默认运行的命令,如果 docker run 没有指定任何的命令,
并且 Dockerfile 中没有指定 ENTRYPOINT,那容器启动的时候就会执行 CMD 指定的命令!有点类似代码中的缺省参数!
如果设置了 ENTRYPOINT 指令,则优先使用,并且可以通过 docker run 给该指令设置的命令传参!
CMD 有点类似代码中的缺省参数。
另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD,RYPOINT命令
- docker ps:查看正在运行的容器的信息
- docker rm:使用这个命令就可以删除某个容器
- docker rmi:删除本地的镜像
DOCKER_HOST环境变量查看宿主机的ip
dockerfile命令 | 说明 |
---|---|
FROM | 指定基础镜像,当前镜像是基于哪个镜像创建的,类似 Java 中的类继承。FROM 指令必是 Dockerfile 文件中的首条命令。 |
CMD | CMD["executable","param1","param2"] CMD["param1","param2"] CMD command param1 param2 指定容器启动时默认运行的命令,在一个 Dockerfile 文件中,如果有多个 CMD 命令,只有一个最后一个会生效! 和RUN 指令很相似,RUN 指令是在构建镜像时候执行的,而 CMD 指令是在每次容器运行的时候执行的! 如果在命令行中docker run 后添加命令,则会覆盖dockerfile中CMD命令 |
ENTRYPOINT | ENTRYPOINT["executable", "param1", "param2"] ENTRYPOINT command param1 param2 和CMD命令类似,都是指定启动容器时要运行的命令,如果指定了 ENTRYPOINT,则 CMD 指定的命令不会执行! 在一个 Dockerfile 文件中,如果有多个 ENTRYPOINT 命令,也只有一个最后一个会生效! 不同的是通过 docker run command 命令会覆盖 CMD 的命令! 执行的命令不会覆盖 ENTRYPOINT,docker run 命令中指定的任何参数都会被当做参数传递给 ENTRYPOINT! |
WORKDIR | 设置工作目录,在该指令后的 RUN、CMD、ENTRYPOINT, COPY、ADD 指令都会在该新指定目录执行。 如果该目录不存在,则会创建!可以在命令行中用 -w 目录名称覆盖 |
ENV | 指定image的构建环境,可以在命令行中用 -e 指定;ENV key=value;设置的变量可供后面指令使用 |
RUN | RUN 会在当前镜像的最上面创建一个新层,并且能执行任何的命令,然后对执行的结果进行提交。 提交后的结果镜像在 Dockerfile 的后续步骤中可以使用 |
VOLUME |
VOLUME 用于创建挂载点,一般配合 run 命令的 -v 参数使用
添加一些内容到image,不用commit,且在容器间共享数据;
- Volumes 可以在容器间共享和复用数据 - 容器分享它的volumes不需要必须运行 - 可以直接修改volume - 更新镜像刽改变volume - Volumes会一直存在直到没有容器使用为止 |
ADD | ADD[--chown=user:group] src... dest ADD[--chown=user:group] ["src",..."dest"] 从宿主机拷贝文件或者文件夹到镜像,也可以复制一个网络文件!添加文件时,根据目标路径的结尾字符决定源文件类型; 如果目标以/结尾,则认为源是目录,否则是文件;如果拷贝的文件是一个压缩包,会自动解压缩! |
COPY | 和ADD类似,不同点是copy纯粹在构建上下文中复制本地文件;源文件必须是在构建上下文环境中存在,外部的是获取不到的; 目标路径必须是容器内的绝对路径; 从宿主机拷贝文件或者文件夹到镜像,不能复制网络文件也不会自动解压缩! |
EXPOSE | EXPOSE port[port/protocol] 指定容器运行时对外暴露的端口,但是该指定实际上不会发布该端口,它的功能是镜像构建者和容器运行者之间的记录文件; 回到容器命令中的 run 命令部分,run 命令有 -p 和 -P 两个参数。 如果是 -P 就是随机端口映射,容器内会随机映射到 EXPOSE 指定的端口; 如果是 -p 就是指定端口映射,告诉运维人员容器内需要映射的端口号。 |
USER | 用于指定运行镜像所使用的用户。可以在命令行中用 -u 指定,默认是root |
ARG | ARG name=defaultvalue 指定在镜像构建时可传递的变量,定义的变量可以通过 dockerbuild --build-arg = 的方式在构建时设置。 |
STOPSIGNAL | STOPSIGNAL signal 设置当容器停止时所要发送的系统调用信号! |
SHELL | SHELL ["executable","parameters"];用于设置执行命令所使用的默认的 Shell 类型! 该指令在 Windows 操作系统下比较有用,因为 Windows 下通常会有 CMD 和 Powershell 两种 Shell,甚至还有 SH |
ONBUILD | ONBUILD [INSTRUCTION] 为image添加触发器;当所构建的镜像被当做其他镜像的基础镜像时,ONBUILD 指定的命令会被触发! |