目录
一、安装Docker
1、win系统
2、wsl下
3、docker安装地址
二、Docker
1、概念
2、容器与虚拟机比较
2、docker能干嘛
3、docker三要素
1、镜像:类比于Java中的类模板
2、容器:类比于以镜像为模板创建的实例对象
3、仓库:
4、docker架构
5、镜像加速器
6、第一次运行docker—hello wrold
7、为什么docker比Java虚拟机快
8、docker常用命令
1、帮助启动类命令(Ubuntu下)
2、镜像命令
1、列出本地主机上的镜像(二选一)
2、显示本地所有镜像
3、只显示所有镜像的id
2、去仓库查找某一个镜像
3、下载镜像
4、查看镜像/容器/数据卷所占的空间
5、删除镜像
1、普通删除
2、强制删除
3、删除全部镜像(docker从入门到入狱)
9、docker的虚玄镜像是什么
10、容器命令
1、先把ubuntu拉下来
2、新建+启动一个容器
3、查看docker容器
4、退出容器
5、启动已经停止的容器
6、删除已经停下的容器
7、启动守护式容器(后台服务器)
8、查看容器日志
9、重新进入容器
10、将容器中的文件拷贝到本机目录下
12、导入和导出容器
Guide docker
1、docker镜像
镜像分层
2、容器commit成新的镜像
装好docker desktop
①先确保电脑上的wls2装好了
②我们把将root用户设置为默认的用户,要不然很多权限受限
③wsl2装好之后,在ubutu中安装docker,步骤如下:
1、一键安装:
sudo curl -sSL https://get.daocloud.io/docker | sh
不要管它说的啥,等就行了,等装好了就行
2、启动docker服务
sudo service docker start
3、查看是否安装成功
sudo docker ps -a
④准备工作,在ubutu中安装gcc
命令:(注意是在root用户权限下,如果之前已经将root设置为默认的用户就没事)
sudo apt update
sudo apt install build-essential
然后打印一下gcc的版本:
gcc --version
⑤ubuntu报错解决
systemd类型的命令执行不了,我们换一种语法即可,对应下面的关系:
地址: https://docs.docker.com/engine/install/centos/
(我装在ubuntu里了)
解决的是开发能跑起来结果运维跑不起来的情况。实现系统平滑移植,容器虚拟化技术
软件带环境安装,我们将源码+环境+配置 打包成一个镜像文件。实现了从搬家到搬楼
docker理念:一次镜像,处处运行
类比CentOs7和VmWare–>docker就相当于VmWare,我们打包成的镜像文件就相当于CentOs7
Docker是基于Go语言实现的云开源项目,它的主要目标是build–Ship–Run anywhere,any app。也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的app能做到一次镜像,处处运行
docker是一种容器虚拟化技术
1、传统虚拟机技术
传统虚拟机技术就是带环境安装的一种解决方案。它可以在一种操作系统中运行另一种操作系统。这种技术基于安装在著操作系统上的虚拟机管理系统(比如说VmWare),然后创建虚拟机(虚拟出各种硬件)
缺点是:占用资源多、步骤多、启动慢
2、容器虚拟化技术
linux容器不是模拟一个完整的操作系统(传统虚拟机技术)而是对进程进行隔离。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置,所以很轻量
3、比较
1.虚拟机虚拟出一套硬件,在其上运行了一个完整的操作系统
2.容器中大哥应用进程直接运行于宿主的内核,容器内没有自己的内核也没有硬件虚拟
3.每个容器之间相互隔离,容器之间进行不会相互影响。一台机器上可以跑多个容器
DevOps 开发运维——新一代工程师
docker镜像(Image)就是一个只读的模板,镜像可以用来创建Docker容器,一个镜像可以创建很多容器。它相当于是一个root文件系统,比如官方镜像centos7就包含了完整的一套centos7最小系统的root文件系统。
docker镜像文件类似于Java的类模板,docker容器实例类似于Java中new出来的实例对象
redis r1 = docker run镜像
redis r2 = docker run镜像
就像鲸鱼背上的集装箱,就是一个容器实例
镜像像Java中的类,容器像Java中的对象。真正干活的,执行操作的,实际上是以镜像为模板new出来的容器。就像Java中真正执行功能的是对象而不是类。镜像是静态的,而容器是镜像运行时的实体,容器为镜像提供了一个标准的和隔离的运行环境。
可以把容器看作是一个简易版的linux环境和运行在其中的个应用程序。也就是说每一个容器有两部分组成:
应用程序(eg:redis) |
---|
最小最核心赖以生存的linux内核文件(不需要的不加载) |
集中存放镜像文件的地方
类似于maven是存jar包的,github存git项目,dockerhub存放镜像文件
docker就是用来跑容器实例的地方,也就是容器运行载体或者称为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过镜像文件才能生成docker容器实例
docker是一个Client - Server结构的系统,docker守护进程运行在主机上,然后通过socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器
这个docker daemon是JUC并发中的一个知识点,表示的是后台守护进程
配置镜像加速器的作用是减少之后超时的概率,要不然一直超时会很烦
在阿里云官网,控制台,弹性计算,容器镜像服务,镜像工具,镜像计算器,打开之后有一个加速器地址(每个人自己去创建一个个人实例,然后会获得自己唯一的加速器地址)
然后按照官网的教程去ubuntu下操作一下:
我们打开docker之后输入命令
docker run hello-wrold
最终的结果是:打印出一句hello from docker
当打印这一句话之后,我们的容器就卸载掉了,相当于在集装箱(Container)在鲸鱼背上过了一下
run语句的执行过程:
现在本地找,本地找不到去hub仓库中去找,找到就创建容器实例,找不到报错
1、docker有更少的抽象层。docker不需要像虚拟机一样实现硬件资源虚拟化,运行在docker容器上的资源都是直接使用物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上更有优势
2、docker利用的是宿主机的内核,不需要重新加载一个操作系统内核
启动docker服务
service docker start
docker images
docker image ls
root@DESKTOP-3O3VVFP:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 18 months ago 13.3kB
root@DESKTOP-3O3VVFP:~# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 18 months ago 13.3kB
REPOSITORY 表示镜像的仓库源(tomcat、mysql)
TAG 镜像的标签版本号(mysql想要5.7或者8.0,如果什么都不写就是lastest,表示最新的)
docker image -a
docker image -q
docker search 某个xxx镜像的名字
NAME 名字
DESCRIPTION 描述
STARS 点赞数
OFFICIAL 是否官方认证的
AUTOMATED 是否自动编译构建的
如果觉得罗列的太多,可以对结果进行限制,这条命令表示只展示结果的前五条(我们一般就是用第一条官方认证过的)
docker search --limit 5 redis
docker pull 某个镜像的名字[:Tag]
下载过程中:
下载之后看一下(docker images):
现在已经有了新的镜像装好了
(看看鲸鱼有多累)
docker system df
docker rmi 某个镜像的名字
我们先看一下现在有哪些image
然后docker rmi hello-world,发现报错了,原因是之前某个容器container跑过这个镜像,所以不能删
然后加一个 -f 表示强制删除,OK删掉了
docker rmi -f hello-world
docker rmi -f $(docker images -qa)
可以看到删之前剩个mysql,删之后啥也没了
仓库名和标签都是的镜像称为dangling image,也叫虚玄镜像
虚玄镜像的亚子:
示例:在ubuntu上装了docker,在docker拉取ubuntu镜像(套娃)
pull
docker run [option] image
docker run -it ubuntu /bin/bash
如图所示,我们可以看到,当把ubuntu跑起来之后,前面的标识符变了,原因是我们在docker上重新跑起来一套ubuntu操作系统,并且在命令最后一个位置我们加上了一个bash表示我们以bash的形式与这个ubuntu进行交互
然后我就可以像操作ubuntu一样操作了:
对于最后面的
这里要说一下run命令的option:
有三套常用的参数option:
①
-i:交互式操作,以交互模式运行容器
-t:终端,为容器重新分配一个伪输入终端
我们经常把t和i放在一起使用
②
–name= ZhiHuiGou
给现在要跑的系统起一个别名
③
-P:随机端口映射
-p:指定端口映射
④
-d:后台运行容器并返回容器ID
如果不会用命令怎么办:
docker run --help (效果如下)
1、查看当前正在运行的docker容器:
docker ps
另开一个ubuntu终端,因为另一个在跑docker上的ubuntu
CONTAINER ID 容器ID
IMAGE 镜像
COMMAND 命令行
CREATED 啥时候创建的
STATUS 状态,正在跑吗
PORTS 对外暴露的端口,ubuntu没有,但是如果现在跑的是redis,就有端口了6379 NAMES
NAMES 刚刚说了run命令的一种option是--name,表示为container起一个新的名字,但是如果run的时候没写,那么系统就帮你写一个
2、列出当前正在运行和历史上运行过的容器
docker ps -a
3、显示最近创建的n个容器
docker ps -n
4、显示最近创建的容器
docker ps -l
5、显示正在运行的容器的id
docker ps -q
1、退出当前正在运行的容器
exit
ctrl+p+q
exit的方式退出容器会停止
ctrl
+p+q的方式容器不停止
如图所示,从docker上的ubuntu的bash形式回到了我们自己的ubuntu上
找到容器的id:docker ps
就可以看到container的id了
执行命令:
docker start 容器ID
docker rm 容器ID
不要用$引用全删掉,很刑
前面启动的ubuntu是交互式的,会生成一个小黑框,守护式就是在后台悄悄跑
之前用-it开启了交互式的容器,现在将-it换成-d就可以启动守护式容器
我们用redis做示范
docker run -d ubuntu
启是启动过了,但是ps看一下发现容器已经退出了
这个是docker的机制问题,使用后台进程模式运行,导致docker前台没有运行的应用,这样容器觉得没有它的事情可做,就会自杀
redis一直跑不起来,-d和-it都跑不起来,差了一个博客,
docker logs 容器ID
1、exec命令
docker exec -it 容器ID bashShell
eg:
exec是进入某个运行的container,但是如果你要exec的容器没有处于运行的状态,那么会先把这个容器run起来然后再进入
2、attach命令
docker attach 容器ID
这两条命令的区别:
(不吃这碗饭,砸了这口锅)对于attach 直接进入容器启动命令的终端,不会启动新的进程。使用exit会终止容器
(不吃这碗饭,不砸这口锅)对于exec则是相当于在这个容器上打开了新的终端,使用exit命令不会终止容器
比如上跑了ubuntu的容器,使用exec相当于开了新的小黑框。而attach相当于打开原来的小黑框。
推荐使用exec命令,而不是attach,ctrl+p+q的时候不会退出container
一般情况下是使用-d将服务用后台的方式启动,然后再使用exec进入进行操作。比如说redis
命令:
docker cp 容器ID:容器内路径 目的主机路径
这个一般用来做备份,防止别人把我的容器删掉,导致数据没了
相当于将整个容器做了个备份
1、将容器导出:
docker export 容器ID>文件名称.tar
export导出容器的内容
2、将文件导入成为一个新的镜像
cat 文件名称.tar | 镜像用户/镜像名:镜像版本号
底层是联合文件系统,联合文件系统就是分层的文件系统,外边看是一个整体,其实可以分成不同的文件
docker的镜像需要分层,分层的目的是达到复用,比如ubuntu和centos,他们俩个有相同的linux内核,这部分可以置于底层,想用centos时,在上层添加centos的上层即可
docker的镜像层都是只读层,容器层时可写的。当容器启动时,一个新的可写层被加载到镜像的顶部,这一层被叫做容器层,容器层之下都叫做镜像层
我们从仓库拉下来的都是最精简版的东西,比如说ubuntu系统,对于重要的功能,镜像里是有的。但是像vi编辑这种不重要的功能,拉下来的镜像里面是没有的。我们想让它有的话,可以。自己把拉下来的跑成一个Container,然后把Container给commit成一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
看一下:
这里显示原始的ubuntu没有vi功能,我们在docker的ubuntu容器上执行两条命令,安装一下vim编辑
apt-get update
apt-get -y install vim
安装好了之后,再试一下vi能不能跑通,如图所示可以跑通,说明装上了
然后套公式执行命令
docker commit -m="add vim cmd" -a="cr" 容器ID 新镜像名称