Docker虚拟化容器

发布时间 2023-12-27 22:00:52作者: yanggdgg

一、简介

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

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

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。

Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)

三要素:镜像、仓库、容器

  • 镜像将应用程序及其依赖、环境、配置打包在一起构成镜像。Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
  • 容器
    • Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。

    • 它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

    • 可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

    • 容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

  • 仓库
    • 仓库(Repository)是集中存放镜像文件的场所。

    • 仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

    • 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

Docker结构

服务端:接收命令或远程请求,操作镜像或容器

客户端:发送命令或者请求到Docker服务端

Docker架构

二、Docker常用命令

1. 镜像操作

1.1 镜像名

  • 镜名称一般分两部分组成:[repository]:[tag]。

  • 在没有指定tag时,默认是latest,即最新版本的镜像

 如图,代表mysql 8.028版本的镜像

1.2 镜像操作

拉取镜像

例:拉取最新版本的nginx镜像

docker pull nginx

查看镜像

docker images

保存镜像到磁盘

语法格式:

docker save -o [保存的目标文件名称] [镜像名称]

例:

docker save -o /usr/local/nginx.tar nginx

删除镜像

docker rmi nginx

加载镜像

docker load -i /usr/local/nginx.tar

2. 容器操作

容器保护三个状态:

  • 运行:进程正常运行

  • 暂停:进程暂停,CPU不再运行,并不释放内存

  • 停止:进程终止,回收进程占用的内存、CPU等资源

其中:

  • docker run:创建并运行一个容器,处于运行状态

  • docker pause:让一个运行的容器暂停

  • docker unpause:让一个容器从暂停状态恢复运行

  • docker stop:停止一个运行的容器

  • docker start:让一个停止的容器再次运行

  • docker rm:删除一个容器

例:创建nginx容器

docker run --name mynginx -p 80:80 -d nginx

命令解读:

  • docker run :创建并运行一个容器

  • --name : 给容器起一个名字,比如叫做mynginx

  • -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口

  • -d:容器启动后在后台运行

  • nginx:镜像名称

查看启动的容器

docker ps # 查看所有运行的容器
docker ps -a # 查看所有容器包含关闭的

查看日志

docker logs -f mynginx

加 -f 参数可以持续查看日志,不加 -f 只能查看打开时的日志。

停止容器

docker stop mynginx

启动容器

docker start mynginx

进入容器内部

docker exec -it mynginx bash

命令解读:

  • docker exec :进入容器内部,执行一个命令

  • -it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互

  • mynginx :要进入的容器的名称

  • bash:进入容器后执行的命令,bash是一个linux终端交互命令

3. 数据卷

数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。

 

作用:将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全

 

 一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。

3.1 操作命令

基本语法

docker volume [COMMAND]

docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:

  • create 创建一个volume

  • inspect 显示一个或多个volume的信息

  • ls 列出所有的volume

  • prune 删除未使用的volume

  • rm 删除一个或多个指定的volume

例:创建数据卷html

docker volume create html

查看数据卷的详细信息

docker volume inspect html

可以看出数据卷挂载在宿主机的哪个目录

挂载数据卷

创建容器时,可以通过 -v 将数据卷挂载到容器内的目录

docker run的命令中通过 -v 参数挂载文件或目录到容器中:

  • -v volume名称:容器内目录

  • -v 宿主机文件:容器内文

  • -v 宿主机目录:容器内目录

docker run --name mynginx -v html:/root/html p 80:80 -d nginx

-v html:/root/html 代表将 html 数据卷挂载到容器内的 /root/html 中

挂载后通过修改本机目录中的文件实现修改容器内相应目录的文件

 

容器不仅仅可以挂载数据卷,也可以直接挂载到宿主机目录上。关联关系如下:

- 带数据卷模式:宿主机目录 --> 数据卷 ---> 容器内目录
- 直接挂载模式:宿主机目录 ---> 容器内目录(不建议,可能会出现错误)

三、DockerFile 自定义镜像