1.docker常用操作和卷

1.Rocky9.x安装docker
	添加rocky9.x的docke镜像地址
		curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

	安装docker-ce
		dnf install docker-ce -y
		
	启动docker-ce,并设置开机自启动
		systemctl enable docker.service --now
		
	添加加速地址
	mkdir -p /etc/docker
	sudo tee /etc/docker/daemon.json <<-'EOF'
	{
	"registry-mirrors": ["https://gm0o7c4v.mirror.aliyuncs.com"]
	}
	EOF
	sudo systemctl daemon-reload
	sudo systemctl restart docker
	
2.修改默认的docker存放容器数据盘的位置
	首先把docker停止掉
		systemctl stop docker.socket
		
	把docker原有的数据盘的文件复制到/data下
		mkdir -p /data
		cp -ra /var/lib/docker /data/
	
	修改/etc/docker/daemon.json
	说明:
		Docker 17.04 及更早版本: "graph": "/data/docker"
		Docker 17.05 及更⾼版本: "data-root": "/data/docker"
	
	vim /etc/docker/daemon.json
	修改成如下内容
	{
	"registry-mirrors": ["https://gm0o7c4v.mirror.aliyuncs.com"],
	"data-root": "/data/docker"
	}
	解释:需要在]后面加一个逗号,不然肯定会报错
		"data-root": "/data/docker"指定docker数据镜像存放目录
	
	重启docker
		systemctl daemon-reload
		systemctl restart docker.service
	
	查看是否修改成功
		docker imfo
		。。。。
		Docker Root Dir: /data/docker
		。。。。
		

3.docker常用命令解释
	搜索容器镜像,比如我要搜索一个rocky的镜像
		docker search rocky
		
	或者,我要搜索一个nginx的镜像
		docker search nginx
		解释:
			search
				搜索指定镜像的命令
		
	下载镜像,比如我要下载一个rockylinux9.4
		docker pull rockylinux:9.4
		解释:
			pull
				拉取镜像命令
		
	或者下载一个nginx最新的镜像
		docker pull nginx:latest
		解释:
			nginx:latest
				latest表示最新版本,
				如后面是:9.4说明版本就是9.4的
				
	下载指定1.26版本的nginx
		docker pull  nginx:1.26
		解释:
			nginx:1.26,1.26是指定软件的版本这里是nginx的版本
			
	查看当前所有的镜像容器
		docker images
		解释:
			images
				查看当前所有容器镜像的名称和tag号等信息
		
	查看nginx:1.26容器的详情
		docker image inspect nginx:1.26
		解释:
			inspect
				查看详细信息
		
	删除没有标签的镜像
		docker image prune  
		WARNING! This will remove all dangling images.
		Are you sure you want to continue? [y/N] y输入y
		解释:
			prune
				删除没有标签或者tag号的容器
		
	删除nginx:1.26容器的镜像
		docker rmi nginx:1.26
		解释:
			rmi
				删除指定镜像
		
	删除IMAGE ID的镜像
		1.查看当前所有的镜像容器
			docker images
			返回结果
			REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
			rockylinux   9.4       6e2b7744bc8b   41 minutes ago   416MB
			nginx        latest    605c77e624dd的   2 years ago      141MB
	
		2.删除IMAGE ID为605c77e624dd的
			docker rmi -f 605c77e624dd
			返回结果:
			Untagged: nginx:latest
			Untagged: nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
			Deleted: sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
			Deleted: sha256:b625d8e29573fa369e799ca7c5df8b7a902126d2b7cbeb390af59e4b9e1210c5
			Deleted: sha256:7850d382fb05e393e211067c5ca0aada2111fcbe550a90fed04d1c634bd31a14
			Deleted: sha256:02b80ac2055edd757a996c3d554e6a8906fd3521e14d1227440afd5163a5f1c4
			Deleted: sha256:b92aa5824592ecb46e6d169f8e694a99150ccef01a2aabea7b9c02356cdabe7c
			Deleted: sha256:780238f18c540007376dd5e904f583896a69fe620876cabc06977a3af4ba4fb5
			Deleted: sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f
			
	导入nginx:1.26的备份镜像
		[root@Docker-1 ~]# docker load -i /opt/nginx-1.26.tar.gz 
		返回结果:
		32148f9f6c5a: Loading layer [==================================================>]  77.83MB/77.83MB
		19d8180bc03a: Loading layer [==================================================>]  113.9MB/113.9MB
		b503a08457e3: Loading layer [==================================================>]  3.584kB/3.584kB
		28bc3c939a8d: Loading layer [==================================================>]  4.608kB/4.608kB
		ad2f52a870b6: Loading layer [==================================================>]   2.56kB/2.56kB
		cd8d591df8d7: Loading layer [==================================================>]   5.12kB/5.12kB
		1091814e6af8: Loading layer [==================================================>]  7.168kB/7.168kB
		Loaded image: nginx:1.26
		解释:
			load
				加载内容
			
			-i
				指定要加载的内容存放的目录下面指定文件
				如/opt/nginx-1.26.tar.gz
		
	导出rockylinux:9.4的镜像到/opt/并命名成rockylinux-9.4.tar.gz
		docker load -i /opt/nginx-1.26.tar.gz 
		返回结果:
		32148f9f6c5a: Loading layer [==================================================>]  77.83MB/77.83MB
		19d8180bc03a: Loading layer [==================================================>]  113.9MB/113.9MB
		b503a08457e3: Loading layer [==================================================>]  3.584kB/3.584kB
		28bc3c939a8d: Loading layer [==================================================>]  4.608kB/4.608kB
		ad2f52a870b6: Loading layer [==================================================>]   2.56kB/2.56kB
		cd8d591df8d7: Loading layer [==================================================>]   5.12kB/5.12kB
		1091814e6af8: Loading layer [==================================================>]  7.168kB/7.168kB
		Loaded image: nginx:1.26
		解释:
			save -o /opt/rockylinux-9.4.tar.gz
				保存,并保存到指定目录比如/opt下
				
			rockylinux:9.4
				现有的容器镜像
				
	给nginx:1.26镜像打一个标签,标签名称为v1.0
		[root@Docker-1 ~]# docker image tag nginx:1.26 nginx:v1.0
		
		查看nginx标签是否成功
		[root@Docker-1 ~]# docker images
		REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
		rockylinux   9.4       6e2b7744bc8b   57 minutes ago   416MB
		nginx        1.26      e7580268c63c   3 weeks ago      188MB
		nginx        v1.0      e7580268c63c   3 weeks ago      188MB
		解释:
			image tag
				image tag源镜像的:版本 新镜像:版本
				
