目录
一、简介
Docker是基于Go语言实现的云开源项目。通过对应组件的封装、分发、部署、运行等生命周期的管理,使用户的应用及其运行环境能做到“一次镜像,处处运行”。
Docker将应用打包成镜像,通过镜像成为运行在docker容器上面的实例,而Docker容器在任何操作系统上都是一致的,实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机器上就可以一键部署,大大简化了操作。
Docker的出现解决了运行环境和配置问题的软件容器技术。方便做持续集成并有助于整体发布的容器虚拟化技术。
二、优点
1、更高效的利用系统资源:Docker对系统资源的利用率更高,无论是应用执行速度,内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机往往可以运行更多数量的应用。
2、更快速的启动时间:传统的虚拟机技术启动应用服务往往需要数分钟,而docker容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级,甚至毫秒级的启动时间,大大的节约了开发测试,部署的时间。)
3、一致的运行环境 :开发过程中常见的一个问题是环境一致问题,由于开发环境,测试环境,生产环境不一致,导致有些bug并未在开发过程中发现。 而Docker的镜像提供了除内核外完整的运行时环境,确保环境一致性,从而不会再出现“这段代码在我机器上没问题”这类问题。
4、持续支付和部署:对开发和运维人员来说,最希望就是一次创建和部署,可以在任意的地方运行。(定制应用镜像来实现集成、持续支付、部署。开发人员可以通过dockerfile来进行镜像构建,并结合持续集成系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署系统进行自动部署)。而且使用dockerfile使镜像构建透明化,不仅仅开发团队可以理解应用运行环境 ,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像)。
5、更轻松的迁移:由于Docker确保了执行环境的一致性,使得应用的迁移更加的容易。Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云、甚至是笔记本、其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
6、更轻松的维护和拓展:Docker使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得十分简单。此外,Docker团队同各个开源项目团队一起维护了一大批高质量的官网镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
三、基本组成
Docker的基本组成三要素:镜像(image)、容器(container)、仓库(repository)
镜像:可以看做是容器的模板。一个镜像可以生成多个同时运行的实例
容器:通过docker创建一个对应镜像的运行实例就是容器
仓库:存放镜像的地方
四、常用命令
1、基础命令
启动docker
systemctl start docker
关闭docker
systemctl stop docker
重启docker
systemctl restart docker查看docker状态
systemctl status docker
查看是否设置开机启动:
systemctl list-unit-files | grep enable设置开机启动
systemctl enable docker.service关闭开机启动
systemctl disable docker.service(之前有遇到过 设置开机启动后,重启docker失败。关闭开机启动即可)
查看docker概要信息
docker infodocker version
2、镜像命令
列出本地主机上的镜像
docker images
查找镜像
docker search 镜像名
拉取镜像
docker pull 镜像名
docker pull 镜像名:tag (版本号,不加版本号默认拉取最新版本latest)
查看镜像/容器/数据卷所占的空间
docker system df
删除单个镜像
docker rmi 镜像名 ID
-f 强制删除
删除多个
docker rmi -f 镜像名1:TAG 镜像名2:TAG
删除全部
docker rmi -f $(docker images -qa)
3、容器命令
创建启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行); -i:以交互模式运行容器,通常与 -t 同时使用; -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用; 也即启动交互式容器(前台有伪终端,等待交互); -P: 随机端口映射,大写P -p: 指定端口映射,小写p
启动容器
docker start 容器名称/容器id
停止容器
docker stop 容器名称/容器i
重启容器
docker restart 容器名称/容器id
docker run是利用镜像生成容器并启动,而docker start是启动一个之前生成过的容器
列出当前正在运行的容器
docker ps
列出所有容器
docker ps -a
-a :列出当前所有正在运行的容器+历史上运行过的 -l :显示最近创建的容器。 -n :显示最近n个创建的容器。 -q :静默模式,只显示容器编号
退出容器 ,有两种退出方式
① exit (run进去容器,exit退出,容器停止)
② ctrl+p+q (run进去容器,ctrl+p+q退出,容器不停止)
强制停止容器
docker kill 容器id/容器名称
删除已停止的容器
docker rm -f 容器id/容器名称
删除多个容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
拓展:xargs 可以读取标准输入和管道符号中的数据,用于弥补有些命令(如echo、kill、rm)不能从管道中读取数据的不足。
查看容器日志
docker logs 容器id/容器名称
-f :跟踪实时日志 -t :显示时间戳 --tail :仅列出最新N条容器日志 --since :显示某个时间至今的所有日志 --until :显示某个时间之前的所有日志
查看容器内运行的进程
docker top 容器id/容器名称
查看容器内部细节
docker inspect 容器id/容器名称
进入正在运行的容器并以命令行交互
docker exec -it 容器id/容器名称 /bin/bash
重新进入
docker attach 容器id/容器名称
attach与exec的区别:
attach 直接进入容器启动命令的终端,不会启动新的进程。用exit退出,会导致容器的停止,
exec 是在容器中打开新的终端,并且可以启动新的进程。用exit退出,不会导致容器的停止
在日常工作中,推荐大家使用 exec 命令
从主机内拷贝文件到容器上
docker cp 主机路径 容器id:容器内路径
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 主机路径
导入和导出容器:
导出:export (docker export 容器ID > 文件名.tgz)
导入:import (cat 文件名.tgz | docker import - 镜像用户/镜像名:镜像版本号)
导入和导出镜像:
导出:docker save 镜像名 > 文件名.tar
导入:docker load < 文件名.tar区别:
docker import 可以为镜像指定新名称
docker load 不能对载入的镜像重命名
export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
而 save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)
docker commit 提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:版本号
4、容器数据卷
容器数据卷:将docker容器内的数据保存进宿主机的磁盘中,实现数据备份、数据持久化,完全独立于容器的生命周期。实现容器与宿主机内容共享。
挂载数据卷:
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
--privileged=true #开启权限(root)
-v #挂载数据卷:参数可使用多次来挂载不同的目录
读写rw :默认为rwdocker run -it -privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
只读ro :容器内部被限制,只能读取不能写docker run -it -privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
容器卷的继承与共享:容器2继承容器1的卷规则:容器1和2是两个独立的容器,互不影响
docker run -it --privileged=true --volumes-from 父类 镜像名重要的容器实例一定要挂载容器数据卷!(mysql、redis。。。之类的容器)
5、Dockerfile
5.1、Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
构建三步骤:
①、编写Dockerfile文件
②、docker build 命令构建镜像
③、docker run 运行镜像创建容器实例
5.2、Dockerfile常用指令
指令 | 说明 |
---|---|
FROM | 指定基础镜像,第一条命令必须是from |
MAINTAINER | 介绍作者信息 |
RUN | 容器构建时需要运行的命令。 两种模式:RUN <命令行命令> RUN ["可执行文件","参数1","参数2"] |
EXPOSE | 当前容器对外暴露出的端口 |
WORKDIR | 指定在创建容器后,终端默认登陆进来的工作目录 |
USER | 指定该镜像以什么用户去执行,如果都不指定,默认是root |
ENV | 用来在构建镜像过程中设置环境变量 |
ADD | 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压压缩包 |
COPY | 类似ADD,拷贝文件和目录到镜像中 |
VOLUME | 容器数据卷,用于数据保存和持久化工作 |
CMD | 指定容器启动时要运行的命令 |
ENTRYPOINT | 类似CMD,指定容器启动时要运行的命令 |
注意:
CMD和run的区别:CMD是在docker run 时运行;RUN是在 docker build时运行
Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD会被 docker run 之后的参数替换。
CMD和ENTRYPOINT的区别:ENTRYPOINT不会被docker run后面的命令覆盖, 而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
5.3、构建镜像 docker build
docker build -t 镜像名:tag . -f dockerfile文件
docker build 命令最后有一个 点。. 表示当前目录
-t 指定镜像名称 -f 指定某个文件来构建镜像,不指定的话文件名必须是默认的Dockerfile
UnionFS 联合文件系统
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
虚悬镜像
虚悬镜像:仓库名、标签都是<none>的镜像,俗称dangling image
虚悬镜像已经失去存在价值,可以删掉
查看:docker image ls -f dangling=true
删除:docker image prune