本系列为Docker的学习笔记,内容比较精简,主要用于快速复习和随时查询。计划分六个章节内容:
- 安装、常用命令和基本概念理解
- 常用应用程序的容器部署
- 制作镜像的两种方式(容器转镜像和Dockerfile)
- 布署一个ASP.NET Core项目
- 服务编排Docker compose
镜像由文件叠加而成,且文件层可以共享复用。比如对Linux系统来说,最底层是bootfs,其上是rootfs。假设有两个镜像,都需要这两层文件,则这两个镜像可以共享复用linux操作系统的bootfs和rootfs,不需要再重新下载,这也是Docker和虚拟机的最大区别。需要补充说明的是,因为文件层是由各个镜像共享复用的,所以文件层一定是只读的。
基于以上原理,制作镜像有两种方式,一是制作一个Docker可以识别和执行的描述性文件,文件中说明镜像由哪些文件层组成、创建容器时执行一些相关命令以及其它一些描述性信息,这个文件就是Dockerfile,通过Dockerfile创建镜像,是最主要的方式;另外一种方式,是通过容器反过来生成镜像,我们知道镜像中的文件层都是只读到,但镜像容器化后,里面的文件就是可写的了,我们可以修改容器中的配置和数据,然后使用这个经过修改后的容器,生成定制化的镜像,比如我们可以制作一个更符合我们需求的定制化redis镜像。
一、容器转镜像
1、使用容器制作镜像:docker commit 容器id 镜像名称:版本号
2、将镜像打包(镜像不能传输,但压缩包可以):docker save -o 压缩文件名称.tar 镜像名称:版本号
3、加载压缩包并转成镜像:docker load -i 压缩文件名称.tar
*注:如果在容器中,有目录挂载(数据卷),则由容器生成的镜像,不会包含这些数据。如果要挂载的话,可以在创建容器时挂载目录。
二、Dockerfile
1、一个文本文件,由一条条指令组成,当使用dockerfile文件来创建镜像时,会自上而下,分步执行
2、Dockerfile的语法很简单,由指令关键词和指令内容两部分组成,如【FROM scratch】
3、常用指令如下所示,我做了一下简单分类:
(1)文件类:
- FROM:指定父镜像,如果本地没有,则会从远程拉取
- COPY:复制本地文件到镜像中,不会自动解压
- ADD:复制本地或远程文件到镜像中,而且会自动解压
(2)设置类:
- ENV:环境变量,创建容器的时候,可以通过-e给环境变量重新赋值
- ARG:构建参数,在构建镜像的时候,可以使用的参数。先于环境变量,所以如果和环境变量重名,则会被环境变量覆盖。
- EXPOSE:设置容器运行时监听的端口,创建容器的时候,通过-p设置端口映射
- VOLUME:指定哪些目录可以挂载到数据卷,创建容器的时候,通过-v指定数据卷
- WORKDIR:指定进入容器后的默认目录
- USER:指定构建镜像时,执行RUN、CMD、ENTRYPONT等命令的用户
(3)命令类:
- RUN:docker build,即构建镜像时执行的linux命令,常用于安装软件,如在一个自制的CentOS镜像中安装vim
- CMD:docker run,即启动容器时默认执行的linux命令。最多只有一个,如果设置多个,则只执行最后一个。可以通过docker run时指定命令行参数来覆盖
- ENTRYPOINT:应该算是正宗的容器入口命令,也是在docker run时执行。如果即有ENTRYPOINT,又有CMD时,则只执行ENTRYPOINT,且CMD成为ENTRYPOINT的参数,所以可以通过在docker run时指定命令行参数来给ENTRYPOINT传递参数。也可以通过--entrypoint,在docker run时指令命令来覆盖
- 三个命令都可以使用两种格式,exec格式,如 CMD cmmand param1 param2 ;shell格式,如 CMD["command","param1","param2"]
(4)其它:
- MAINTAINER:描述作者信息
- LABEL:以键=值的方式,设置一些描述信息,可以代替MAINTAINER的作用
- SHELL:指定执行RUN、CMD、ENTRYPOINT等命令时,使用shell
- HEALTHCHECK:指定监测当前容器的健康检测命令
- ONBUILD:当存在ONBULID关键字的镜像作为基础镜像,当执行FROM完成之后,会执行ONBUILD中的命令
三、Dockerfile案例:使用dockerfile的方式,制作一个CentOS7的镜像,要求初始目标为/work,安装vim。
#创建一个dockerfiles目录,用于存放dockerfile
mkdir docker-files
cd docker-files
#创建dockerfile文件
vim centos_dockerfile
#文件内容如下:
FROM centos:7
LABEL author="functionMC"
RUN yum install -y vim
WORKDIR /work
CMD /bin/bash
#构建镜像
docker build -f ./centos_dockerfile -t mc_centos:1 .
#参数说明:
#-f:指定dockerfile的文件路径,例子为当前目录下的centos_dockerfile
#-t:指定镜像的名称和版本号