我是靠谱客的博主 忧心耳机,最近开发中收集的这篇文章主要介绍docker的基础知识和命令(以拉取sqli-labs为例),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

docker的基础知识及命令

1.什么是docker

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)

2.docker可以解决的问题

在这里插入图片描述

3.docker的思想

3.1 集装箱

没有集装箱之前运输货物,东西零散容易丢失,有了集装箱之后货物不容易丢失,我们可以把货物想象成程序,目前我们要把程序部署到一台新的机器上,可能会启动不起来,比如少一些配置文件什么的或者少了什么数据,有了docker的集装箱可以保证我们的程序不管运行在哪不会缺东西.

3.2运输方式

docker运输东西有一个超级码头,任何地方需要货物都由鲸鱼先送到超级码头,然后再由鲸鱼从超级码头把货物送到目的地去.对应的技术来说,比如我们要把台式机的应用部署到笔记本上,我们可能选择用QQ发过去或者用U盘拷过去,docker就标准化了这个过程,我们只需在台式机上执行一个docker命令,把鲸鱼派过来,把程序送到超级码头去,再在笔记本上执行一个docker命令,然后由鲸鱼把程序从超级码头送到笔记本上去.

3.3存储方式

当我们把程序存储到笔记本上时,我们需要一个目录,且我们要记住这个目录,因为下次我们可能还要修改,有了docker之后我们就不用记住了程序在哪里了,我们使用的时候只需要一条命令就行了.

docker能实现的核心技术:

简单来说,docker容器本质上是宿主机的进程,Docker通过namespace实现了资源隔离,通过cgroups实现了资源限制

namespace技术:

namespace又称命名空间,它主要做访问隔离。其原理是针对一类资源进行抽象,并将其封装在一起提供给一个容器使用,对于这类资源,因为每个容器都有自己的抽象,而它们彼此之间是不可见的,所有就可以做到访问隔离。

namespace是将内核的全局资源做封装,使得每个namespace都有一份独立的资源,因此不同的进程在各自的namespace内对同一种资源的使用不会互相干扰。

cgroup技术:

cgroup全称Control Group,Linux的内核功能,通过cgroup可以设置进程使用CPU、内存、和IO资源的限额,它主要是做资源控制。其原理是将一组进程放在一个控制组里,通过给这个控制组分配指定的可用资源,达到控制这一组进程可用资源的目的

下面是docker的工作原理:

在这里插入图片描述

4.docker也是虚拟化的产品,那么它与虚拟机有关系吗,下面我们来看看虚拟化技术与容器化技术的差别:

4.1. 虚拟化技术
  • 资源占用十分多
  • 冗余步骤多
  • 启动很慢

在这里插入图片描述4.

2.容器化技术

在这里插入图片描述

比较Docker和虚拟化技术的不同

传统虚拟机, 虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件容器内的应用直接运行在宿主机的内部,容器是没有自己的内核的,也没有虚拟硬件,所以轻便每个容器间是相互隔离的,每个容器内都有一个属于自己的文件系统,互不影响,并且应用更快速的交互和部署,可以更高效的计算资源利用。

docker和虚拟机的差别

在这里插入图片描述

1 . Docker有着比虚拟机更少的抽象层

2. Docker利用的是宿主机的内核,VM需要的是Guest OS

再时间上,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guset OS , 分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级

5.docker的名词概念:

镜像(image)

​ Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像 ===> run ===> tomcat01容器, 通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)

容器(container)

​ Docker利用容器技术,独立运行一个或者一组应用, 通过镜像来创建的
​ 启动,停止,删除,基本命令!
​ 就目前可以把这个容器理解为一个建议的linux系统

仓库(repository)

​ 存放镜像的地方
​ Docker Hub(默认是国外的)

6.Docker的常用命令

6.1帮助命令

docker version      # 显示docker的版本信息
docker info         # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help   # 帮助命令也是万能命令

6.2镜像命令

