参考文章:【详谈】一文带你认识 Docker 与 k8s - 掘金 (juejin.cn)
Docker与虚拟机对比
虚拟机,就是在你的操作系统里面,装一个软件,然后通过这个软件,再模拟一台甚至多台“子电脑”出来。 在 “子电脑” 里,你可以和正常电脑一样运行程序,例如登录 QQ。如果你愿意,你可以变出好几个 “子电脑”,里面都登录上 QQ。“子电脑” 和 “子电脑” 之间,是相互隔离的,互不影响。
虚拟机属于虚拟化技术。而 Docker 这样的容器技术,也是虚拟化技术,属于轻量级的虚拟化。
虚拟机虽然可以隔离出很多 “子电脑”,但占用空间更大,启动更慢,虚拟机软件可能还要花钱(例如:VMWare)。
而容器技术恰好没有这些缺点。它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境(类似 “沙箱”)。Docker 可以轻松创建容器和基于容器的应用程序,最初是为 Linux 构建的,现在也可以在 Windows 和 MacOS 上运行。
它启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个 Docker 容器)。此外,它占的空间很小,虚拟机一般要几 GB 到几十 GB 的空间,而容器只需要 MB 级甚至 KB 级。
正因为如此,容器技术受到了热烈的欢迎和追捧,发展迅速。大家需要注意,Docker 本身并不是容器,它是创建容器的工具,是应用容器引擎。想要搞懂 Docker,其实看它的两句口号就行。
第一句,是 “Build, Ship and Run” 。
第二句口号则是: “Build once,Run anywhere(搭建一次,到处能用)”。 、
- Build(构建镜像) : 镜像就像是集装箱,包含文件以及运行环境等等资源;
- Ship(运输镜像) :在宿主机和仓库间进行运输,这里仓库就像是超级码头;
- Run(运行镜像) :运行的镜像就是一个容器,容器就是运行程序的地方。
⭐说白了,这个 Docker 镜像,是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如:环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
⭐综上所述,Docker 的运行过程,也就是去仓库把镜像拉到本地,然后用执行命令把镜像运行起来变成容器,这也就是为什么人们常常将 Docker 称为码头工人或码头装卸工。
⭐负责对 Docker 镜像进行管理的,是 Docker Registry 服务(类似仓库管理员)。当然,不是任何人建的任何镜像都是合法的。万一有人构建的镜像存在问题呢?所以,Docker Registry 服务对镜像的管理是非常严格的。最常使用的 Registry 公开服务,是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。
Docker的优势
开发人员编写代码,在自己本地环境测试完成后,将代码部署到测试或生产环境中,经常会遇到各种各样的问题。明明本地完美运行的代码为什么部署后出现很多 bug,原因有很多:不同的操作系统、不同的依赖库等,总结一句话就是因为本地环境和远程环境不一致。
容器化技术正好解决了这一关键问题,它将软件程序和运行的基础环境分开。开发人员编码完成后将程序打包到一个容器镜像中,镜像中详细列出了所依赖的环境,在不同的容器中运行标准化的镜像,从根本上解决了环境不一致的问题。
-
可移植性:不依赖具体的操作系统或云平台,比如在阿里云或腾讯云直接随意迁移。
-
占地小:容器只需要其应用程序以及它需要运行的所有容器和库的依赖清单,不需要将所有的依赖库都打包在一起。
-
共享 bin 和 lib:不同的容器可以共享 bin 和 lib,进一步节省了空间。
Docker基本组成
在Docker里,容器、镜像和仓库是三个比较重要的概念。其中,镜像(image)是一个静态的概念,比如可以把一个最小化的Linux操作系统打包成一个镜像再传入仓库,也可以先在Linux上安装Redis,再把整合这两者的二进制流打包成一个镜像。
操作系统、Docker和容器的关系图
在实际项目里,**用Docker命令从仓库中下载镜像**,比如Linux+Redis镜像,然后通过命令启动镜像,这样就可以使用镜像里的Redis等应用了。镜像是静态的,有些类似于Java里的类,而容器是镜像运行时的实体,也可以理解成由类实例化而成的对象,通过run命令能运行镜像生成容器。。通过Docker加容器的方式,可以快速地在Windows平台上搭建基于Linux的Redis环境。
镜像、容器、仓库的具体介绍如下:
镜像
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。
容器
Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。
容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台
仓库
仓库(Repository)是集中存放镜像文件的场所。
类似于,Maven仓库,存放各种jar包的地方;github仓库,存放各种git项目的地方;
Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub (hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等
总结
镜像文件
image 文件生成的容器实例,本身也是一个文件,称为镜像文件。
容器实例
一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
仓库
就是放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库中拉下来就可以了。
Docker安装
安装步骤
先安装Linux系统,建议7版本以上
- 通过
[ uname -r ]命令查看你当前的内核版本是否高于 3.10 - 使用 root 权限
[sudo yum update],确保 yum 包更新到最新 - 安装需要的软件包
[sudo yum install -y yum-utils device-mapper-persistent-data lvm2] - 设置yum源
[sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo] - 安装最新稳定版docker
[sudo yum install docker-ce] - 启动并加入开机启动
[sudo systemctl start docker]、[sudo systemctl enable docker] - 验证是否安装成功
[docker version]\
阿里云镜像加速
阿里云地址: promotion.aliyun.com/ntms/act/ku…
-
注册一个属于自己的阿里云账户(可复用淘宝账号)
-
获得加速器地址连接--登陆阿里云开发者平台--控制台--容器镜像服务–获取加速器地址
可以直接复制以下命令:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://9joy2jdh.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker常用命令
帮助启动类命令
- 启动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
镜像命令
-
列出本地主机上的镜像:
docker images各选项说明:
REPOSITORY:表示镜像的仓库源 TAG:镜像的标签版本号 IMAGE ID:镜像ID CREATED:镜像创建时间 SIZE:镜像大小OPTIONS说明:
-a :列出本地所有的镜像(含历史映像层) -q :只显示镜像ID。 -
搜索镜像:
docker search [OPTIONS] 镜像名字
docker search [OPTIONS] 镜像名字--limit : 只列出N个镜像,默认25个)例如:
docker search mysql
docker search --limit 5 mysql -
拉取镜像:
docker pull + 镜像名字 -
查看镜像/容器/数据卷所占的空间:
docker system df -
删除镜像:
- 删除单个镜像
docker rmi 镜像ID - 删除多个镜像
docker rmi 镜像ID 镜像ID 镜像ID
注意:如果通过某个镜像创建了容器,则该镜像无法删除。 解决办法:先删除镜像中的容器,再删除该镜像。
- 删除单个镜像
- 查看所有镜像ID:
docker rmi docker images -q
容器命令
- 查看正在运行的容器:
docker ps
- IMAGE :所属镜像
- COMMAND :
- CREATED :创建时间
- STATUS :容器状态
- PORTS :端口
- NAMES :容器名称\
例如:查看停止的容器:`docker ps -f status=exited`
查看所有的容器(停止+运行):docker ps -a
查看最后一次运行的容器:docker ps -l
列出最近创建的 n 个容器:docker ps -n 5
-
创建与启动容器:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]\-i :表示运行容器; -t :表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端; --name :为创建的容器命名; -v :表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个 -v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上; -d :在 run 后面加上 -d 参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登 录容器,如果只加 -i -t 两个参数,创建容器后就会自动进容器里); -p :表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个 -p 做多个端口 映射。 -P :随机使用宿主机的可用端口与容器内暴露的端口映射。 例如: 创建并进入容器--通过镜像 AA 创建一个容器 BB,运行容器并进入容器的 /bin/bash :docker run -it --name 容器名称 镜像名称:标签 /bin/bash - 退出当前容器:exit - 守护式方式创建容器:docker run -di --name 容器名称 镜像名称:标签 **(推荐)** - 登录守护式容器方式:docker exec -it 容器名称|容器ID /bin/bash -
停止与启动容器
- 停止容器 :
docker stop 容器名称|容器ID - 启动容器 :
docker start 容器名称|容器ID\
- 停止容器 :
-
文件拷贝
-
将文件拷贝进容器:
docker cp 需要拷贝的文件或目录 容器名称:容器目录 -
从容器拷贝出文件:
docker cp 容器名称:容器目录 需要拷贝的文件或目录
-
-
目录挂载(容器数据卷操作)
什么是目录挂载:以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改 宿主机某个目录的文件从而去影响容器,而且这个操作是双向绑定的,也就是说容器内的操作也会影响 到宿主机,实现备份功能。但是容器被删除的时候,宿主机的内容并不会被删除。如果多个容器挂载同一个目录,其中一个容 器被删除,其他容器的内容也不会受到影响。 例如:
docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7\- 多目录挂载 :
docker run -di -v /宿主机目录:/容器目录 -v /宿主机目录2:/容器目录2 镜像名 - 匿名挂载--匿名挂载只需要写容器目录即可,容器外对应的目录会在 /var/lib/docker/volumes 中生:
docker run -di -v /usr/local/data --name centos7-02 centos:7 - 具名挂载--具名挂载就是给数据卷起了个名字,容器外对应的目录会在
docker run -di -v docker_centos_data:/usr/local/data --name centos7-03 centos:7 - 查看 volume 数据卷(--持久化存储)信息:
docker volume ls - 查看目录挂载关系: docker volume inspect 数据卷名称 /
docker inspect 容器ID或名称 查看返回json中的Mounts
- 多目录挂载 :
-
设置读写权限
- 只读--只有宿主机内可以对容器进行数据管理:
docker run -it -v /宿主机目录:/容器目录:ro 镜像名 - 读写(默认):宿主机和容器可以进行双向的数据操作:
docker run -it -v /宿主机目录:/容器目录:rw 镜像名
- 只读--只有宿主机内可以对容器进行数据管理:
-
容器继承:
- 容器 centos7-01 指定目录挂载
docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01centos:7 - 容器 centos7-04 和 centos7-05 相当于继承 centos7-01 容器的挂载目录
docker run -di --volumes-from centos7-01:ro --name centos7-04 centos:7
docker run -di --volumes-from centos7-01:rw --name centos7-05 centos:7
-
查看容器的IP地址
- 查看容器元信息:
- 直接输出IP地址:
docker inspect --format=‘{{.NetworkSettings.IPAddress}}’ 容器名称|容器id
-
删除容器
- 删除指定容器:
docker rm 容器名称|容器id - 删除多个容器:
docker rm 容器名称|容器id 容器名称|容器id
- 删除指定容器: