Docker
前提简介
镜像:就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建多个容器。
容器:是用镜像创建的运行实例。Docker利用容器独立运行的一个或一组应用。
它可以被启动、开始、停止、删除。每个容器是相互隔离的、保证安全的平台,可以把容器看作一个简易版的Linux环境和运行在其中的应用程序。
仓库:是集中存放镜像文件的场所。
镜像命令
docker images:查看本地的镜像
docker search:搜索镜像名称
docker pull:下载镜像,如果没有跟上版本号,就是默认下载最新版本
docker rmi:删除镜像
docker commit:提交一个容器副本使之成为一个新的镜像
容器命令
docker run [options] images [command] [arg]:创建并启动容器
[options]细节:
–name= 容器的名字:为容器指定一个别名
-d:后台运行容器,并返回容器ID,也即启动守护式容器
-i:以交互式模式运行容器,通常与 -t 一起使用
-t:为容器重新分配一个伪输入终端,通常与 -i 一起使用
-P:随机端口映射
-p:指定端口映射
docker ps [options]:查看运行的容器
[options]细节:
-a:列出当前所有正在运行的容器+历史上运行过的
-l:显示最近创建的容器
-n:显示最近创建的n个容器
-q:静默模式,只显示容器编号
–no-trunc:不截断输出
docker exit:容器停止并退出
另:ctrl+P+Q:容器不停止退出
docker start 容器名称/ID:启动容器
docker restart 容器名称/ID:重启容器
docker stop 容器名称/ID:停止容器
docker kill 容器名称/ID:强制停止容器
docker rm 容器名称/ID:删除已停止的容器
docker attach 容器名称/ID:进入已经退出但正在运行的容器
docker exec -it 容器名称/ID bashShell:在外边执行容器内的操作
docker cp 容器名称/ID:文件位置 宿主机位置 :拷贝容器内的文件到宿主机
Docker镜像
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、库、环境变量和配置文件
UnionFS
UnionFS是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同的目录挂载到同一个虚拟文件系统下,UnionFS是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面来看,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的问价系统会包含所有底层的文件和目录。
Docker 容器数据卷
数据卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union FS 提供一些用于持续存储或共享数据的特性
卷的目的就是数据的持久化,完全独立于容器的生命周期,因此Docker不会在删除容器的时候删除其挂载的数据卷
特点:
- 数据卷可以在容器间共享或重用数据
- 卷中的修改可以直接生效
- 数据卷的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
容器内添加
- 直接命令添加
docker run -it -v /宿主机绝对路径目录 : /容器内目录 镜像名
- DockerFile添加
数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,被称为数据卷容器
容器之间配置信息的传递,数据卷的生命周期一致持续到没有容器使用它为止
DockerFile
Dockerfile 是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本
步骤:
- 手动编写一个dockerfile文件,必须符合file规范
- 有这个文件之后,直接docker build 命令执行,获得一个自定义的镜像
- docker run
centos的dockerfile
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /
LABEL org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20190305"
CMD ["/bin/bash"]
scratch:是所有镜像的祖先镜像(类似于Java中Object类的关系)
Dockerfile内容基础知识
- 每条保留字指令必须大写字母且后面要跟有至少一个参数
- 指令从上到下顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
Docker执行dockerfile的大致流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器进行修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚才的镜像运行一个新的容器
- 执行dockerfile中的下一条指令,直到所有指令执行完成
保留字指令
FROM :基础镜像,当前编写的镜像基于哪个镜像的
MAINTAINER:镜像维护者的姓名和邮箱地址
RUN:容器构建时需要运行的命令
EXPOSE:当前容器对外暴露的端口号
WORKDIR:指定在创建容器后,终端默认登陆的进来工作的目录
ENV:用来在构建镜像的过程中设置环境变量
ADD:将宿主机目录下的文件拷贝到镜像且自动处理URL和解压tar压缩包
COPY:将从构建上下文目录中<源路径>的文件/目录复制到新的一层镜像内的<目标路径>位置
VOLUME:容器数据卷,用于数据持久化工作
CMD:指定一个容器启动时要运行的命令
(dockerfile中可以有多个CMD命令,但只有最后一个生效,CMD会被docker run之后的参数替换)
ENTRYPOINT:指定一个容器启动时要运行的命令
(但是docker run 之后的参数不会替换,而是追加到后面)
ONBUILD:当构建一个被继承的dockerfile时运行命令,父镜像在被子镜像继承后父镜像的onbuild被触发
利用Dockerfile自定义一个centos镜像
- 在宿主机上面用vim编译Dockerfile文件
vim Dockerfile
- 简单的内容如下
#继承于哪个镜像
FROM centos
#镜像创建者姓名和邮箱
MAINTAINER xb<22333@qq.com>
#环境变量
ENV MYPATH usr/local
#终端进入时的工作目录
WORKDIR $MYPATH
#build时运行的命令
RUN mkdir p
#对外暴露的端口
EXPOSE 80
#容器启动时运行的命令
CMD echo $MYPATH
CMD echo "success ----- ok"
CMD /bin/bash
- build构建Dockerfile文件(最后面有个点)
docker build -f Dockerfile -t mycentos:1.2 .
- 查看自定义的镜像
docker images
- 运行容器
docker run -it mycentos:1.2
可以看到终端进入容器后默认的目录被改为了 local,并且在建立了 p 文件夹
- 查看镜像变更历史
docker history eeb1dfcf4e9b