4.启停容器并进入容器等操作命令
	启动nginx:1.26容器,并映射80端口,并且分配标准输入和输出
		docker run -itd -p 80:80 nginx:1.26
		解释:
		run 
			启动一个新容器
		-itd
			分配一个tty终端,d后台运行
			
			-p 80:80
				-p映射一个容器内80端口到宿主机的80端口对外提供服务
				
		nginx:1.26
			容器名称和版本号
			
	查看当前运行中的容器
		[root@Docker-1 ~]# docker ps 
		返回结果
		CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS                               NAMES
		91f55de3d8b7   nginx:1.26   "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   great_grothendieck
	
	测试是否成功
		[root@Docker-1 ~]# curl  -I 127.0.0.1
		返回结果:
		HTTP/1.1 200 OK
		Server: nginx/1.26.1
		Date: Thu, 18 Jul 2024 17:00:01 GMT
		Content-Type: text/html
		Content-Length: 615
		Last-Modified: Tue, 28 May 2024 13:28:07 GMT
		Connection: keep-alive
		ETag: "6655dbe7-267"
		Accept-Ranges: bytes
		解释:
			HTTP/1.1 200 OK
		    Server: nginx/1.26.1
			出现这两行说明配置成功了,因为版本号是1.26
			
	进入到nginx:1.26容器内
		1.首先查看nginx运行中的容器的ID
			[root@Docker-1 ~]# docker ps -a
			CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS                               NAMES
			91f55de3d8b7   nginx:1.26   "/docker-entrypoint.…"   4 minutes ago   Up 4 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   great_grothendieck
			解释:
				CONTAINER ID
		        91f55de3d8b7
				这里就是当前容器运行中容器ID的名称
				
		2.进入91f55de3d8b7容器内
			[root@Docker-1 ~]# docker exec -it 91f55de3d8b7 /bin/bash
			root@91f55de3d8b7:/# 
			解释:
				docker exec
					进入容器内
					
				-it
					分配一个tty终端,也就是输出和输出命令的界面
				
				91f55de3d8b7
					运行中的容器的名称ID,每次都不一样
					
				/bin/bash
					命令启动时运行的命令,打开容器交互段
					
				root@91f55de3d8b7:/# 
					发现这里的终端和本机的终端发生变化了,就说明进入到容器内了
					
		3.容器内运行命令,查看系统是什么发行版本
			root@91f55de3d8b7:/# cat /etc/os-release 
			返回结果:
			PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
			NAME="Debian GNU/Linux"
			VERSION_ID="12"
			VERSION="12 (bookworm)"
			VERSION_CODENAME=bookworm
			ID=debian
			HOME_URL="https://www.debian.org/"
			SUPPORT_URL="https://www.debian.org/support"
			BUG_REPORT_URL="https://bugs.debian.org/"
			
		4.退出容器
			root@91f55de3d8b7:/# exit
			
		
		删除刚才运行的nginx:1.26
		[root@Docker-1 ~]# docker rm -f 91f55de3d8b7
		91f55de3d8b7
		解释:
			rm -f
				强制删除
				
	运行nginx:1.26容器并命名为nginx-1.26,并映射80端口
		[root@Docker-1 ~]# docker run -itd --name nginx-1.26 -p 80:80 nginx:1.26
		92010e65db24b5293d36d80d215843036ba685919df46581777e6e39e75b814e
		解释:
			--name nginx-1.26
				重新命名,方便后面的查看,快速定位到容器服务
				
	查看nginx-1.26是否命名成功
		[root@Docker-1 ~]# docker ps -a
		CONTAINER ID   IMAGE        COMMAND                  CREATED              STATUS              PORTS                               NAMES
		92010e65db24   nginx:1.26   "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx-1.26
		解释:
			ps -a
				显示所有运行中的容器和停止的容器
		
			NAMES
		    nginx-1.26
				这里显示nginx-1.26,说明命名成功
	
		
	启动一太rockylinux9.4,运行10秒后自动删除
		docker run --rm  --name myrocky9.4 rockylinux:9.4 sleep 10
		解释:
			--rm
				运行完以后直接删除容器
			
			sleep 10
				前台运行10秒中
				
	删除掉运行中所有的容器,和已经停止的容器
		docker rm -f `docker ps -a -q`
		
	把宿主机/root/123.txt拷贝到容器内
		1.先来创建文件
			touch /root/123.txt
		
		2.启动一个nginx容器测试文件
			docker run -itd --name nginx-1.26 -p 80:80 nginx:1.26
			
		3.拷贝123.txt
			3.1先来查看容器ID
				CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS                               NAMES
				6c436bbe6aea   nginx:1.26   "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx-1.26
			
			3.2拷贝123.txt到运行中的6c436bbe6aea容器里/root/目录下
				[root@Docker-1 ~]# docker cp /root/123.txt 6c436bbe6aea:/root/
				返回结果:
				Successfully copied 1.54kB to 6c436bbe6aea:/root/
				解释:
					docker cp
						从宿主机把文件拷贝到运行中的容器内
			
			3.3验证是否拷贝成功
				[root@Docker-1 ~]# docker exec -it 6c436bbe6aea /bin/bash
				root@6c436bbe6aea:/# ls /root/
				123.txt
		
	停止和启董容器
		1.停止容器
			docker stop 6c436bbe6aea
		
		2.查看6c436bbe6aea是否停止
			[root@Docker-1 ~]# docker ps -a
			CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS                     PORTS     NAMES
			6c436bbe6aea   nginx:1.26   "/docker-entrypoint.…"   7 minutes ago   Exited (0) 4 seconds ago             nginx-1.26
			解释:
				STATUS                  
                Exited (0) 4 seconds ago
				这里的状态显示exit说明退出的时间
		
		3.启动6c436bbe6aea
			[root@Docker-1 ~]# docker start 6c436bbe6aea
			6c436bbe6aea
			
		4.查看是否启动成功
			[root@Docker-1 ~]# docker ps -a
			CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS                               NAMES
			6c436bbe6aea   nginx:1.26   "/docker-entrypoint.…"   9 minutes ago   Up 2 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx-1.26
			解释:
				STATUS      	
				Up 2 seconds
					显示UP说明启动成功,也就是说已经在运行中
					
