微服务—Docker

目录

初识Docker

Docker与虚拟机的区别

镜像与容器

Docker架构

常见Docker命令

镜像命令

容器命令

数据卷挂载

直接挂载


初识Docker

在项目部署的过程中,如果出现大型项目组件较多,运行环境也较为复杂的情况,部署时会碰到一些问题:依赖关系复杂,容易出现兼容性问题;nede开发、测试、生产环境有差异等。而Docker可以帮我们解决这些问题。

问1:Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?

答:Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像Docker应用运行在容器中,使用沙箱机制,相互隔离,避免互相干扰。

问2:Docker如何解决开发、测试、生产环境有差异的问题

答:Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行。

小结

Docker是一个快速交付应用、运行应用的技术:

  1. 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统;

  2. 运行时利用沙箱机制形成隔离容器,各个应用互不干扰;

  3. 启动、移除都可以通过一行命令完成,方便快捷 。


Docker与虚拟机的区别

虚拟机 (virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行 Ubuntu 系统,这样就可以运行任意的Ubuntu应用了。

Docker仅仅是封装函数库,并没有模拟完整的操作系统。

虚拟机中的应用在执行时会先调用虚拟的操作系统,再通过Hypervisor与外部操作系统进行交互,调用本机操作系统。而Docker应用在执行时直接调用本机操作系统。

小结

Docker和虚拟机的差异:

docker是一个系统进程;虚拟机是在操作系统中的操作系统;

docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般。


镜像与容器

Docker中有几个重要的概念:

镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。

容器(Container) :镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。

问3:我们应该怎么共享镜像,或者下载其他人分享的镜像呢?

答:可以通过DockerHub进行镜像分享与下载,DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry。国内也有类似于DockerHub 的公开服务,如:网易云镜像服务、阿里云镜像库等。


Docker架构


常见Docker命令

查询所有docker命令含义:docker --help

查询单条dockers命令的使用方法(以docker images为例):docker images --help

镜像命令

镜像名称表示

镜像命令思维导图

拉取镜像

docker pull ubuntu:20.04

docker pull nginx

列出本地所有镜像

docker images

删除镜像ubuntu:20.04

docker image rm ubuntu:20.04

docker rmi ubuntu:20.04

将镜像ubuntu:20.04保存为压缩包ubuntu_20_04.tar

docker save -o ubuntu_20_04.tar ubuntu:20.04

从压缩包ubuntu_20_04.tar中加载镜像

docker load -i ubuntu_20_04.tar

创建某个容器的镜像

docker [container] commit CONTAINER IMAGE_NAME:TAG


容器命令

容器命令思维导图

docker run :创建一个新的容器并运行一个命令

bash 复制代码
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
 
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
--name="nginx-lb": 为容器指定一个名称

-i: 以交互模式运行容器,通常与 -t 同时使用
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-d:  后台运行,并返回容器ID

例:docker run --name containerName -p 80:80 -d nginx

docker exec :在运行的容器中执行命令

bash 复制代码
docker exec -it mn bash
 
命令解读:
- docker exec :进入容器内部,执行一个命令

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

- mn :要进入的容器的名称

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

docker rm :删除一个或多个容器

bash 复制代码
docker rm [OPTIONS] CONTAINER [CONTAINER...]
 
-f :通过 SIGKILL 信号强制删除一个运行中的容器。
 
-l :移除容器间的网络连接,而非容器本身。
 
-v :删除与容器关联的卷。

运行容器与暂停容器之间的切换

bash 复制代码
docker pause 容器名或ID
 
docker unpause 容器名或ID

运行容器与停止容器之间的切换

bash 复制代码
docker start 容器名或ID
 
docker restart 容器名或ID
 
docker stop 容器名或ID

展示容器信息

bash 复制代码
docker ps [OPTIONS]
 
-a :显示所有的容器,包括未运行的。
 
-f :根据条件过滤显示的内容。
 
--format :指定返回值的模板文件。
 
-l :显示最近创建的容器。
 
-n :列出最近创建的n个容器。
 
--no-trunc :不截断输出。
 
-q :静默模式,只显示容器编号。
 
-s :显示总的文件大小。

查看容器元数据

bash 复制代码
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
 
-f :指定返回值的模板文件。
 
-s :显示总的文件大小。
 
--type :为指定类型返回JSON。

docker logs :获取容器的日志

bash 复制代码
docker logs [OPTIONS] CONTAINER
 
-f : 跟踪日志输出
 
--since :显示某个开始时间的所有日志
 
-t : 显示时间戳
 
--tail :仅列出最新N条容器日志

docker port :列出指定的容器的端口映射

bash 复制代码
docker port [OPTIONS] CONTAINER

docker stats :显示容器资源的使用情况,包括:CPU、内存、网络 I/O 等

bash 复制代码
docker stats [OPTIONS] [CONTAINER...]
 
--all , -a :显示所有的容器,包括未运行的。
 
--format :指定返回值的模板文件。
 
--no-stream :展示当前状态就直接退出了,不再实时更新。
 
--no-trunc :不截断输出。

数据卷挂载

数据卷帮助我们解决容器与数据耦合之间的问题:

  1. 不便于修改:当我们要修改Nginx的html内容时,需要进入容器内部修改,很不方便;

  2. 数据不可复用:在容器内的修改对外是不可见的。所有修改对新创建的容器是不可复用的;

  3. 升级维护困难:数据在容器内,如果要升级容器必然删除旧容器,所有数据都跟着删除了。

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

一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。这样,我们操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html目录了

数据卷操作的基本语法

bash 复制代码
docker volume [COMMAND]

docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
- create 创建一个volume
- inspect 显示一个或多个volume的信息
- ls 列出所有的volume
- prune 删除未使用的volume
- rm 删除一个或多个指定的volume

注意:
容器正在使用的数据卷与绑定挂载的数据卷无法删除。

创建一个数据卷名为html,并查询该数据卷的宿主机挂载点

挂载数据卷

如果该数据卷html不存在,则会被自动创建出来。之后我们可以通过docker volume inspect html查询该数据卷的宿主机挂载点,并cd到该挂载点目录中,即可在该挂载点中看到与容器挂载目录内相同的文件,并且可以通过对这些文件进行修改,实现对容器挂载目录中对应文件的对应修改。


直接挂载

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

  • 带数据卷模式:宿主机目录 --> 数据卷 ---> 容器内目录

  • 直接挂载模式:宿主机目录 ---> 容器内目录

语法

目录挂载与数据卷挂载的语法是类似的:

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

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

案例

要求创建并运行一个MySQL容器,将宿主机目录直接挂载到容器。

实现思路如下:

1)在将课前资料中的mysql.tar文件上传到虚拟机,通过load命令加载为镜像

