一、构建镜像
在构建docker镜像之前,需要指明,并不是所有的程序都需要自行通过Dockerfile构建镜像。Docker Hub上有大量的高质量的镜像可以用,我们可以直接pull下来这些镜像使用,详情可以参考链接。但是这些镜像大都是一些公共镜像,不能很好的符合业务定制化要求。故而我们大都使用Dockerfile构建镜像。
我们主要介绍Dockerfile构建自定义镜像。
镜像的定制实际上就是定制每一层所添加的配置、文件。
如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,
那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
下面我们先看一则Dockerfile,之后会介绍每一条指令。
FROM - 指定基础镜像
所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 nginx
镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM
就是指定 基础镜像,因此一个 Dockerfile
中 FROM
是必备的指令,并且必须是第一条指令。在Docker Hub上有非常多的高质量的官方镜像,有可以直接拿来使用的服务类的镜像,如redis、mysql等;也有一些方便开发、构建、运行各种语言应用的镜像,如python、golang等。可以在其中寻找一个最符合我们最终目标的镜像为基础镜像进行定制。
RUN - 执行命令
RUN就像 Shell 脚本一样可以执行命令
WORKDIR - 指定工作目录
使用WORKDIR可以指定工作目录,以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR会帮你建立目录。
COPY - 指定文件
COPY指令将从构建上下文目录中 <源路径>
的文件/目录复制到新的一层的镜像内的 <目标路径>
位置。
CMD - 容器启动命令
之前介绍容器的时候曾经说过,Docker 不是虚拟机,容器就是进程。既然是进程,那么在启动容器的时候,需要指定所运行的程序及参数。CMD
指令就是用于指定默认的容器主进程的启动命令的。
Docker还有很多指令,详情可以参考链接
二、Docker基本命令
(1)docker build - 编译镜像
docker build -t slave . 【更多详情】【最后的点一定要添加,这是指定Dockerfile路径的标记】
(2)docker run - 启动容器
docker run --name slave -d slave【更多详情】【-d 是指该容器使用哪个镜像】
(3)docker images - 查看镜像
docker images
可以看出第一列是镜像名称;第二列是TAG,可以一个repository有多个tag,通常tag是时间;第三列是image id,算是唯一标识符;第四列是创建时间;第五列是镜像大小。
(4)docker ps -a - 查看容器
docker ps -a
第一列是容器的id,唯一标识符;第二列是该容器使用的镜像;第三列是容器的启动命令,对应Dockerfile中的CMD命令;第四列是容器创建时间;第五列是容器的状态;第六列是容器抛出来的端口,如果不是api则不需要容器抛出端口;第七列是容器的名称。
(5)docker logs 容器名 - 查看容器打印的日志
doker logs slave【Dockerfile 中的CMD ["python", "-u", "slave.py"]的就是将程序的输出打印成log,其中-u的意思是消除缓存直接打印出来,若不加-u参数,则容器会在slave.py都运行完之后,才显示打印结果,不能及时看到打印的输出】
(6)docker stop 容器名 - 停止容器
docker stop slave 或 docker stop f758c7c1f37
(7)docker container prune - 删除所有停止的容器
docker container prune
(8)docker rm 容器名 - 删除容器
docker rm slave 或 docker rm f758c7c1f37
(9)docker rmi 镜像名 - 删除镜像
docker rmi slave 或 docker rmi f758c7c1f37
(10)docker exec -it 容器名 /bin/bash - 进入容器
docker exec -it slave /bin/bash 【更多详情】