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这个文件