开发和运维的交互流程存在重大问题,通过Docker的镜像技术,打包开发运行代码的所有运行环境,将整个镜像交给运维上线,就不会出现交互流程出现问题,代码不能上线测试。
一句话总结:解决了运行环境和配置问题的软件容器,
方便做持续集成并有助于整体发布的容器虚拟化技术。一次镜像,处处运行
传统虚拟机缺点:资源占用多,启动速度慢,冗余步骤多。
Linux容器化技术:将某一个软件运行所需要的全部资源打包到一个隔离的容器中。容器和虚拟机不同,容器不需要捆绑一整套的操作系统
Docker容器化技术: 是直接复用本地的操作系统,而传统的虚拟机则是在硬件层面实现虚拟化。和传统虚拟机的相比,Docker容器化技术,启动速度更快,占用体积小。
Docker为什么比虚拟机快- Docker有比虚拟机更少的抽象层,不需要像虚拟机一样虚拟硬件资源,会直接复用宿主机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
- docker利用的是宿主机的内核,而不需要加载操作系统OS内核
- 当Docker启动一个容器时,不需要启动再次加载操作系统内核,会直接复用,进而避免某些耗时的资源加载过程。当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。
基于容器化技术、开发/运维新一代Devops工程师。能快速的搭建节点。
更高效的系统资源利用, 更快速的应用交付和部署。。。。。
Docker的基本组成 三大要素-
镜像:Docker镜像是一个模板,可以通过这个镜像来创建多个容器。它相当于Java中的类,而容器相当于Java中的对象。容器是镜像的具体实现。
-
容器:Docker利用容器运行一个个的应用。容器是利用镜像创建的运行实例。容器给镜像提供了一个标准的隔离和运行的环境。每个容器都是相互隔离的。可以看成一个小型的Linux系统,只加载容器中应用必要的Linux环境
-
仓库:
- 就是放镜像的地方,打包好的镜像放在仓库中,类似于Maven的中央仓库存放Jar包。官方提供了官方的Docker仓库,是Docker Hub。
- 仓库分为私有仓库,共有仓库。
- 最大的公开仓库是 Docker Hub(https://hub.docker.com/),国内有阿里云、网易云提供的公有仓库。
运行docker run 命令时,会先在本地仓库查找镜像,本地仓库没有再去远程仓库中查找,远程仓库还没有就会报错。
Docker工作原理Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。相当于系统中运行了一个服务。
小总结:需要正确的理解仓库/镜像/容器这几个概念:
- Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。
- image文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
- Docker每个容器都是一个小型的Linux系统
官网:docker官网:http://www.docker.com
仓库:Docker Hub官网: https://hub.docker.com/
Docker安装 前提说明Docker依赖于Linux内核环境,所以Docker只能在已经运行的Linux上运行。
Docker安装步骤-
确保是CentOS7以上的版本。
-
执行命令卸载旧版本Docker,如果yum报告这些依赖都没有安装,则进行下一步。
yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
-
yum安装gcc相关
-
yum -y install gcc yum -y install gcc-c++
-
设置Docker拉取镜像的仓库
sudo yum install -y yum-utils sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
更新yum软件包索引
yum makecache fast
-
安装 Docker Engine
sudo yum install docker-ce docker-ce-cli containerd.io
-
配置阿里云镜像加速(加快镜像拉取速度)
进入阿里云的控制中心
https://home.console.aliyun.com/home/dashboard/ProductAndService
-
执行shell命令
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [“..........”] #你自己的阿里云加速器地址 } EOF sudo systemctl daemon-reload sudo systemctl restart docker安装完成。
-
通过运行hello-world来检测是否正确安装
-
sudo docker run hello-world
有这个界面代表正确安装完成
卸载DockerDocker命令 帮助启动类命令 启动Dockeryum remove docker-ce docker-ce-cli containerd.iorm -rf /var/lib/docker rm -rf /var/lib/containerd
systemctl start docker查看Docker状态
systemctl status docker重启docker:
systemctl restart docker开机自启Docker
systemctl enable docker停止Docker
systemctl stop docker查看Docker的概要信息
docker info查看Docker总体帮助文档
docker --help查看Docker命令帮助文档
docker 具体命令 --help镜像命令 列出本地主机上的镜像
docker images -options
- -options :
- -q :只显示镜像ID。
- -a: -a :列出本地所有的镜像(含历史映像层)
- REPOSITORY:镜像的名字
- TAG:镜像的版本(lastest :代表最新版)
- IMAGE ID :镜像的唯一标识
- CREATED:镜像的创建时间
- SIZE:镜像的大小
docker pull 镜像名:版本 #(版本可以忽略不写,不写默认就是最新版)搜索镜像
docker search 镜像名 #可以从仓库中检索镜像
- -option
- –ilmit :只要列出N个镜像,默认为25个
- NAME :镜像名字
- DESCRIPTION :有关镜像的描述
- STARTS:点赞的数量
- OFFICIAL:是不是官方提供的镜像
- AUTOMATED : 是否自动构建
docer system df删除镜像
docker rmi -f 镜像ID #删除单个镜像 docker rmi -f 镜像名1:TAG 镜像名2:TAG #删除多个 docker rmi -f $(docker images -qa) #删除所有镜像
- -options
- -f 强制删除,不需要提醒
答:就是仓库名 和TAG标签为none的镜像就是虚悬镜像容器命令
有镜像才能创建容器,这是根本前提,所以我们需要从中央仓库拉取一个镜像(这里拉取Ubuntu镜像为例)
docker pull ubuntu #默认使用最新版新建+启动容器
docker run [-option] 镜像名:TAG [Command]
-
-Option
-
–name:指定容器启动的名字
-
-d:守护式运行,也就是后台运行。
-
-i : 以交互式运行容器,通常和-t一起使用。
-
-t:为容器分配一个输入终端。通常和-i搭配使用
-
-P:随机端口映射,大写P
-
-p:指定端口映射,小写P
-
docker ps [-OPTIONS] #不加-a默认显示正在运行的容器
- OPTIONS
- -a : 展示所有容器(正在运行,运行过的容器都算)
- -l:展示最新创建的容器
- -n : 展示 指定个数的容器
- -q:只显示容器ID
exit #第一种 ctrl+p+q # 第二种
区别:
exit:退出容器后,容器不会再运行
ctrl+p+q:退出容器后,容器还会运行
启动容器(不是新建)docker start [options] 容器ID
- option
- -i :交互式启动
docker restart 容器ID或者容器名停止容器
docker stop 容器ID强制停止容器
docker kill 容器ID删除容器
docker rm 容器ID #删除单个容器 docker rm 容器ID 容器ID #删除多个容器 docker rm ¥(docker ps -qa) #删除全部容器 docker ps -a -q | xargs docker rm #删除多个容器启动守护式容器(后台服务器)
- 像Redis,Mysql这种只需要在后台运行的,我们不需要创建交互式的容器,所以我们创建一个守护式容器
docker run -d 镜像ID
redis 前后台启动演示case
- 前台交互式启动
docker run -it redis:6.0.9
2、后台守护式运行
docker run -d redis:6.0.9查看容器日志
docker logs 容器ID查看容器内运行的进程(容器是个小型Linux)
docker top 容器ID查看容器内部细节
docker inspect 容器ID进入正在运行的容器并以命令行交互
docker exec [OPTIONS] 容器ID /bin/bash
使用exec进入容器内部以后使用exit退出容器时,容器不会停止。
从容器内拷贝文件到主机上docker cp 容器ID:容器内路径 目的主机路径导入和导出容器
- 导出容器的内容留作为一个tar归档文件
docker export 容器ID > 文件名.tar
- 从tar包中的内容创建一个新的文件系统再导入为镜像
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
导入的镜像为虚悬镜像
Docker镜像 镜像是什么是一种轻量、可以独立运行的软件包。我们把应用程序和配置依赖打包形成一个可以支付的运行环境。这个运行环境就是镜像文件。 只有通过这个镜像文件才能创建容器。UnionFS(联合文件系统)
- Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
- 以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KFS8fItd-1650980660579)(…/…/AppData/Roaming/Typora/typora-user-images/image-20220426210939761.png)]
平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M??
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。
-
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
-
所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
docker commit [options] 容器ID 要提交本地的仓库
- option:
- -a:作者
- -m:提交信息
利用docker commit 生成镜像
创建镜像仓库
根据阿里云给的步骤进行。
提交成功