6.2.1docker images 查看所有本地主机上的镜像
[root@AlibabaECS ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        8 months ago        13.3kB

# 解释
REPOSITORY  镜像的仓库源
TAG         镜像的标签
IMAGE ID    镜像的id
CREATED     镜像的创建时间

# 可选项
	-a, --all      # 列出所有的镜像
	-q, --quiet    # 只显示镜像的id

6.2.2docker search 搜索docker hub上的镜像
[root@AlibabaECS ~]# docker  search mysql
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   9911  

# 可选项
--filter , -f		Filter output based on conditions provided

docker search mysql -f=stars=5000

可以看到我们还可以再后面加上-f=starts=数字,来规定收藏数,缩小搜索范围

6.2.3docker pull 拉取镜像
下载可指定版本
# 下载镜像 docker pull 镜像名[:tag]
[root@AlibabaECS ~]# docker pull mysql
Using default tag: latest # 如果不写tag,默认就是latest
latest: Pulling from library/mysql 
bf5952930446: Pull complete # 分层下载,docker image的核心 联合文件系统
8254623a9871: Pull complete 
938e3e06dac4: Pull complete 
ea28ebf28884: Pull complete 
f3cef38785c2: Pull complete 
894f9792565a: Pull complete 
1d8a57523420: Pull complete 
6c676912929f: Pull complete 
ff39fdb566b4: Pull complete 
fff872988aba: Pull complete 
4d34e365ae68: Pull complete 
7886ee20621e: Pull complete 
Digest: sha256:c358e72e100ab493a0304bda35e6f239db2ec8c9bb836d8a427ac34307d074ed # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址

# 两条命令等价
docker pull mysql
docker.io/library/mysql:latest

# 指定版本下载
docker pull mysql:5.7

[root@AlibabaECS ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
bf5952930446: Already exists 
8254623a9871: Already exists 
938e3e06dac4: Already exists 
ea28ebf28884: Already exists 
f3cef38785c2: Already exists 
894f9792565a: Already exists 
1d8a57523420: Already exists 
5f09bf1d31c1: Pull complete 
1b6ff254abe7: Pull complete 
74310a0bf42d: Pull complete 
d398726627fd: Pull complete 
Digest: sha256:da58f943b94721d46e87d5de208dc07302a8b13e638cd1d24285d222376d6d84
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
6.2.4docker rmi 删除镜像
[root@AlibabaECS ~]# docker rmi -f 容器id                # 删除指定的容器
[root@AlibabaECS ~]# docker rmi -f  容器id 容器id 容器id  # 删除多个容器
[root@AlibabaECS ~]# docker rmi -f $(docker images -aq) # 删除全部容器
6.3容器命令
我们以拉取sqli-labs为例 docker search sqli-labs

在这里插入图片描述

docker pull 镜像名

在这里插入图片描述

docker run -dt --name sqli0 -p 80:80 --rm acgpiano/sqli-labs
-dt  后台运行; --name  命名;-p 80:80  将后面的docker容器端口映射到前面的主机端口。

在这里插入图片描述

docker ps -a 查看正在运行的容器,可用来查容器的id

在这里插入图片描述

docker exec -it 容器的id -it /bin/bash以交互模式进入命令行 

在这里插入图片描述

curl localhost:80 进入本地80端口查看,配置成功

在这里插入图片描述

打开火狐输入127.0.0.1:80,就可以闯关了

在这里插入图片描述

还有一些命令没有用到但很重要,如:
退出容器
exit            # 直接容器停止并退出
Ctrl + P + Q    # 容器不停止退出
删除容器
docker rm 容器id                  # 删除指定容器,不能删除正在运行的容器,如果要强制删除 rm -f
docker rm -f $(docker ps -aq)    # 删除所有的容器
docker ps -aq|xargs docker rm    # 删除所有的容器
启动停止容器
docker start 容器id        # 启动容器
docker restart 容器id      # 重启容器
docker stop 容器id         # 停止当前正在运行的容器
docker kill 容器id         # 强制停止当前容器
进入正在进行的容器
docker exec -it 容器id
docker attach 容器id

------------------------------------------未完待续----------------------------------------------------

最后

以上就是忧心耳机为你收集整理的docker的基础知识和命令(以拉取sqli-labs为例)的全部内容,希望文章能够帮你解决docker的基础知识和命令(以拉取sqli-labs为例)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部