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