一个容器就相当于一个微小的虚拟机,不能直接ssh容器,只能ssh到宿主机

docker exec -it <容器ID> ps aux // 进入容器看所有进程
docker top <容器ID> // 宿主机直接看容器进程
查看容器里面运行何种程序
root@xiaoyu:~# docker top my-nginx-1

补:一个容器里面只跑一个进程( 最佳实践建议)
|
软件 |
进程模型 |
表现(容器内) |
目的 |
|
Nginx |
多进程模型 |
1 个主进程( root 用户 ) + N 个工作进程 (message+ 用户 ) |
充分利用多核 CPU,提高并发能力 |
|
MySQL |
单进程多线程模型 |
1 个主进程 |
线程切换开销比进程小,适合高并发数据库场景 |
容器的网络类型
driver 驱动 –>3种不同类型
bridge 桥(默认) 容器通过网络连接到docker宿主机–>容器有自己独立的ip地址,能通过宿主机的docker0或者自己创建的网络上网,别人也可以访问进来–>SNAT、DNAT
host 主机 容器没有IP地址、直接使用宿主机的ip和端口,但是使用的端口号不能和其他的已经使用的端口号产生冲突
null 空/无 孤立,不能连网,可存数据
container模式 多个容器共享一个ip地址
overlay网络:实现跨主机的docker容器之间的通信

root@xiaoyu:~# docker network ls

创建一个网络
root@xiaoyu:~# docker network create my-net
![]()


ip add

启动容器使用我们自己创建的网络
root@xiaoyu:~# docker run -d –network my-net –name my-net-nginx-2 -p 9001:80 nginx
![]()
host、null只能有一个,只能创建桥接类型

host模式下,启动容器的时候不需要接-p选项,不需要进行NAT映射,直接使用宿主机的IP地址和端口

ss 查看本机开放了哪些端口
root@xiaoyu:~# ss -anlupt|grep 80

所有的容器上网都需要经过宿主机,底层使用的是iptables的SNAT和DNAT
root@xiaoyu:~# iptables -L -t nat -n //查看系统 NAT 表的所有规则(数字格式)

overlay网络:实现跨主机的docker容器之间的通信
overlay(虚拟网络)是Docker Swarm模式下的一种跨主机网络驱动,借助传统的网络之上,再进行一次封装,通过vxlan协议进行封装加密
Docker Swarm:是docker公司推荐的容器集群管理软件–>容器编排软件
coreOS:rocket–>容器软件
podman:容器软件
containerd:容器软件
k8s:Kubernetes 是容器集群管理软件–>容器编排软件
应用层–>vxlan–>传输层(UDP)–>网络层–>数据链路层–>物理层
-i 不区分大小写筛选
root@xiaoyu:~# docker inspect my-nginx-1 | grep -i address

卷(volume)

启动容器–>启动一个进程–>运行在内存里,如果进程退出,数据会保存到哪里?
内存里的数据,停电会丢失
磁盘里的数据,停电不会丢失
容器里的数据–>想办法保存到磁盘里–>持久化存储–>永久保存
卷:实现容器和宿主机之间的数据保存和共享
实现容器和容器之间的数据共享
试卷、读书破万卷
卷:容器、对象、存储知识 –>就是存储数据的地方
mysql 创建一个库 –>文件夹
创建一个表 —文件(linux中一切皆文件)
/var/lib 目录是 Linux 系统中存放各类应用程序的持久化数据、状态文件、数据库文件的核心目录,系统或软件运行时产生的需要长期保存的东西,基本都存在这里
root@xiaoyu:/# cd /var/lib/docker



root@xiaoyu:/var/lib/docker/volumes/6f3d4467f9ddd2f156037535c2ab03630e573f8faa657d64e359163924668901/_data# docker inspect xiaoyu-mysql-1

mount 挂载 —》挂车
将u盘或者移动硬盘挂到系统里加载,可以将u盘里的数据拷贝到系统,也可以将系统里的数据拷贝到u盘里
移动硬盘 + 系统里 —》挂载
umount 卸载
验证:

root@xiaoyu:/var/lib/docker/volumes# docker inspect xiaoyu-mysql-1 | jq -r '.[0].Mounts'

/var/lib/mysql –》默认MySQL存放数据的目录
复制会话查看


正常停止容器,容器里的数据会丢失吗?/var/lib/docker/volumes/ 不会丢失,会保存
如何将容器里的数据保存到宿主机? volume
如何在容器和宿主机之间传输数据? docker cp
一台机器上多容器可以使用一个卷
创建卷:https://docs.docker.com/engine/storage/volumes/#a-volumes-lifecycle
例:启动一个nginx容器,挂载一个卷myweb,卷里由网站的首页index.html和照片fj.jpg
默认情况:大多数容器启动时不会自动创建卷,只有当容器镜像的 Dockerfile 里定义了 VOLUME 指令,或者你在 docker run 时显式用 -v/–mount 参数指定挂载,才会创建卷

1、创建卷
docker volume create myweb


"Mountpoint": "/var/lib/docker/volumes/myweb/_data", //在这个文件创建首页
2、启动容器使用卷myweb
myweb 卷存放你的自定义 index.html、fj.jpg(要共享的 html / 图片)
/usr/share/nginx/html Nginx 容器 “找网站内容” 的默认路径
root@xiaoyu:/var/lib/docker/volumes/myweb/_data# docker run -d –name=xiaoyu-nginx-6 –mount source=myweb,destination=/usr/share/nginx/html -p 8016:80 nginx

docker inspect xiaoyu-nginx-2




3种不同方式使用卷
1、docker run -d –name=xiaoyu-nginx-2 –mount source=myweb,destination=/usr/share/nginx/html -p 8010:80 nginx
2、docker run -d –name=xiaoyu-nginx-2 -v myweb:/usr/share/nginx/html \\-p8010:80 nginx
3、docker run -d –name=xiaoyu-nginx-3 -v /testweb:/usr/share/nginx/html -p 8040:80 nginx

总结:删除容器不会主动删除卷
docker volume create logs
实现的功能就是在logs卷对应的目录下新建2个文件夹app1和app2
–rm 当容器退出的时候,自动删除容器
docker run –rm –mount src=logs,dst=/logs alpine mkdir -p /logs/app1 /logs/app2
sh -c "sleep 100" 让容器启动起来后运行sh这个shell,里面运行sleep 100命令 –>暂停100秒 结束后Exited,需手动删除
docker run -d –name=app1 –mount src=logs,dst=/var/log/app1,volume-subpath=app1 alpine:latest sh -c "sleep 100"
运行完后直接删除
docker run -d –rm –name=app2 –mount src=logs,dst=/var/log/app1,volume-subpath=app1 alpine:latest sh -c "sleep 100"
例:启动一个容器app1,容器启动后,立马进入这个容器,当我们退出容器时,容器会被立马删除
docker run –rm -it –name=app3 –mount src=logs,dst=/var/log/app1,volume-subpath=app1 alpine:latest sh


-d
–rm –it 选项 一起使用有冲突,容器不会自动删除
启动指定内容容器内自动挂卷







