Docker

这部分只说基本的使用,说到常用的命令加载,后面会再发一篇来说文件系统与镜像加载原理。

Docker概述

Docker为什么出现?

在测试开发环境中,测试进行项目测试时往往需要对着开发手册和配置文件进行繁杂的配置,非常浪费时间并容易出现环境冲突。Docker可以很好的解决这个问题,所以才被推崇。

Docker可以发布一个项目(jar + (Redis MySQL jdk ES)),项目带上环境安装,测试可以直接拿到镜像配置容器进行测试。

简单的说,比如我想搭建一个tomcat网站,我不需要安装各种环境各种依赖库,我可以直接拉取镜像生成容器就可以使用。

基本概念

从上图可以看出,最基本的三条指令为:

  • docker build 镜像搭建
  • docker pull 拉取镜像
  • docker run 运行镜像生成容器

容器

容器的概念可以说是Docker的精髓,容器和虚拟机同样都是虚拟化技术。下面列出具体差距。

  • 虚拟机需要加载完整的操作系统
  • 容器直接使用宿主机系统内核,容器没有自己的内核,每个容器相互隔离,有自己的文件系统,互不影响

如果让我描述下容器:一种虚拟化技术,依赖于宿主机系统内核,有独立的文件系统,包含当下应用所需要的服务、库、依赖包、环境,并且只专注于当下的应用。实现应用的隔离和便捷运输。
为什么Docker比VM快

为什么Docker比VM快?

  1. Docker有比虚拟机更少的抽象层
  2. 利用的是宿主机的内核,不需要Guest OS,所以不需要重新加载操作系统,直接使用宿主机操作系统。

从上图可以看出Docker容器和VM的区别,当你想要加载一个应用,虚拟机加载整个操作系统需要的时间是分钟级,而容器的加载速度可能是秒级甚至毫秒级。

镜像

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,包含运行某个软件需要的所有内容,包括代码、库、环境变量和配置文件。

仓库

简单说就是存放镜像的地方:

  • 公有和私有仓库
  • Docker Hub
  • 阿里云...都有容器服务(配置镜像加速)

下面是docker官方仓库,当然你可以使用其他镜像站
https://hub.docker.com

Docker是怎么工作

  • C/S架构,Docker 的守护进程运行在宿主机,通过socket从客户端访问
  • DockerServer接收到Docker-Client指令就会执行

Docker安装

安装路径

Docker安装
关于Docker的安装不再赘述,网上教程很多,可以换镜像源来加速,Windows安装稍难一些,因为Docker依赖于宿主机Unix系统内核,所以Windows需要安装虚拟内核。

Docker常用命令

帮助命令

$ docker version #查看版本
$ docker info # 查看docker信息
$ docker [命令] --help #查看具体指令使用

镜像命令

$ docker images # 查看本地主机上的镜像
$ docker search # 搜索镜像
$ docker search --filter=STARS=3000 # 过滤STARS点赞少于3千的镜像
$ docker pull #下载镜像,默认下载tag为least的
$ docker rmi -f [镜像ID]
$ docker rmi -f $(docker images -aq) #使用传参删除所有镜像
$ docker logs #查看日志
$ docker logs -f -t --tail 10 [容器id] # 查看该容器id前10条
$ docker top [容器id] # 查看容器中进程信息ps
$ docker inspect [容器id] #查看容器元数据
$ docker exec -it [容器id] bashShell #进入容器后开启一个新的终端,可以在里面操作
$ docker attach [容器id] bashShell #进入容器正在执行的终端,不会启动新的进程
$ docker cp [容器id]:容器内文件的路径 目的主机路径

docker run

关于上面的指令如果有使用不清楚,可以使用--help进行查询。
下面详细说下Docker run的使用。

  • docker run [可选参数] image

    • --name = “NAME"  容器名字,用来区分容器
    • -d 后台方式运行并且打印容器id
    • -i 即使没有连接,也要保持标准输入保持打开状态,一般与 -t 连用
    • -t 分配一个伪tty,一般与 -i 连用
    • -p 指定容器的端口
$ docker run --name -d -it "CENTOS1" centos

而需要注意的是-d的使用
当你使用

$ docker run --name centos2 centos
(base) sweeti@SweetideMacBook-Pro xray % docker run -d --name centos2 centos
9ee771fa4c08856d2b4aa7b577147ffcf41f769ab46bdb9e0650a03f042bcd6c

显示已经启动
但是当我使用

docker ps # 查看

发现没有这个进程

(base) sweeti@SweetideMacBook-Pro xray % docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS                          PORTS                    NAMES
4111703ee4b4        c0ny1/vulnerable-node:latest   "/app/start.sh"          2 months ago        Up 26 hours                     0.0.0.0:3000->3000/tcp   vulstudy_vulnerable_node_1
d189745a09fd        vulstudy_postgres_db           "docker-entrypoint.s…"   2 months ago        Restarting (1) 10 seconds ago                            vulstudy_postgres_db_1

而使用docker ps -a发现曾经启动了

于是疑惑产生了, -d 是保证容器在后台运行,为什么我的容器停止运行了呢?

前面提到过, docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 中有一个 COMMAND 参数,容器启动后会执行 COMMAND命令,它的默认值为 /bin/bash。也就是说容器在后台启动成功后,执行了 COMMAND 命令后直接关闭了。

了解到该原理后,我们可以通过在 docker run -d 后增加一个驻留在进程中长期运行的命令就可以保证容器不关闭了。

最后修改:2021 年 12 月 03 日
如果觉得我的文章对你有用,请随意赞赏