容器架构-Docker-02
今日内容:
一、Docker容器管理🌟🌟
运行起来的镜像可以称为容器,1个容器相当于是1个进程。
以docker container
开头的指令一般表示容器管理指令,部分指令container可以省略
1.1 容器管理的操作
1.1.1 查看容器
案例:查看当前运行中的容器,查看下80端口是否被占用
1.1.2 创建/运行容器
创建容器(一般直接用run)
运行容器
选项说明:
- -d 容器后台运行.
- -p 端口映射,外部或其他服务器想要访问容器内部的某个服务的端口.
- -p 外部用于访问的端口:容器内部服务的端口
- –name 指定容器的名字
- -i 以交互式模式运行容器,通常与
-t
一起
- -i 为程序重新分配一个伪输入终端,通常与
-i
一起
docker run 的背后做了很多事情:
- docker create 创建容器.
- docker start 启动容器.
- docker stop 关闭容器. #向容器中的主进程,pid 1 进程发出信号(kill),关闭.
- docker restart重启重启
案例01:创建一个nginx-alpine的容器并运行
案例02:创建centos容器,并交互运行,进入容器内部
注意事项:
以-it
运行的容器,如果退出了会怎么样?
这也是-it
的缺点!
1.1.3 启动/停止容器
案例:以上方法均在容器上用一遍
1.1.4 删除容器
单个删除
批量删除
案例:删除已有的容器
1.1.5 进入正在运行的容器
方法一exec
:将分配一个新的终端
方法二attach
:使用相同的终端
案例:exec进入已经运行的容器
测试访问
exec和attach的区别
docker container 指令 |
exec |
attach |
共同点 |
连接到容器 |
连接到容器 |
区别 |
连接的时候创建终端 |
容器要有终端(容器进程中要有个/bin/bash 或/bin/sh) 只能连接到已有的终端中. |
区别 |
不同的exec连接互不影响, |
共用,所有连接都一样 |
1.1.6 查看容器信息与状态
1.1.7 容器夯住才能一直运行🌟
体会下面2个命令的区别:
执行后,没加sleep
的容器刚运行就消失了,加了sleep
的容器维持了20秒
这是因为容器任务执行结束后,它也就自动退出了,因此 ,想要容器在后台(-d)一直运行,那么就要对容器运行的时候加上初始命令,使容器夯住(阻塞/前台运行)
例如:如何后台持续运行纯净系统的容器(Centos)
1.1.8 容器传输文件
怎么跟容器互相传输文件?使用docker cp
命令
|
|
源 |
目标 |
宿主机–>容器 上传 |
docker cp |
路径或文件 |
容器:容器中目录 |
容器–>宿主机 下载 |
docker cp |
容器:容器中目录 |
路径或文件 |
案例01:从容器下载文件
案例02:上传文件到容器
1.1.9 commit自定义镜像🌟
commit用于处理容器,生成镜像.
使用流程:
- 运行服务镜像或系统镜像,启动后成为容器.
- 根据我们的需求,对容器进行修改.
- 测试完成后.
- 最后通过commit命令把容器保存为镜像.
- 根据新生成的镜像创建容器并测试.
案例:修改nginx容器,生成自定义镜像
- 需求:
- 基于ngx镜像创建容器
- 修改站点目录 /app/code/restart/ (default.conf)
- 上传代码,解压
- 测试
- commit
1、创建容器
2、进入容器,修改配置文件,准备环境
3、上传html代码
重启服务测试下
4、根据容器生成镜像
5、根据新的镜像,重新创建容器,端口81
测试访问http://10.0.0.81:81
1.1.10 容器导出导入
导出容器成tar包
将打包文件拷贝到另一台机器中,导入成镜像(有坑)
二、端口映射
容器的端口映射怎么实现的?
- 使用
docker run -p
的时候,外界访问docker容器中的服务或端口,需要使用端口映射。
- 本质是通过iptables nat规则实现的,在nat表中创建了docker自定义的链
2.1 背后具体做了什么?
-
开启内核转发功能(需要我们自己开启)
查看端口信息:
2.2 用户访问的时候经历了什么
内部通过虚拟网卡
来实现分配,如图
2.3 端口映射的案例
2.3.1 一对一映射
还是使用docker run -p
关于-p
选项的详细描述
docker run |
|
-p选项(小写字母P) 宿主机端口:容器中的端口 |
-p 80:80 -p 443:443 |
-p :容器中端口 |
-p :80 表示宿主机端口随机,很少用. |
-p 端口范围:端口范围 |
80-88:80-88 |
2.3.2 多对多映射
映射8080,8081,8082 到容器中容器中也是8080,8081,8082
2.3.3 IP绑定端口
用户只能通过宿主机的某个网卡连接这个端口,起安全防护作用
三、数据卷挂载
3.1 为什么需要挂载数据
数据放容器里,要是不小心rm -f
删了怎么办?
为了解决这个数据持久化的问题,需要让数据永久保存在宿主机中,通过挂载的方式挂
到容器上
3.2 选项补充
3.2.1 docker run选项补充
--rm
选项
- 容器退出的时候,容器自动删除
- 一般用于测试,临时使用容器
--restart
选项,容器的重启策略
- always 自动重启
- unless-stopped 只在容器关闭,停止的时候
- on-failure 只在失败的时候重启
- 默认,不自动重启
3.2.2 docker exec选项补充
在进入Mysql或者redis等数据库时候,可以直接exec进入数据库操作终端,而不是/bin/bash,方法如下:
3.3 挂载项目
将站点文件/站点目录、配置文件目录、日志目录以-v
的方式挂载
3.3.1 挂载单个站点文件
使用数据卷挂载index.html到容器中的/usr/share/nginx/html/index.html
测试
提示:
如果宿主机文件内容改变了,需要重启容器才能生效
3.3.2 挂载站点目录
需求:
- 用数据卷挂载:代码目录.
- 用数据卷挂载:配置文件,配置文件目录.
- 用数据卷挂载:数据目录(数据库)
- 还可以用于日志
补充:
Nginx - alpine镜像的配置文件:
- 配置文件子目录: /app/docker/restart/conf/nginx/conf.d/
- 挂载到:/etc/nginx/conf.d/
- 配置文件主目录: /app/docker/restart/conf/nginx/nginx.conf
- 挂载到:/etc/nginx/nginx.conf
- 站点目录: /app/docker/restart/code/
- 挂载到:/app/code/restart/
实现:
3.4 数据卷空间
应用场景:只关注容器中的数据不丢,不关注数据具体放在哪里
注意:
nginx容器的日志默认是输出到docker标准输出和标准错误输出的,而不是存放在文
件中。未来查看日志的时候,不用进入到容器,然后tail/less使用命令查看.
直接使用docker logs 容器id或名字 就可以看日志。
相当于查看access.log或error.log
3.5 随机数据卷(较少使用)
注意:
在Docker version 26.1.3中,测试已经不行了,会报错
3.6 容器时区的问题
进入容器内执行
测试,时区没有生效。。。。还是要用时网上找吧
3.7 数据卷使用与容器架构
运行多个docker的时候,只需要维护一份代码