2)创建目录/tmp/mysql/data

3)创建目录/tmp/mysql/conf,将课前资料提供的hmy.cnf文件上传到/tmp/mysql/conf

4)去DockerHub查阅资料,创建并运行MySQL容器,要求:

① 挂载/tmp/mysql/data到mysql容器内数据存储目录

② 挂载/tmp/mysql/conf/hmy.cnf到mysql容器的配置文件

ps:


相关推荐
栗子~~4 小时前
docker-compose的方式搭建 kafka KRaft 模式集群
docker·kafka·linq
周杰伦_Jay6 小时前
详细介绍:持续集成与持续部署(CI/CD)技术细节(关键实践、CI/CD管道、优势与挑战)
程序人生·ci/cd·docker·微服务·云原生·容器·人机交互
骑台风走9 小时前
ubunut22.04安装docker(基于阿里云 Docker 镜像源安装 Docker)
阿里云·docker·容器
奕辰杰10 小时前
关于使用微服务的注意要点总结
java·微服务·架构
仇辉攻防10 小时前
【云安全】云原生-Docker(五)容器逃逸之漏洞利用
安全·web安全·网络安全·docker·云原生·容器·安全性测试
Icoolkj10 小时前
微服务学习-服务调用组件 OpenFeign 实战
学习·微服务·架构
SomeBottle13 小时前
【小记】在 Google Colab 等平台上运行 GPU 容器
linux·python·docker·学习笔记·容器化·斩虫
等一场春雨14 小时前
Alibaba Spring Cloud 十三 Nacos,Gateway,Nginx 部署架构与负载均衡方案
nginx·spring cloud·gateway
风霜不见闲沉月15 小时前
Docker常用知识点问题
docker
三天不学习18 小时前
Docker 系列之 docker-compose 容器编排详解
docker·容器·docker-compose