Docker及三剑客(Compose、Machine、Swarm)

最近在做持续集成交付部署的事,想系统的学一下Docker。看到这个系列教程,将自己认为重要的知识点摘抄下来,推荐大家看看原著无踪无影。

1.如果在Docker里下载基础linux系统镜像,底层用的是Host的内核空间kernel,Docker只需要提供rootfs。

理解:
Linux的操作系统是由内核空间kernel和用户空间组成的;
内核空间:kernel,linux启动的时候会加载bootfs文件系统,之后bootfs会被卸载掉;
用户空间的文件系统是rootfs,包括/dev/,/proc,/bin等目录(PS
:不同的linux发行版的主要区别是rootfs不同);
基础linux系统镜像只是在用户空间与发行版一致,内核空间kernel不一定一致,容器的内核版本与底层Host保持一致,容器只能使用Host的内核版本,不能修改

2.docker commit将当前容器保存为镜像

例如:

docker run -it centos      //以交互的方式运行一个镜像,并进入容器
yum install -y vim         //在这个容器中安装vim程序
docker commit 容器名 centos-vi         //另外一个终端连接host后,运行该命令,将该容器保存为centos-vi这个镜像名

3.利用Dockerfile构建一个镜像

vi ./Dockerfile      //编辑一个dockerfile文件
FROM centos          //写入"FROM centos "内容,表示引用centos这个基础镜像
RUN yum install -y vim    //写入"RUN yum install -y vim",表示在新构建的镜像中添加vim程序
//保存并退出后
docker build -t centos-vim-dockerfile .    //在当前目录下(Dockerfile存在当前目录,也可以用[-f 文件路径/Dockfile]来指定dockerfile位置)构建一个名为centos-vim-dockerfile的新镜像

注意:docker会将dockerfile所在的目录下的所有文件发送给docker服务器,所以使用build context就要谨慎了,最好不要将多余的文件放到build context,尤其是不要把 / 或者 /usr 作为build context ,否则创建镜像的过程会非常缓慢或者创建失败。

利用docker进行镜像构建时,如若系统内已经存在某些共同的基础镜像,则新构建镜像将会用这些缓存的基础镜像

4.Dockerfile命令解析

FROM:指定base镜像
MAINTAINER:设置镜像作者,可以是任意字符
COPY:将文件从build context复制到镜像。支持两种形式:1.COPY src dest 2.COPY [“src”,“dest”]
注意:src只能指定build context中的文件或目录(即Dockerfile文件所在目录中的文件或目录)
ADD:与COPY类似,从build context复制文件到镜像。不同的是,如果src是归档文件(tar,zip,tgz,xz等),文件会自动解压到dest
EXPOSE:制定容器中的进程会监听某个端口,Docker可以将该端口暴露出来
RUN: 在容器中运行相应的指令
CMD:容器启动时运行的相应的命令,dockerfile中可以有多个cmd指令,但只有最后一个生效。CMD可以被docker run 之后的参数代替
ENTRYPOINT:设置容器启动的时候运行的命令。Dockerfile中可以有多个ENTRYPOINT指令,但只有最后一个生效,CMD或docker run之后的参数都会被当作参数传递给ENTRYPOINT
举个微服务例子:

FROM java:8-jre                         //基础镜像为java8
MAINTAINER daihl <[email protected]>    //作者信息
ADD ./target/gateway.jar /app/          //将mvn编译后的jar文件,复制到镜像/app目录文件夹下
CMD ["java", "-Xmx200m", "-jar", "/app/gateway.jar"]    //容器启动时运行 java -Xmx200m -jar /app/gateway.jar
EXPOSE 4000                             //容器监听4000端口,可将该端口暴露出去
FROM mongo:3                            //基础镜像为mongo3
MAINTAINER daihl <[email protected]>    //作者信息
ADD init.sh /init.sh                    //将当前build context目录下的init.sh文件复制到镜像/中
ADD ./dump /                            //将当前build context目录下的dump文件夹复制到镜像/中
RUN \
 chmod +x /init.sh && \
 apt-get update && apt-get dist-upgrade -y && \
 apt-get install psmisc -y -q && \
 apt-get autoremove -y && apt-get clean && \
 rm -rf /var/cache/* && rm -rf /var/lib/apt/lists/*    //在容器中运行相应的指令
ENTRYPOINT ["/init.sh"]                 //设置容器启动的时候运行的命令

1.使用RUN 指令安装应用和软件包,构建镜像
2.使用ENTRYPOINT运行应用程序或服务,比如运行一个MySQL,应该优先使用EXEC格式的ENTRYPOINT指令
3.CMD可为ENTRYPOINT提供额外的默认参数,同时可以利用docker run后面的参数进行更改。

5.Docker存储

docker 有两种存储方式:storage driver和data volume
stroage driver这种存储方式主要是存储那些无状态的数据,是镜像层和容器层组成的,而data volume是目录或者文件
平时运行容器的时候既有无状态的容器也有有状态的容器,我们的数据层(镜像层和容器层)和volume都可以存储数据,使用的时候该怎么选择呢?
需要考虑以下几个场景:
1.Database软件VS Database数据
2.Web应用VS应用产生的日志
3.数据分析软件VS input/output数据
4.Apache Server VS静态Html 文件
很显然这几个场景:前部分都是无状态的,可以放在数据层(镜像层和容器层),应该作为镜像的一部分
而后面的都是数据需要保存的,应该放在data volume,并且与镜像分开存放

你可能感兴趣的:(Docker及三剑客(Compose、Machine、Swarm))