本文主要涉及Docker镜像、容器相关知识
Docker架构和底层技术
Docker提供了一个开发、打包、运行应用的平台
Docker Engine将应用和infrastructure分离开
Docker Engine
Docker Engine由后台进程(dockerd)、REST API Server、CLI接口(docker)组成
#查看Client、Server、Engine版本 |
底层技术支持
(1)Namespaces:做隔离pid,net,ipc,mnt,uts
(2)Control groups:做资源限制
(3)Union file systems:Container和image的分层
Docker Image
Image里面是一层层的文件系统,即UnionFS(联合文件系统)。每一层文件系统我们都叫一层layer,Image本身是read-only的。构建镜像的时候,每个构建操作都是对一层修改,增加一层文件系统,当你使用Image的时候,你看到的是一个整体,不知道Image到底含有多少文件系统。
#查看image |
获取Image方式
(1)Dockerfile
(2)Pull from Registry
Docker Container
Container概念
(1)通过Image创建的
(2)在Image layer之上建立一个可读写的Container
(3)Image和Container的关系好比类和实例的关系
(4)Image负责application的存储和分发,Container负责运行application
#运行容器 |
Dockerfile
FROM
尽量使用官方的base image
#制作base image |
LABEL
定义一个image的Metadata,帮助信息。
LABEL maintainer=“1335402049@qq.com” |
RUN
为了美观、负杂的RUN,使用反斜线换行;避免无用分层,合成多条命令成一行
RUN yum update && yum install -y vim \ |
WORKDIR
使用WORKDIR,不要使用RUN cd,尽量使用绝对目录
WORKDIR /test #如果没有会自动创建test目录 |
ADD和COPY
大部分情况,COPY优先于ADD;ADD除了COPY以外还有解压功能;添加远程文件/目录使用curl或者wget
ADD hello / |
WORKDIR /root |
WORKDIR /root |
ENV
尽量使用ENV
ENV MYSQL_VERSION 5.6 #设置常量 |
RUN CMD ENTRYPOINT
RUN:执行命令并创建新的Image Layer
CMD:设置容器启动后默认执行的命令和参数
ENTRYPOINT:设置容器启动时运行的命令
CMD与ENTRYPOINT区别?
(1)CMD
容器启动时默认执行的命令;
如果docker run指定了其他命令,CMD命令会被忽略;
如果定义了多个CMD,只有最后一个会执行
(2)ENTRYPOINT
让容器以应用程序或者服务的形式运行;
不会被忽略,一定会执行
资源限制
#内存限制 |