5.暴露端口
	暴露docker容器端口,方便对外提供服务
	容器默认运⾏在隔离的环境中,因此外部⽤户⽆法直接访问容器内的资源。为了使外部⽤户能够访问容器中的应⽤程序,需要在创建容器时使⽤ --publish 参数来指定哪些端⼝应该对外开放。
	这个过程实际上是在宿主机上添加了一条iptbles DNAT规则,这样即使容器本身是隔离的,⽤户也可以通过宿主机特定的端⼝访问到容器内的服务。
	使用方法:
		-p hostPort:containerPort
		-p hostip:hostPort:containerPort  多个容器都想使⽤80端
		-p hostip::containerPort (随机端⼝)  
		-P(大写) (随机端⼝)
		
	5.1启动一个对外的nginx容器服务,并指定端口为8880,容器内端口80
		[root@Docker-1 ~]# docker run -itd -p 8880:80 nginx:1.26 
		返回结果:
		f8b0aaa181bbfd6ead17acf76272ece85d8887b7bd3a47ea72410470a035f65b
		
		5.1.1查看是否启动成功和端口是否映射成功
				[root@Docker-1 ~]# docker ps -a
				返回结果:
				CONTAINER ID   IMAGE        COMMAND                  CREATED              STATUS              PORTS                                   NAMES
				f8b0aaa181bb   nginx:1.26   "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:8880->80/tcp, :::8880->80/tcp   vigorous_poitras
				解释:
				PORTS                                	
				0.0.0.0:8880->80/tcp, :::8880->80/tcp
					0.0.0.0:8880为宿主机+8880端口
					容器内为80端口
					也就是说把容器内的80端口映射到宿主机的8880端口对外提供服务监听
		5.1.2查看iptables规则
			[root@Docker-1 ~]# iptables -t nat -S
			-P PREROUTING ACCEPT
			-P INPUT ACCEPT
			-P OUTPUT ACCEPT
			-P POSTROUTING ACCEPT
			-N DOCKER
			-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
			-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
			-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
			-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE
			-A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 80 -j MASQUERADE
			-A DOCKER -i docker0 -j RETURN
			-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80
			-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8880 -j DNAT --to-destination 172.17.0.3:80
			解释:
				-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8880 -j DNAT --to-destination 172.17.0.3:80
					这是在iptables中添加的规则,容器内80端口映射到宿主机的8880端口
					
	5.2启动一个画图容器,并不指定端口,使用随机端口,
	     5.2.1启动容器,使用随机端口,容器内端口为80
			[root@Docker-1 ~]# docker run -itd -P excalidraw/excalidraw:latest 
			e29bffb0fb9ffa6c922fd9cad434104c00b23405e7de2bc29bdd385615c114bb
			解释:
			-P(大写P)
				使用随机端口,一办随机端口为3200以上的端口
		
		5.2.2查看随机端口是多少
			[root@Docker-1 ~]# docker ps -a
			CONTAINER ID   IMAGE                          COMMAND                  CREATED          STATUS                            PORTS                                       NAMES
			e29bffb0fb9f   excalidraw/excalidraw:latest   "/docker-entrypoint.…"   6 seconds ago    Up 5 seconds (health: starting)   0.0.0.0:32768->80/tcp, :::32768->80/tcp     youthful_lehmann
			解释:
				PORTS                                  
			    0.0.0.0:32768->80/tcp, :::32768->80/tcp       
				容器内的80端口,映射到宿主机的随机端口,这里的随机端口为32768
		
