Docker

1.程序部署的背景:比如一个项目中,部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等,这些服务部署时所需要的函数库、依赖项各不相同,甚至会有冲突。给部署带来了极大的困难。

2..什么是docker:docker其实就是实现项目快速部署的一个工具

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

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

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

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

Docker是一个快速交付应用、运行应用的技术,具备下列优势:

  • 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
  • 运行时利用沙箱机制形成隔离容器,各个应用互不干扰
  • 启动、移除都可以通过一行命令完成,方便快捷

3.docker的架构

Docker中有几个重要的概念:

镜像(Image) :Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。(其实就是把项目和运行需要的所有东西结合在一起),镜像,就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。

容器(Container) :镜像中的应用程序运行后形成的进程就是容器 ,只是Docker会给容器进程做隔离,对外不可见。容器就是将这些文件中编写的程序、函数加载到内存中允许,形成进程,只不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。

例如你下载了一个QQ,将QQ在磁盘上的运行文件及其运行的操作系统依赖打包,形成QQ镜像。然后你可以启动多次,双开、甚至三开QQ,跟多个妹子聊天这就是不同的容器。

而Docker是一个CS架构的程序,由两部分组成:

  • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等

  • 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。

当然在实际开发中,我们可以使用别人的镜像,也可以自己做,这些经常用的镜像已经有人做了------DockerHub(一个镜像托管的服务器,类似的还有阿里云镜像服务,统称为DockerRegistry)

,我们可以直接拉取使用,或者同时给我们一个镜像包,我们可以拿过来直接加载,或者从一个其他的仓库里面拉取。

4.docker基本操作:

其实所有的命令都不需要去记得清清楚楚,了解大概,会用--help即可。

4.1镜像操作:

首先明确docker的镜像命名规则:

  • 镜名称一般分两部分组成:[repository]:[tag]。
  • 在没有指定tag时,默认是latest,代表最新版本的镜像
  • 比如mysql:5.7,这里的mysql就是repository,5.7就是tag,合一起就是镜像名称,代表5.7版本的MySQL镜像,如果我们拉取的时候不指定tag默认就是latest。

一般常用的对镜像操作的命令就几个:

首先我docker pull nginx 就报了一个错:Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers),这个错误通常是由于docker无法访问docker hub镜像仓库导致的,解决方法:修改/etc/docker/daemon.json文件,我直接vim修改,然后网上找了一下可用镜像源,写进去就行了。

有了这个镜像tar就可以给别人了,或者别人给我们我们可以load下来

4.2容器操作

暂停用的不多

run的话有很多参数,可以加\然后换行写,注意这个name是--,其他是-

一般都是后台运行(-d),因为你前台运行就是弹出一个页面,你一关就结束了,我们当然希望后台了,想结束就docker stop 容器名即可,

-p那个意思是:如图就是我们容器是给外界隔离的,所以无法直接访问容器,那运行一个容器就是想要访问那个程序呀,所以容器就给我们暴露一个端口号,容器说:你访问宿主机的80端口,就是在访问我,所以-p 宿主机端口:容器程序端口,前面那个可以随便指定,只要没被占用即可,后面那个是人家程序默认的,比如reids默认就是6379,nignx默认就是80。

然后就是查看一个容器的日志:docker logs,不加-f只能查看一次。

说一个tips:其实拉取什么镜像最好是去官方文档哪里看说明,比如要开启一个redis容器

docker run --name mr -p 6379:6379 -d redis即可,但是官方推荐

复制代码
docker run \
  --name redis \      # 容器名称
  -p 6379:6379 \      # 端口映射(宿主机:容器)
  -d \                # 后台运行
  redis \             # 使用的镜像
  redis-server \      # 容器启动命令
  --appendonly yes    # 传递给启动命令的参数

后面加上了redis-server 表示运行容器,并且直接启动redis(不然还得进入容器去启动),这和咱们windows启动一样的命令。

--appendonly yes ,

  • 它的作用是开启 AOF(Append Only File)持久化,让 Redis 将每一次写操作都记录到日志文件中,以保证数据在重启后不丢失。
  • 如果不写这个参数,Redis 会使用默认配置启动,AOF 持久化默认是关闭的。
  • redis-cliRedis 命令行客户端 (Redis Command Line Interface),专门用来和 Redis 服务端(redis-server)交互。

然后我们测试一下到底启动没:

