目录
1、docker简介
1.1、docker基本介绍
1、docker解决的问题
- 在传统的软件开发中,任务安装配置环境非常复杂,且过程冗余重复,尤其是在跨平台时软件的移植,部署;即便如此,仍然常常发生部署失败的状况。Docker的出现使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
2、docker的优势
- Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
- Linux容器技术的出现就解决了跨平台的问题,而 Docker 就是在它的基础上发展过来的。将应用和服务打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,可以一键部署到其他服务器,大大简化了操作。
- 总结:解决了运行环境和配置问题的软件容器, 方便做持续集成并有助于整体发布的容器虚拟化技术。
- 容器的优势:
- 一次构建、随处运行
- 更快速的应用交付和部署
- 更便捷的升级和扩缩容
- 更简单的系统运维
- 更高效的计算资源利用
1.2、容器与虚拟机比较
1、传统虚拟机技术
- 虚拟机(virtual machine)本质就是带环境安装(虚拟底层系统的软硬件资源)的一种解决方案。
- 它可以在一种操作系统里面运行另一种操作系统,比如在Windows10系统里面运行Linux系统CentOS7。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
- 传统虚拟机技术是基于安装在主操作系统上的虚拟管理系统(如:VIrtualBox、VMWare等),创建虚拟机(虚拟出各种硬件),然后在虚拟机上安装操作系统,并在操作系统上安装部署各种应用。
- 虚拟机的缺点:
- 资源占用多
- 冗余步骤多
- 启动慢
2、docker安装
docker官网:Docker: Accelerated Container Application Development
Docker Hub(仓库)官网: https://hub.docker.com/
2.1、安装基本环境
- 目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在CentOS 7 (64-bit)上;
- 要求系统为64位、Linux系统内核版本为 3.8以上,这里选用Centos7.x,虚拟运行内存至少4G。
- 查看centOS版本
- 命令:cat /etc/redhat-release
- 查看系统相关信息
- 说明:uname命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)
- 命令:uname -r
2.2、Docker的基本组成
- 镜像(image)
- Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
- 它也相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。
- 相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。
- 容器(container)
- 1、从面向对象角度
- Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。
- 就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。
- 容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
- 2、从镜像容器角度
- 可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
- 1、从面向对象角度
- 仓库(repository)
- 仓库(Repository)是集中存放镜像文件的场所。
- 类似于:
- Maven仓库,存放各种jar包的地方;
- github仓库,存放各种git项目的地方;
- Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。
- 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
- 公有仓库:最大的公开仓库是 Docker Hub(https://hub.docker.com/), 存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等
2.3、安装docker
- 官网安装文档:Install Docker Engine on CentOS | Docker Docs
- 1、卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 2、yum安装gcc相关
yum -y install gcc
yum -y install gcc-c++
- 3、安装需要的依赖工具包
sudo yum install -y yum-utils
- 4、设置stable镜像仓库,推荐使用国内镜像源,使用官网的镜像源可能出现连接失败,超时的情况
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 5、更新yum软件包索引
yum makecache fast
- 6、安装docker
yum -y install docker-ce docker-ce-cli containerd.io
- 7、启动docker
systemctl start docker
- 8、查看docker是否安装成功
docker version
2.4、卸载docker
- 卸载命令如下
# 关闭docker服务
systemctl stop docker
# 卸载docker
yum remove docker-ce docker-ce-cli containerd.io
# 删除docker相关文件
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
2.5、配置阿里云镜像加速器
- 1、先登录阿里云,然后进入镜像加速器工具,地址:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
- 2、复制脚本直接执行
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://vvfbuv5q.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2.6、helloworld示例
- 1、启动docker运行容器hello-world
doucker run hello-world
- 输出这段提示以后,hello world就会停止运行,容器自动终止
3、docker的常用命令
3.1、帮助启动类命令
启动docker: systemctl start docker
停止docker: systemctl stop docker
重启docker: systemctl restart docker
查看docker状态: systemctl status docker
开机启动: systemctl enable docker
查看docker概要信息: docker info
查看docker总体帮助文档: docker --help
查看docker命令帮助文档: docker 具体命令 --help
3.2、镜像命令
3.2.1、列出本机主机上的镜像
docker images
OPTIONS说明:
-a :列出本地所有的镜像(含历史映像层)
-q :只显示镜像ID。
- 各个选项说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签版本号
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小特别说明:
同一仓库源可以有多个 TAG版本,代表这个仓库源的不同个版本,使用 REPOSITORY:TAG 来定义不同的镜像。
如果不指定一个镜像的版本标签,例如只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像
3.2.2、搜索镜像
docker search [OPTIONS] 镜像名字
OPTIONS说明:
--limit : 只列出N个镜像,默认25个;示例:docker search --limit 5 redis
- 各个选项说明:
NAME:镜像名称
DESCRIPTION:镜像说明
STARS:点赞数量
OFFICIAL:是否是官方的
AUTOMATED:是否是自动构建的
3.2.3、拉取镜像
# 拉取最新版本的镜像,没有tag就是拉取最新版本
docker pull XXX XXX表示具体镜像名称 示例:docker pull ubuntu
等价于
docker pull XXX:latest# 拉取指定版本的名称
docker pull XXX:TAG TAG表示镜像的版本号 示例:docker pull redis:6.0.8
3.2.4、查看镜像/容器/数据卷所占空间
docker system df
3.2.5、删除镜像
# 删除单个镜像
docker rmi -f 镜像名称/镜像ID# 删除多个镜像
docker rmi -f 镜像名1:TAG 镜像名2:TAG# 删除所有镜像
docker rmi -f $(docker images -qa)
3.3、容器命令
3.3.1、启动/停止/删除容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明(常用):有些是一个减号,有些是两个减号
--name="容器新名字" 为容器指定一个名称;
-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);但实际是容器运行了然后又自动退出了
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用; 也即启动交互式容器(前台有伪终端,等待交互);
-P: 随机端口映射,大写P
-p: 指定端口映射,小写p
示例:
- 1、启动交互式容器
docker run -it ubuntu /bin/bash
说明:使用镜像ubuntu:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
参数详细说明:
-i: 交互式操作。
-t: 终端。
ubuntu : ubuntu 镜像。
/bin/bash:放在镜像名后的是命令,希望有个交互式 Shell,因此用的是 /bin/bash。
要退出容器,直接输入 exit;容器停止
- 2、停止、重启容器
# 停止容器
docker stop 容器ID或者容器名# 强制停止容器
docker kill 容器ID或容器名# 启动已停止运行的容器
docker start 容器ID或容器名# 重启容器
docker restart 容器ID或者容器名
- 3、删除容器
# 删除运行中的容器
方式一:先停止容器再删除docker stop 容器ID/容器名
docker rm 容器ID/容器名方式二:强制删除
docker rm -f 容器ID/容器名 【注意:rmi 表示删除镜像】
3.3.2、列出当前正在运行的所有容器
docker ps [OPTIONS]
OPTIONS说明(常用):
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n :显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
无参数:直接列出当前正在运行的所有容器
3.3.3、退出容器
- 1、退出并停止容器运行
# 在容器里面执行
exit
- 2、退出但不停止容器运行
# 在容器里面操作
ctrl + p + q
3.3.4、进入容器
- 1、启动守护式容器(后台服务器)
docker run -d 容器名 -d:指定容器的后台运行模式
- 问题:然后docker ps -a 进行查看, 会发现容器已经退出
- 特别说明:Docker容器后台运行,就必须有一个前台进程;注意有些容器可以使用-d参数启动,实现后台运行;有些容器不能使用-d参数启动
- 如:ubuntu不能使用-d参数启动;redis可以使用-d参数启动
- 原因分析:
- docker机制:容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),会自动退出
- 比如web容器,以nginx为例,正常情况下, 配置启动服务只需要启动响应的service即可。例如service nginx start ;
- 但是,docker这样做,docker为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀因为他觉得他没事可做了,所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行, 常见就是命令行模式,表示还有交互操作,不要中断。
- 解决方式:使用前台交互式方式启动,如:docker run -it redis:6.0.8 【此列的redis启动也可以使用-d参数】
- 特别说明:Docker容器后台运行,就必须有一个前台进程;注意有些容器可以使用-d参数启动,实现后台运行;有些容器不能使用-d参数启动
- 2、查看运行中容器日志
docker logs 容器ID
- 3、查看容器中运行的进程
docker top 容器ID
- 4、查看容器内部细节(包括停止和运行中的容器)
docker inspect 容器ID
- 5、进入正在运行的容器并以命令行交互(推荐)
- exec 是在容器中打开新的终端,并且可以启动新的进程 用exit退出,不会导致容器的停止。
docker exec -it 容器ID bashShell
- 6、重新进入容器
- attach 直接进入容器启动命令的终端,不会启动新的进程 用exit退出,会导致容器的停止。
docker attach 容器ID/容器NAME
3.3.5、容器导入导出(备份)
- 说明:将容器导出到当前主机,或将容器导入到当前的主机的docker中,实现容器备份。
1、导出容器
- export 导出容器的内容留作为一个tar归档文件[对应import命令]
docker export 容器ID > 文件名.tar 【默认导入到当前的文件目录下】
2、导入容器
- import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export] 【注意:导入的是一个镜像】
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号