docker
是一个用于开发、交付和运行应用程序的开放平台,能够将应用程序和基础架构分开,以便于快速交付软件,部署代码等。
- 快速、一致的交付应用程序
- 响应式部署和扩展
- 同一硬件上运行更多的工作负载
架构图(来自docker官网)
镜像(image)
是创建容器的只读模板,镜像可以是基于另一个镜像做一些额外的定制,比如把java项目打包成一个镜像可以基于openjdk1.8的一个镜像制作一个镜像。
Docker中的分层是指Docker镜像由多个只读层组成的特性。每个层都包含了Docker容器的文件系统中的某些文件或文件夹,每个层都是只读的,因此对于已存在的层来说,任何的更改都将创建一个新的层,可以通过docker history --no-trunc image
去查看镜像镜像历史记录的列表也就是镜像的每个层。
联合文件系统是指在Docker容器启动时,这些层将被“堆叠”成为一个单一的文件系统。这种文件系统的特性是它可以汇聚多个分层文件系统,并且每个分层文件系统都不会对其他分层文件系统造成影响。
Dockerfile
Dockerfile 是一个包含了一组指令的文本文件,用来告诉Docker如何构建Docker镜像。Dockerfile中的每一行都会在现有的层之上创建一个新的层,每个指令都对应着一个镜像构建过程中的一个步骤。 Dockerfile和分层关系密切,因为Dockerfile中每一个指令都会生成一个新的分层,最终这些分层会被合并成一个完整的Docker镜像。使用Dockerfile的好处是可以自动化镜像的构建过程,并且可以高效地利用Docker的分层机制来优化镜像的大小和构建速度。
容器(Container)
是镜像的可运行实例,有点类似于java中的类和实例对象的关系。
常用命令
基础命令
-
启动docker:
systemctl start docker
-
关闭docker:
systemctl stop docker
-
重启docker:
systemctl restart docker
-
设置docker开机自启动:
systemctl enable docker
-
查看docker运行状态:
systemctl status docker
镜像命令
- 查看镜像列表:
docker images
- 拉取镜像:
docker pull imageName:Tag
(imagename:镜像名,Tag:版本号)
- 搜索镜像:
docker serach imageName
- 删除镜像:
docker rmi imageId/imageName
- 强制删除镜像:
docker rmi -f imageId/imageName
- 查看镜像/容器数据卷占用空间:
docker system df
- 根据dockfile创建镜像:
docker build [OPTIONS] PATH
常用的 [OPTIONS]主要是 -t 给镜像命名和标记格式 “name:tag”,PATH是dockerfile所在目录.代表当前目录。例如:docker build -t firstDemo:v1.0 .
容器命令
-
正在运行容器列表:
docker ps
-
所有容器列表:
docker ps -a
-
访问到容器里:
docker exec -it 容器名称/容器id PATH
-
推出容器:
exit
-
停止容器:
docker stop 容器名称/容器id
-
删除容器:
docker rm 容器id/容器名称 容器id/容器名称 容器id/容器名称
-
强制删除容器:
docker rm -f 容器id/容器名称 容器id/容器名称 容器id/容器名称
-
运行容器:
docker run [OPTIONS] IMAGE [COMMAND]
常见的[OPTIONS]有 -d 在后台运行容器并打印id、–name 给容器命名(格式 :“–name firstDemo”)、-p 将容器端口发布到主机(格式:“-p 8080:8191”)
-p 8080:8191 标识容器内部的8091端口和本地主机的端口8080进行映射,通过本地主机的8080端口就可以访问到容器的8191端口。
例子:docker run -it -d --name firstDemoContainer -p 8081:8081 firstDemoImage bin/bash
- 查看docker容器日志:
docker logs [OPTIONS] CONTAINER
例:dcker logs --tail=500 e931f0769a61
Dockerfile构建
Dockerfile语法
FROM:指定基于哪个一个基础镜像构建
- FROM : #指定镜像名称+版本号不加版本号默认latest即最新版
- FROM @ #指定镜像名称+校验序列号
例:
FROM java:8
#使用镜像名称为java的镜像版本号为8
RUN:镜像构建时需要执行的命令
- RUN
- RUN [“executable”, “param1”, “param2”]
例:
RUN echo success
RUN ["echo","success"]
**MAINTAINER:指定该Docker镜像的维护者信息。 **
例:
MAINTAINER Minums <Minums@example.com>。
COPY:将文件从主机复制到镜像里
例:
COPY first-demo.jar homw/www/firstDemo.jar
ADD:将宿主机上的文件或目录复制到Docker镜像中
例:
ADD first-demo.jar homw/www/firstDemo.jar
**WORKDIR:在镜像中指定工作目录 **
例:
WORKDIR /home/www/work
CMD:指定容器启动后所执行的默认命令。
例:
CMD ["nginx", "-g", "daemon off;"]
LABEL:为Docker镜像添加元数据
例:
LABEL version="1.0" description="This is a sample Docker image"
EXPOSE:声明容器将运行服务的端口号
例:
EXPOSE 80
ENV:设置Docker容器的环境变量
例:
ENV MY_NAME="John Smith"
VOLUME:将宿主机上的目录映射到Docker容器中的指定目录,以便在容器中存储数据
例:
VOLUME ["/data"]
ENTRYPOINT:配置容器的入口程序
例:
ENTRYPOINT ["nginx", "-g", "daemon off;"]
USER:指定容器运行时的用户名或UID
例:
USER www-data