当然也可以docker exec -it mr bash然后回车再输入redis-cli

执行 redis-cli,就是启动了一个客户端程序,用来连接到当前容器内运行的 redis-server。连接成功后,可以在 127.0.0.1:6379> 提示符下,输入各种 Redis 命令(如 set key valueget keykeys * 等)来操作数据。相当于:

  • redis-server:是服务端程序,负责存储数据、处理请求。
  • redis-cli:是客户端程序,负责发送命令、接收服务端的响应。

4.3数据卷操作:

为什么要使用数据卷,这是因为容器对外部是不可见的,于是有如下问题

数据卷是什么:就是一个虚拟目录,什么意思,你看,我们安装docker后会产生下面那个宿主机文件系统直到volumes哪里,然后我们每次新建一个数据卷就会在这个目录下生成一个一模一样的文件,然后我们在运行一个容器的时候使用-v参数就可以把数据卷和容器内的目录建立一对一映射(如果数据卷不存在会自动创建),叫做挂载,这样的话宿主机上的这个文件和容器内的对应文件就一一对应了,哪一方更改另一方就会产生对应的变化,这就就可以更改容器的东西。或者比如说旧的mysql里的数据就在这个文件里,我更新mysql后,直接让新的mysql存放数据的文件和这个数据卷一挂载就完成了升级维护,是不是很简单。

数据卷的基本命令:

我感觉一般就是用creat创建一个数据卷,然后挂载,然后inspect查看这个数据卷的信息得到数据卷在宿主机的目录,进去这个目录,然后就可以改了。

4.4挂载数据卷:

比如说,要运行一个nginx,我们用刚刚的数据卷挂载到容器内部的一个文件上,以此达到修改效果,我们需要去查官方文档来明确挂载对应目录是什么,nginx的html目录所在位置在/usr/share

/nginx/html,所以:

然后就可以改index.html这个文件了(vim)

其实也可以直接挂载,就是自己去创建一个目录(mkdir -p ...),然后-v去挂载这个目录就即可,写一个案例,第4步是需要查官方文档,看一下镜像容器内mysql配置和数据在哪里的。

复制代码
docker run --name mm -p 3307:3306 -d -e MYSQL_ROOT_PASSWORD=123 -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf -v /tmp/mysql/data:/var/lib/mysql mysql:5.7.25

-e 可以配置一些系统变量。

有数据了吧哈哈哈成了

与数据卷挂载不同在于,数据卷挂载相当于我们不用创建文件,docker直接将给我们创建文件了,自己挂载好处在于我们有自己的逻辑。

5.自定义镜像:

我的理解就是先创建一个干净的文件,在里边写一个(可以让ai写)dockerfile,然后把必要的文件和它放在一起,然后在这个干净的文件里执行docker bilud命令

注意这个expose表示的是我这个镜像占用什么端口,是-p后面那个参数,给使用镜像的人明确的。看一个案例:

那个命令-t后面跟你这个镜像的名字,后面.表示这个dockerfile在哪里,.表示就在这个目录里。这就创建好了,然后你可以去创建容器或者save发给别人。

这是对应的dockerfile

6.后续还有docker仓库和dockerComp什么玩意,后再说,这些已经够了

相关推荐
草莓熊Lotso2 小时前
Qt文件操作:QFile读写全解析
运维·开发语言·c++·人工智能·qt
一路往蓝-Anbo2 小时前
第 10 章:OpenAMP 实战——构建 M33 与 Linux 的 RPMsg 消息隧道
linux·运维·服务器·驱动开发·stm32·单片机·嵌入式硬件
Starry_hello world2 小时前
Linux 网络(6)
linux·运维·网络
切糕师学AI2 小时前
Kubernetes ReplicaSet 详解
云原生·容器·kubernetes
rider1892 小时前
基于docker安装yapi接口文档服务
docker·容器·yapi
i建模2 小时前
通过Hyprland事件查看器(如`wev`)修改物理按键的扫描码
linux·运维
_OP_CHEN2 小时前
【Linux系统编程】(三十八)进程信号拓展:可重入函数 /volatile/SIGCHLD 全解析
linux·运维·进程·c/c++·信号·可重入函数·volatile
papaofdoudou3 小时前
Linux内核任务调度时机总结
linux·运维·网络
开开心心_Every3 小时前
系统清理工具清理缓存日志,启动卸载管理
运维·服务器·网络·数学建模·电脑·excel·抽象代数