6.数据持久化
	为了解决这个问题,Docker引用了卷(Volume)的概念。通过使用卷,可以将“容器中要存储数据的目录”与“宿主机上的某个目录进行绑定”。而不将数据存储⾄容器的读写层,因此,卷是⼀种可以绕过联合文件系统,实现容器数据的持久化的放式。这样,即使容器被删除或重新创建,数据卷中的数据也可以被保留下来。
    同时卷可以提⾼I/O性能,因为它直接在主机的⽂件系统上操作,不需要通过容器的存储引擎。这对于对I/O性能有要求的应用,如MySQL数据库,是通常有益的。https://docs.docker.com/storage/volumes/	
	命令使用方法
		Docker有两种类型的卷,每种类型都在容器中存在⼀个挂载点,但其在宿主机上的位置有所不同;

		volumes :该卷由Docker自行管理的数据卷,通常在 /var/lib/docker/volumes 目录下。
	
		bind mounting :这种类型的数据卷允许,直接将主机系统上的目录路径绑定到容器中。
	
		tmpfs :挂载仅存储在主机系统的内存中,并且不会写⼊主机系统的文件系统中。(临时存储)
		实战:在容器中使⽤Volumes
		
		Docker管理的卷:
		
			docker run -it --name busybox -v /data busybox
		
			docker inspect -f {{.Mounts}} busybox
		
		bind挂载卷:
	
			docker run -it -v HOSTDIR:VOLUMEDIR --name bbox2 busybox
		
			docker inspect -f {{.Mounts}} busybox
	
	6.1创建一个mysql8.0的镜像,映射宿主机目录到容器目录下实现容器持久化存储
		docker run -d --name mysql1 -v /var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:8.0
		解释:
			-v /var/lib/mysql
				-v指定本地/var/lib/docker/volumes/目录映射到容器内的/var/lib/mysql
		
			-e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:8.0
				传递环境变量,不设置mysql密码
	
	6.2查看是否映射成功
		docker inspect mysql1
		返回结果:
		。。。。。。
		        "Mounts": [
            {
                "Type": "volume",
                "Name": "7d51bc9a3a0ce4b1b2e0d9bb213ed20d1d238757d665b67e5ede653fee8cf9fa",
                "Source": "/data/docker/volumes/7d51bc9a3a0ce4b1b2e0d9bb213ed20d1d238757d665b67e5ede653fee8cf9fa/_data",
                "Destination": "/var/lib/mysql",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
		。。。。。。
		解释:
			"Name": "7d51bc9a3a0ce4b1b2e0d9bb213ed20d1d238757d665b67e5ede653fee8cf9fa"
				容器映射的文件名称
				
			"Source": "/data/docker/volumes/7d51bc9a3a0ce4b1b2e0d9bb213ed20d1d238757d665b67e5ede653fee8cf9fa/_data",
				容器映射的目录存放路径
				
			 "Destination": "/var/lib/mysql",
				容器内的路径
				
	6.3查看volume相信信息
		[root@Docker-1 ~]# docker volume ls
		DRIVER    VOLUME NAME
		local     7d51bc9a3a0ce4b1b2e0d9bb213ed20d1d238757d665b67e5ede653fee8cf9fa
		解释:
			volume ls
				当前有那么卷
		
		查看7d51bc9a3a0ce4b1b2e0d9bb213ed20d1d238757d665b67e5ede653fee8cf9fa,更详细的信息
			docker volume inspect 7d51bc9a3a0ce4b1b2e0d9bb213ed20d1d238757d665b67e5ede653fee8cf9fa
			返回结果:
			[
				{
					"CreatedAt": "2024-07-19T14:53:08+08:00",
					"Driver": "local",
					"Labels": {
						"com.docker.volume.anonymous": ""
					},
					"Mountpoint": "/data/docker/volumes/7d51bc9a3a0ce4b1b2e0d9bb213ed20d1d238757d665b67e5ede653fee8cf9fa/_data",
					"Name": "7d51bc9a3a0ce4b1b2e0d9bb213ed20d1d238757d665b67e5ede653fee8cf9fa",
					"Options": null,
					"Scope": "local"
				}
			]

	6.4volume别名
		
		6.4.1再来启动mysql容器名称叫mysql2,使用-v选项实现卷别名
			docker run -d --name mysql1 -v mysql2:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:8.0
			解释:
				-v mysql2:/var/lib/mysql
					-v mysql2是别名,volume显示的名称为mysql2
					
		6.4.2查看别名是否生效
			[root@Docker-1 ~]# docker volume ls
			DRIVER    VOLUME NAME
			local     mysql2
			解释:
				local     mysql2,这里可以看到别名成功,和我们给的名称是一致的
				
		6.4.3查看mysql2详细信息
			[root@Docker-1 ~]# docker inspect mysql2 
			[
				{
					"CreatedAt": "2024-07-19T15:10:08+08:00",
					"Driver": "local",
					"Labels": null,
					"Mountpoint": "/data/docker/volumes/mysql2/_data",
					"Name": "mysql2",
					"Options": null,
					"Scope": "local"
				}
			]
		
		6.4.4进入容器内创建数据库
			4.4.4.1进入容器内
				docker exec -it 94084ad07c42 bash
			
			4.4.4.2进入mysql内
				mysql
			
			4.4.4.3创建zhangsan数据库
				mysql> create database zhangsan;
			
			4.4.4.4退出数据库和容器内
				mysql> exit
				Bye
				
				root@94084ad07c42:/# exit
				exit

		6.4.5查看/data/docker/volumes/mysql2/_data目录下的文件,看一下是否有zhangsan的文件夹
			[root@Docker-1 ~]# ls /data/docker/volumes/mysql2/_data
			auto.cnf        binlog.000004   client-cert.pem      ib_buffer_pool   ibtmp1          performance_schema   server-key.pem   zhangsan
			binlog.000001   binlog.index    client-key.pem       ibdata1         '#innodb_temp'   private_key.pem      sys
			binlog.000002   ca-key.pem     '#ib_16384_0.dblwr'   ib_logfile0      mysql           public_key.pem       undo_001
			binlog.000003   ca.pem         '#ib_16384_1.dblwr'   ib_logfile1      mysql.ibd       server-cert.pem      undo_002
			解释:
				zhangsan
					这个目录就是我们刚才创建的zhangsan的数据库
			
			
	6.5映射现有的mysql2的卷
		
		6.5.1首先删除掉运行中的mysql2容器,
			[root@Docker-1 ~]# docker ps -a
			CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                 NAMES
			94084ad07c42   mysql:8.0   "docker-entrypoint.s…"   14 minutes ago   Up 14 minutes   3306/tcp, 33060/tcp   mysql1
			[root@Docker-1 ~]# docker rm -f 94084ad07c42
			94084ad07c42

		
		6.5.2映射mysql2卷到新的容器里
			
			6.5.2.1启动一个新的mysql3容器,并映射现有的mysql2的卷,到新的容器里面
			[root@Docker-1 ~]# docker run -d --name mysql3 -v mysql2:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:8.0
			c25b0f3c6dad4faaae870493e972cd6772d3b0fce24584ebcc3914f5e7eeadfb
			
			6.5.2.2查看新启动的mysql3容器内是否有zhangsan这个数据库
				进入容器内
				[root@Docker-1 ~]# docker exec -it c25b0f3c6dad4f /bin/bash
				
				进入mysql
				root@c25b0f3c6dad:/# mysql
				Welcome to the MySQL monitor.  Commands end with ; or \g.
				Your MySQL connection id is 8
				Server version: 8.0.27 MySQL Community Server - GPL
				
				Copyright (c) 2000, 2021, Oracle and/or its affiliates.
				
				Oracle is a registered trademark of Oracle Corporation and/or its
				affiliates. Other names may be trademarks of their respective
				owners.
				
				Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
				
				查看所有的数据库,看看是否有zhangsan的新创建的数据库
				mysql> show databases;
				+--------------------+
				| Database           |
				+--------------------+
				| information_schema |
				| mysql              |
				| performance_schema |
				| sys                |
				| zhangsan           |
				+--------------------+
				5 rows in set (0.00 sec)
						
		
	6.6数据挂载-BindMounting
		在 Docker 中,可以使用Bind Mounting 的⽅式将宿主机上的⽬录或⽂件挂载到容器中,实现数据共享和持久化存储。
		例如,在部署静态⽹站时,可以将宿主机中存放静态网页文件的/html/目录录绑定到 Nginx 容器中的 /usr/share/nginx/html目录。这样即使容器被删除,静态⽹站的⽂件也不会丢失,因为这些文件实际上存储在宿主机上,并通过 Bind Mounting的方式挂载到容器中。与数据卷不同的是, Bind Mounting 不需要在容器创建时就定义数据卷,是在启动容器时动态地将宿主机中的⽬录或⽂件绑定到容器中,这种方式更加灵活。
		
		6.6.1创建一个nginx1.26的容器,并把宿主机的/data/nginx/html/映射到容器的/usr/share/nginx/html下
			[root@Docker-1 ~]# docker run -itd --name nginx-1.26 -v /data/nginxhtml:/usr/share/nginx/html -p 80:80 nginx:1.26
			e615ee26a98a5cebe660b91f50bcbd85e03709ae8af3c2bf69d6111393be9e1b
			解释:
				-v /data/nginxhtml:/usr/share/nginx/html
					把宿主机的/data/nginxhtml目录映射到容器里的/usr/share/nginx/html目录下
				
		6.6.2创建测试页面,测试映射是否成功
			[root@Docker-1 ~]# echo "test nginx hello" >> /data/nginxhtml/index.html
			
		6.6.3访问测试
			[root@Docker-1 ~]# curl 127.0.0.1
			test nginx hello
			解释:
				test nginx hello
					这里是输入的测试页面的内容
		
	6.7单容器多路径挂载
		当我们需要使⽤单个 Nginx 容器来提供多个虚拟主机服务,其中每个虚拟主机服务都有自己的网站内容和端⼝。
		具体来说,我们需要实现以下两个虚拟主机站点
		1、虚拟站点1:监听80端⼝,读取 /var/www/code1/index.html ,返回自定义的网站内容 hello nginx 80
		2、虚拟站点2:监听81端⼝,读取 /var/www/code2/index.html ,返回自定义的网站内容 hello nginx 81
		
		6.7.1思路:在宿主机上创建两个⽹站⽬录,然后通过宿主机挂载⾄虚拟机对应的⽬录下,同时需要准备 nginx.conf 配置文件:
		宿主机目录1: /html/code1/index.html -->挂载容器--> /var/www/code1/index.html
        宿主机目录1: /html/code2/index.html -->挂载容器--> /var/www/code2/index.html
		
		6.7.2创建对应的目录和文件
			创建目录
			[root@Docker-1 ~]# mkdir -p /html/code{1..2}/
			[root@Docker-1 ~]# mkdir -p /html/conf/
			创建文件
			[root@Docker-1 ~]# echo "hello nginx 80" > /html/code1/index.html
			[root@Docker-1 ~]# echo "hello nginx 81" > /html/code2/index.html
		
		
		6.7.3准备nginx主配置文件
			vim /html/conf/default.conf
			写入一下内容
			user  nginx;
			worker_processes  auto;
			
			error_log  /var/log/nginx/error.log notice;
			pid        /var/run/nginx.pid;
			
			
			events {
				worker_connections  1024;
			}
			
			
			http {
				include       /etc/nginx/mime.types;
				default_type  application/octet-stream;
			
				log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
								'$status $body_bytes_sent "$http_referer" '
								'"$http_user_agent" "$http_x_forwarded_for"';
			
				access_log  /var/log/nginx/access.log  main;
			
				sendfile        on;
				#tcp_nopush     on;
			
				keepalive_timeout  65;
			
				#gzip  on;
			
						server {
							listen       80;
							listen  [::]:80;
							server_name  localhost;
							location / {
								root   /var/www/html/code1;
								index  index.html index.htm;
							}
							error_page   500 502 503 504  /50x.html;
							location = /50x.html {
								root   /usr/share/nginx/html;
							}
						}
						server {
							listen       81;
							listen  [::]:81;
							server_name  localhost;
							location / {
								root   /var/www/html/code2;
								index  index.html index.htm;
							}
							error_page   500 502 503 504  /50x.html;
							location = /50x.html {
								root   /usr/share/nginx/html;
							}
						}
							
					}
		6.7.4启动容器
		[root@Docker-1 ~]# docker run -itd --name nginx-80-81-port -p80:80 -p81:80 -v /html/code1/:/var/www/html/code1 -v /html/code2/:/var/www/html/code2 -v /html/conf/nginx.conf:/etc/nginx/nginx.conf nginx:1.26
			-v /html/code1/:/var/www/html/code1
				宿主机目录/html/code1/映射到容器内的/var/www/html/code1
		
			-v /html/code2/:/var/www/html/code
				宿主机目录/html/code2/映射到容器内的/var/www/html/code2
				
			-v /html/conf/default.conf:/etc/nginx/conf.d/default.conf
				宿主机文件/html/conf/nginx.conf映射到容器内的/etc/nginx/nginx.conf这个文件		
		
		
		
		
		
		
		


Powered By Z-BlogPHP 1.7.3

 Theme By 优美模版

本博客为开源博客,本博客联系QQ:372097243