01-docker的介绍与基础使用

背景

相信作为软件开发者,对于docker应该都不会陌生。自从有了docker之后,我们环境的部署、迁移、实例扩容等都变得极为简单,我们再也不用担心测试时的环境跟正式环境不一样导致一堆非代码逻辑问题导致的错误,也可以更加灵活的为应用添加或删减相应的资源,让有限的资源可以以最大程度得到利用。那么,Docker究竟是什么东西呢?他到底是通过什么方法实现上述功能的呢?其原理又是如何?今天我们就来一起探讨一下这个话题。

Docker是什么

Docker是一个容器。那么,既然是容器,肯定是用来装东西的,杯子是水的容器,房子是人的容器,那么Docker里面究竟装的是什么呢?实际上,在Docker当中,我们装的是应用(Application)。也就是说,Docker是应用的容器。

Docker是一种管理应用的现代手段,让应用管理变得更加容易预测与更加高效。

Docker的安装

关于Docker的安装,官网已经给出了各个系统极为详细得方案,这边就不再赘述了,不明白的同学可以去看一下:docker安装

搜索与拉取镜像

docker安装好之后,我们便可以尝试从docker hub中搜索目标基础镜像,如:nodemysql等,docker hub

这里可以搜索到所有你想要的基础镜像,搜索到之后,我们就可以使用以下命令将目标镜像拉取到本地:

bash 复制代码
docker pull node

PS: 如果觉得使用官方的仓库拉取太慢,可以参考以下教程使用阿里云的加速器

下载成功之后,使用以下命令可以查看已经下载到本地的镜像列表:

bash 复制代码
docker images

![图片转存失败,建议将图片保存下来直接上传](/Users/tangwenhui/Library/Application Support/typora-user-images/image-20221023191518568.png)

运行镜像

镜像下载到本地之后,我们就可以尝试让镜像运行起来了,我们以mysql为例,我们可以到docker hub搜索相应镜像的详细信息,上面会有详细得运行参数介绍:

其中的一些参数解释:

  • name启动的容器实例的名称
  • e代表给 docker 容器传入环境变量,如:MYSQL_ROOT_PASSWORD 代表 mysql 根用户的密码
  • ddocker是支持分离模式的,如果你不想敲完上述命令后,命令行一直输出命令,无法做其他事情,可以通过此参数规定使用分离模式启动
bash 复制代码
# 以下为一个真实启动的命令示例
docker run --name kmysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

执行命令之后,会在命令行中输出一长串的字符,这个就是启动起来的容器的id,我们可以通过这个id对这个启动起来的容器进行管理。

查看运行中的容器

我们的容器已经在后台运行起来了,那么,我们应该如何查看运行中的容器的信息呢?

bash 复制代码
docker ps
# 或
docker container ls

通过这个命令,我们可以看到该容器启动的一些信息。

如果我们想要查看容器更加详细的基础信息,如启动起来的mysql服务是在哪个ip地址,这样你才能使用mysql的客户端软件通过ip去访问mysql服务,可以使用以下命令:

bash 复制代码
docker inspect 00d
# 使用以下命令可以搜索 ip 地址相关的信息
docker inspect 00d | grep "IPAddress"

mysql服务启动起来之后,我们就可以尝试连接一下服务,看是否真的正常启动成功了。这边推荐使用dbeaver数据库,以下是该数据的安装、启动、连接数据库的详情:

  • 安装

    bash 复制代码
    docker pull dbeaver/cloudbeaver
  • 启动

    bash 复制代码
    sudo docker run --name cloudbeaver --rm -ti -p 8081:8978 -v /var/cloudbeaver/workspace:/opt/cloudbeaver/workspace dbeaver/cloudbeaver:latest

    运行上述命令后,将会在本机的8081端口启动一个web服务,我们只需要访问:http://localhost:8081即可。

  • 连接数据库

至此,我们就已经使用dbeaver成功连接上了我们本地启动的mysql服务了。

Docker的原理

简单的讲,Docker不隔离计算,只隔离环境

什么是环境

环境包括:文件系统网络用户权限等。

比如说在Docker容器内的进程,只能看到Docker容器内部的资源,例如我们再Docker容器内部看到的根目录/实际上在用户本机上可能只是映射到了某一个目录,如:/usr/fs/xxx

在进程中看到的网络,也是与用户本机的实际网络是相互隔离的。

执行进程的用户,也是Docker容器内部的用户,与用户本机的用户也是完全隔离的。

什么是计算

与虚拟机不同的是:"docker不隔离计算。docker容器中的进程也是真实的进程,而不是虚拟进程。"

docker容器的进程写入文件的时候,并不是在虚拟机里面写入文件,而是在用户本地的操作系统中的文件系统中写入,只不过与我们经常使用的文件隔离开了而已。

docker是一种隔离技术而非虚拟化技术

虚拟化技术最明显的特征是执行层面的虚拟化------虚拟CPU指令。例如你在电脑上装了一个虚拟机,但你的电脑并不会管理虚拟机的进程,因为虚拟机中的进程已经完全运行在虚拟化技术上了。

docker则是将自己直接嫁接到了操作系统上,docker中的进程,实际也是真实的进程。在docker当中的文件系统,也是真实的文件系统,只是被挂在到了某个特殊的文件路径上并做了隔离而已。

docker中使用的网络,也是真实的网络,同样只是做了隔离而已。

相关推荐
我才是鳴海步1 小时前
基于docker技术的单主机环境模拟测试批量客户端
运维·docker·容器
listhi5202 小时前
k8s使用私有harbor镜像源
java·docker·kubernetes
程序员阿超的博客4 小时前
云原生核心技术 (9/12): K8s 实战:如何管理应用的配置 (ConfigMap/Secret) 与数据 (Volume)?
云原生·容器·kubernetes
桂?6 小时前
在 CentOS中安装Docker并安装青龙脚本——笔记
笔记·docker·centos
janthinasnail6 小时前
使用Docker安装FFmpeg
docker·容器
skywalk81636 小时前
超强人工智能解决方案套件InfiniSynapse:精准的业务理解、对各种数据源进行全模态联合智能分析--部署安装@Ubuntu22.04 & @Docker
数据库·人工智能·python·docker·infini-synapse
GeminiJM6 小时前
Docker监控服务部署
运维·docker·容器
yuanyxh7 小时前
持续交付部署的研究与实操
ci/cd·docker·自动化运维
morliz子轩7 小时前
在Docker上部署datalust/Seq日志服务系统
运维·docker·容器
exe4527 小时前
在docker中部署dify
运维·docker·容器