Docker容器技术–基础篇01
Docker简介
什么是Docker
在真实项目中,整个项目分为开发环境、调试环境和生产环境三种不同的环境,而且这三种环境的使用通常不是同一类人员。常出现开发人员在自己的开发环境中将项目开发完成,交给调试人员进行调试,由于调试人员使用的调试环境与开发环境不同,可能产生很多BUG,因此调试人员需要将自己的调试环境修改为和开发环境相同,再进行项目调试;同理,将项目交给运维人员部署在生产环境中时,也需要重新构建与开发环境调试环境相同的生产环境,再推送项目。
上述逐个更新环境配置的操作太过复杂繁琐,因此出现了容器技术。容器技术通过虚拟化将原始环境一模一样地复制过来,这样就不需要再更新各类环境,因为从开发到生产使用的都是一个环境。
Docker是基于Go语言实现的云开源项目。通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP及其运行环境能够做到“一次镜像,处处运行”。
Linux容器技术的出现解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
一句话:解决了运行环境和配置问题的软件容器,方便做持久集成并有助于整体发布的容器虚拟化技术。
容器与虚拟机
-
传统虚拟机技术
虚拟机(virtual machine)是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在Windows10系统里面运行Linux系统CentOS7。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
虚拟机的缺点:
1 资源占用多2 冗余步骤多3 启动慢 -
容器虚拟机技术
由于前面虚拟机存在某些缺点,Linux发展出了另一种虚拟化技术:
Linux容器(Linux Containers,缩写为 LXC)
Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。Linux 容器不是模拟一个完整的操作系统而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
-
二者对比
- 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
- 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
- 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
下载地址
Docker安装
Docker的基本组成
- 镜像(image)
Docker 镜像就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建多个容器。
它也相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。 - 容器(container)
容器是镜像运行时的实体,及运行实例。 - 仓库(repository)
仓库是集中存放镜像文件的场所。
Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。
国内的公开仓库包括阿里云 、网易云等。
安装步骤
CentOS7安装Docker
- 首先确定系统为CentOS7及以上版本。
目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在CentOS 7 (64-bit)上,要求系统为64位、Linux系统内核版本为 3.8以上。cat /etc/redhat-release
- yum安装gcc相关组件。
yum install -y gcc gcc-c++
- 安装需要的软件包
yum install -y yum-utils
- 设置stable镜像仓库
官网设置(不推荐)
推荐设置(阿里云)yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 更新yum软件包索引
yum makecache fast
- 安装DOCKER CE
yum -y install docker-ce docker-ce-cli containerd.io
- 启动docker
systemctl start docker
- 测试
docker version docker run hello-world
- 卸载
systemctl stop docker yum remove docker-ce docker-ce-cli containerd.io rm -rf /var/lib/docker rm -rf /var/lib/containerd
镜像加速
由于Docker官方仓库地址在国外,国内使用会非常慢,因此我们可以配置国内镜像仓库地址,比如阿里云开发者平台等。
- 首先注册一个属于自己的阿里云账户(淘宝支付宝账户)
- 获得加速器地址链接
登录阿里云开发者平台
点击控制台
选择容器镜像服务
获取加速器地址
- 粘贴脚本直接执行
- 重启服务器
systemctl daemon-reload systemctl restart docker
Docker常用命令
帮助启动命令
- 启动/停止/重启docker
systemctl start docker systemctl stop docker systemctl restart docker
- 开机启动
systemctl enable docker
- 查看docker状态
systemclt status docker
- 查看docker概要信息
docker info
- 查看docker总体帮助文档
docker --help
- 查看docker命令帮助文档
docker 具体命令 --help
镜像命令
- 列出本地主机中的镜像
docker images [options] [options]说明: -a:列出本地所有镜像(含历史映像层) -q:只显示镜像ID
- 去docker仓库查找某个镜像
docker search [options] 镜像名 [options]说明: --limit:只列出N个镜像,默认25个 docker search --limit 5 redis
- 下载镜像
docker pull 镜像名[:TAG] [TAG]说明: 没有TAG就是最新版,等价于latest
- 删除镜像
docker rmi 镜像名 docker rmi -f 镜像ID # 删除单个 docker rmi -f 镜像名1:TAG 镜像名2:TAG # 删除多个 docker rmi -f $(docker images -qa) # 删除全部
- 查看镜像/容器/数据卷所占的空间
docker system df
扩展知识:虚悬镜像,即仓库名、标签都是的镜像,dangling image
容器命令
有镜像才能创建容器,这是根本前提
- 新建+启动容器
docker run [options] 镜像名 [command] [arg...] [options]说明: --name="容器新名字":为容器指定一个名称 -i:以交互模式运行容器,常与-t同时使用 -t:为容器重新分配一个伪输入终端,常与-i同时使用 -P:随机端口映射,大写P -p:指定端口映射,小写p
docker run -it centos /bin/bash 说明:使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令
- 列出当前所有运行的容器
docker ps [options] [options]说明: -a:列出当前所有容器,包括正在运行和已经停止的 -l:显示最近创建的容器 -n:显示最近n个创建的容器 -q:静默模式,只显示容器编号
- 退出容器
两种退出方式:exit和ctrl+p+qexit run进去容器,exit退出,容器停止 ctrl+p+q run进去容器,ctrl+p+q退出,容器不停止
- 启动/重启/停止容器
docker start 容器名 docker restart 容器名 docker stop 容器名
- 强制停止容器
docker kill 容器名
- 删除已停止的容器
一次性删除多个容器实例docker rm 容器名
docker rm -f $(docker ps -a -q) docker ps -a -q | xargs docker rm
重点命令
- 启动守护式容器(后台服务器)
大部分场景下,希望docker服务是在后台运行的,可以通过-d指定容器的后台运行模式docker run -d 容器名 注意:Docker容器后台运行,必须保证有一个前台进程,容器运行的命令如果不是一直挂起的命令(如top、tail),就会自动退出。
- 查看容器日志
docker logs 容器名
- 查看容器内运行的进程
docker top 容器名
- 查看容器内部细节
docker inspect 容器名
- 进入正在运行的容器并以命令行交互
exec和attach的区别docker exec -it 容器名 bashShell docker attach 容器名 # 重新进入
- attach直接进入容器启动命令的终端,不会启动新进程,用exit退出会导致容器停止
- exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出不会导致容器停止,因此推荐使用docker exec命令
- 从容器内拷贝文件到主机上
docker cp 容器名:容器内路径 目的主机路径
- 导入和导出容器
导入:import,从tar包中的内容创建一个新的文件系统再导入为镜像
导出:export,导出容器的内容留作为一个tar归档文件docker import 文件名.tar 镜像名:镜像版本号
docker export 容器名 > 文件名.tar
其他命令
- 通过Dockerfile定制镜像
docker build [options] 镜像名:镜像版本号 . [options]说明: -t:给镜像打标签 -f:指定某个文件来构建镜像 --target:指定阶段构建,对应多阶段构建的场景
- 提交当前容器为新的镜像
docker commit [options] 容器名 镜像名:镜像版本号 [options]说明: -a:提交的镜像作者 -m:提交时的说明文字 -p:在commit时,将容器暂停
- 创建一个新的容器
docker create [options] 镜像名 相当于run,但不启动容器,启动时还需执行start命令
- 查看docker容器变化
docker diff 容器名 用于比较一个Docker容器不同版本提交的文件差异
- 从docker服务获取容器实时事件
docker events [options] [options]说明: -f:根据配置条件过滤输出 --format string:通过给定的模板格式化输出 --since:展示从某个时间节点开始的所有事件 --until:展示截止到某时间节点的所有事件
- 查看指定镜像的创建历史
docker history [options] 镜像名 [options]说明: -H:以可读的格式打印镜像大小和日期,默认为true --no-trunc:显示完整的提交记录 -q:仅列出提交记录ID
- 从一个tar包中加载一个镜像
docker load -i 文件名.tar docker load < 文件名.tar
load与import的区别: 载入时,两者都会恢复为镜像,但import可以对镜像指定新名称及版本号,而load无法重命名
- 保存一个镜像为一个tar包
docker save -o 文件名.tar 镜像名:镜像版本号
save与export的区别: export保存的时容器,save保存的是镜像,export比save保存的包要小,因为save保存的是一个分层的文件系统,而export导出的只是一层文件系统
- 登录或退出一个docker registry
docker login [docker镜像仓库地址] docker logout [docker镜像仓库地址]
- 查看指定容器的端口映射
docker port 容器名 [PRIVATE_PORT[/PROTO]] PRIBATE_PORT:指定查询的端口 PROTO:协议类型(tcp、udp)
- 暂停/取消暂停容器的所有进程
docker pause 容器名 docker unpause 容器名
- 给容器打标签
docker tag 镜像名[:TAG] [REGISTRY/][USERNAME/]镜像名[:TAG]
- 阻塞运行直到容器停止,并打印退出代码
docker wait 容器名