koya1
Docker 概述
Docker 官网: Docker 官网
Docker Hub 官网: Docker Hub 官网
Docker 是一个开源的应用容器引擎,基于 Go 语言开发并遵从 Apache2.0 协议开源。其可以做到让开发者打包他们的应用以及依赖包到一个轻量级、可移植的镜像当中,然后发布到任何流行的 Linux 操作系统的机器上,也可以实现虚拟化。
Docker 为什么出现
一款产品从开发到上线,一般都是拥有两套环境:开发环境和测试环境。
开发人员和运维人员的环境基本上都是不一致的。在开发人员电脑上可以运行的程序,在运维人员电脑上就不一定可以正常运行。比如 java web 应用,需要一个操作系统,操作系统上要有jdk,tomcat,代码,配置文件。jdk版本可能导致程序的运行失败,比如class文件需要1.7编译,而运维人员装的1.6jdk;tomcat 版本可能导致失败,比如旧的版本一些配置在新版本当中不再支持;代码存放的位置也可能导致程序的运行失败,比如使用了系统的一些环境编码,在 Linux 上面不可以支持;配置文件,比如可能少配了个配置文件等等。
Docker 的出现可以将操作系统,jdk,tomcat,代码,配置文件全部放到一个集装箱里,在打包放到鲸鱼上,由鲸鱼给我们送到服务器上,在我的机器上怎么运行,在别的机器上也怎么运行,不会有任何的问题。Docker 解决了运行环境不一致所带来的问题。
Docker VS 传统虚拟机
虚拟机技术
资源占用十分多
冗余步骤多
启动慢,分钟级别的
容器化技术
响应式部署和扩展:基于容器,允许高度可移植的工作负载
快速一致:将环境,配置文件,代码等打包到一个集装箱里,简化开发的生命周期
轻巧快速:秒级别的
Docker 和 虚拟机技术的不同:
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个操作系统上安装和运行软件。
- 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,很轻便、
- 每个容器间是相互隔离,每个容器内都有一个属于自己的文件系统,互不影响。
Docker 的基本组成
镜像(image)
docker 镜像好比一个模板,可以通过这个模板来创建容器服务,可以创建多个容器服务(最终服务运行或者项目运行就是在容器当中的)。
容器(container)
docker 利用容器技术,独立运行一个或者一个组应用,容器是通过镜像来创建的,可以将容器理解为一个简易的 Linux 系统。
仓库(repository)
仓库就是存放镜像的地方,分为公有仓库和私有仓库。
Docker 安装(centos下安装)
环境查看
# Docker 要求 centos 系统的内核版本高于 3.10,查看 centos 的环境
uname -r
安装 Docker
# 1、如果安装过请先卸载
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2、需要的安装包
yum install -y yum-utils
# 3、设置镜像的仓库
# 推荐使用阿里云的,十分得快
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum软件包索引
yum makecache fast
# 4、安装docker相关的内容, docker-ce 社区 ee 企业版
yum install docker-ce docker-ce-cli containerd.io
# 5、启动docker
systemctl start docker
# 6、使用docker version 是否安装成功
docker version
# 7、hello-world (hello-world 是已经在docker仓库当中存在的镜像.)
docker run hello-world
# 8、查看一下下载的这个 hello-world 镜像
docker images
Docker 底层原理
Docker 是怎样工作的
Docker 是一个 Client - Server 结构的系统,Docker 的守护进程运行在主机上,通过 Socket 从客户端访问,Docker 接收到指令,就会执行这个指令。
Docker 为什么比 VM 快
1、Docker 有着比 虚拟机更少的抽象层
2、Docker 利用的是宿主机的内核,vm 需要的是 Guest OS
Docker 常用命令
帮助命令
命令 | 说明 |
---|---|
docker version | 显示 docker 的版本信息 |
docker info | 显示 docker 的系统信息,包括镜像和容器的数量 |
docker 命令 --help | 显示某个命令的帮助说明 |
命令文档的地址: Docker命令帮助文档
镜像命令
命令 | 说明 |
---|---|
docker images | 查看所有本地的主机上的镜像 |
docker search 镜像名 | 搜索镜像 |
docker pull 镜像名[:tag] | 下载镜像(可以使用:tag 指定版本,默认是最新版本) |
docker rmi -f 镜像id | 删除指定镜像 |
docker rmi -f 镜像id 镜像id 镜像id | 删除多个镜像 |
docker rmi -f $(docker images -aq) | 删除全部镜像 |
容器命令
在使用容器之前,需要先有镜像,镜像用来创建容器,在 VMware 软件下安装CentOS(Linux 操作系统),然后启动虚拟机,在 Docker 当中下载 centos 镜像
docker pull centos
新建容器并启动
# 命令
docker run [可选参数] image名字
docker run -it centos /bin/bash
# 参数说明
--name="Name" 容器名字 tomcat01 tomcat02,用来区分容器
-d 后台方式运行
-it 使用交互方式,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P 随机指定端口
列出所有的运行容器
# 命令
docker ps # 列出当前正在运行的容器
docker ps -aq
# 参数说明
-a # 列出当前正在运行的容器+带出历史运行过的容器
-n=? # 显示最近运行的容器
-q # 只显示容器的编号
退出容器
exit # 直接退出并停止容器
Ctrl + P + Q # 退出容器但不停止
删除容器
# 命令
docker rm 容器id # 删除指定的容器id,不能删除正在运行的容器,如果要强制删除 rm -f
docker rm -f $(docker ps -aq) # 删除所有的容器
启动和停止容器
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器
常用命令
后台启动容器
# 命令 docker run -d 镜像名
[root@hadoop100 ~]# docker run -d centos
# 问题docker ps ,发现 centos 停止了
# 常见的坑,docker 容器使用后台运行,就必须要有一个前台进程,docker 发现没有应用,就会自动停止。
查看日志
# 命令
docker logs -f -t --tail 容器id
# 显示日志
-tf # 显示日志
--tail number # 显示日志条数
查看容器当中进程信息
# 命令
docker top 容器id
查看容器 / 镜像的源数据
# 命令
docker inspect 容器id
进入当前正在运行的容器
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
# 命令
docker exec -it 容器id /bin/bash
Docker 镜像
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来。
如何获得镜像
- 从远程仓库下载
- 朋友拷贝给你
- 自己制作一个镜像
Docker 镜像加载原理
UnionFS
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
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 就是各种不同的操作系统发行版,比如CentOS等等。
平时安装进虚拟机的 CentOS 都是好几个G,为什么 Docker 这里才几百M
对于一个精简的OS,rootfs 可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用 Host 的 kernel,自己只需要提供 rootfs 就可以了。由此可见对于不同的 Linux 发行版,bootfs 基本是一致的,rootfs 会有差别,因此不同的发行版可以共用 bootfs。
commit 提交镜像
docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
参考博客:
https://blog.csdn.net/q610376681/article/details/90483576
https://blog.csdn.net/weixin_43584835/article/details/108192859
https://blog.csdn.net/just_for_that_moment/article/details/125308103