一、Docker能实现什么?
Docker技术能够实现以下功能:
1. **应用隔离**
- 通过容器化技术,将应用及其依赖打包,确保在不同环境中运行一致,避免“在我机器上能运行”的问题。
2. **快速部署与扩展**
- 容器启动速度快,资源占用少,适合快速部署和扩展应用,尤其在微服务架构中表现突出。
3. **环境一致性**
- 开发、测试、生产环境使用相同的镜像,确保一致性,减少环境差异导致的错误。
4. **资源高效利用**
- 相比虚拟机,容器共享主机操作系统内核,资源占用更少,运行更高效。
5. **持续集成与交付**
- 与CI/CD工具集成,自动化构建、测试和部署流程,提升开发效率。
6. **多版本并行**
- 支持同一应用的不同版本在相同主机上并行运行,便于测试和回滚。
7. **跨平台支持**
- 可在Linux、Windows、macOS等多种操作系统上运行,提供跨平台兼容性。
8. **微服务架构**
- 适合微服务架构,每个服务可独立打包、部署和扩展,提升系统灵活性和可维护性。
9. **简化配置管理**
- 通过Dockerfile定义容器配置,简化环境设置,确保一致性。
10. **社区与生态系统**
- 拥有丰富的镜像仓库和工具,支持快速获取和共享应用镜像。
总结来说,Docker通过容器化技术提升了应用开发、部署和管理的效率,增强了环境一致性,优化了资源利用,并支持微服务架构和持续交付。
二、实战应用部署
数据持久化部署案例:
[root@cjr ~]# mkdir -p /root/mynginx/html
[root@cjr html]# vi index.html
[root@cjr ~]# docker run -d --name nginx -p 80 -v /root/myngin/html:/usr/share/nginx/html nginx:1.26
1f3e661d00409ff701748363ebfe5ad0f7bd58fe5c088536d0b1715f7b828aa1
You have new mail in /var/spool/mail/root
[root@cjr ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f3e661d0040 nginx:1.26 "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:32768->80/tcp, :::32768->80/tcp nginx
[root@cjr html]# docker exec -it nginx bash
root@1f3e661d0040:/# cd /usr/share/nginx/html/
root@1f3e661d0040:/usr/share/nginx/html# ls
index.html
root@1f3e661d0040:/usr/share/nginx/html# cat index.html
hello wolrd
root@1f3e661d0040:/usr/share/nginx/html# exit
exit
You have new mail in /var/spool/mail/root
[root@cjr html]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f3e661d0040 nginx:1.26 "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:32768->80/tcp, :::32768->80/tcp nginx
以下是对你执行的命令及其作用的详细解释:
---
### 1. **创建目录**
```bash
[root@cjr ~]# mkdir -p /root/mynginx/html
```
- **`mkdir -p`**:递归创建目录,即使父目录不存在也会自动创建。
- **`/root/mynginx/html`**:在 `/root/mynginx` 下创建 `html` 目录。
- **作用**:为Nginx容器准备一个本地目录,用于存放网页文件。
---
### 2. **编辑 `index.html` 文件**
```bash
[root@cjr html]# vi index.html
```
- **`vi`**:使用 `vi` 编辑器创建或编辑文件。
- **`index.html`**:在 `/root/mynginx/html` 目录下创建或编辑 `index.html` 文件。
- **作用**:创建一个简单的HTML文件,内容为 `hello world`,用于测试Nginx服务。
---
### 3. **运行Nginx容器**
```bash
[root@cjr ~]# docker run -d --name nginx -p 80 -v /root/mynginx/html:/usr/share/nginx/html nginx:1.26
```
- **`docker run`**:启动一个新的容器。
- **`-d`**:以后台(守护进程)模式运行容器。
- **`--name nginx`**:为容器指定名称为 `nginx`。
- **`-p 80`**:将容器的80端口映射到主机的随机端口(Docker会自动分配一个端口,如32768)。
- **`-v /root/mynginx/html:/usr/share/nginx/html`**:将本地的 `/root/mynginx/html` 目录挂载到容器内的 `/usr/share/nginx/html` 目录。
- **`nginx:1.26`**:使用 `nginx:1.26` 镜像启动容器。
- **作用**:启动一个Nginx容器,并将本地的 `index.html` 文件挂载到容器的Nginx默认网页目录。
---
### 4. **查看容器运行状态**
```bash
[root@cjr ~]# docker ps
```
- **`docker ps`**:列出当前正在运行的容器。
- **输出**:
```
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f3e661d0040 nginx:1.26 "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:32768->80/tcp, :::32768->80/tcp nginx
```
- **`CONTAINER ID`**:容器的唯一ID。
- **`IMAGE`**:使用的镜像名称。
- **`PORTS`**:容器的80端口映射到主机的32768端口。
- **作用**:确认Nginx容器已成功启动。
---
### 5. **进入容器内部**
```bash
[root@cjr html]# docker exec -it nginx bash
```
- **`docker exec`**:在运行的容器中执行命令。
- **`-it`**:以交互模式运行,并分配一个伪终端。
- **`nginx`**:目标容器的名称。
- **`bash`**:在容器内启动一个Bash shell。
- **作用**:进入Nginx容器的命令行环境,方便查看或修改容器内部文件。
---
### 6. **查看挂载的 `index.html` 文件**
```bash
root@1f3e661d0040:/# cd /usr/share/nginx/html/
root@1f3e661d0040:/usr/share/nginx/html# ls
index.html
root@1f3e661d0040:/usr/share/nginx/html# cat index.html
hello world
```
- **`cd /usr/share/nginx/html/`**:进入Nginx的默认网页目录。
- **`ls`**:列出目录内容,确认 `index.html` 文件存在。
- **`cat index.html`**:查看 `index.html` 文件内容,确认内容为 `hello world`。
- **作用**:验证挂载的本地文件是否成功映射到容器内。
---
### 7. **退出容器**
```bash
root@1f3e661d0040:/usr/share/nginx/html# exit
```
- **`exit`**:退出容器的Bash shell,返回主机终端。
- **作用**:结束容器内的操作。
---
### 8. **再次查看容器状态**
```bash
[root@cjr html]# docker ps
```
- **`docker ps`**:再次列出正在运行的容器,确认Nginx容器仍在运行。
- **输出**:
```
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f3e661d0040 nginx:1.26 "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:32768->80/tcp, :::32768->80/tcp nginx
```
- **作用**:确认容器运行状态。
---
### 总结
1. 你创建了一个本地目录 `/root/mynginx/html`,并在其中放置了一个 `index.html` 文件。
2. 使用Docker启动了一个Nginx容器,并将本地目录挂载到容器的Nginx网页目录。
3. 进入容器验证了文件挂载成功。
4. 通过 `docker ps` 确认容器正常运行,并查看端口映射情况。
你可以通过访问 `http://<主机IP>:32768` 来查看Nginx服务的 `index.html` 页面内容(`hello world`)。
使用volume卷的方式来存储docker的数据
[root@cjr ~]# docker volume create test
test
[root@cjr ~]# docker images | grep nginx
nginx 1.26 e7580268c63c 8 months ago 188MB
[root@cjr ~]# docker run -d --name nginx -p 81:80 --volume test:/usr/share/nginx/html nginx:1.26
b33996a72d56978e81df3eae897e0ede317751feb6cb0c9500d36aaf7d785e18
You have new mail in /var/spool/mail/root
[root@cjr ~]# docker inspect test
[
{
"CreatedAt": "2025-03-10T00:15:13+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/test/_data",
"Name": "test",
"Options": null,
"Scope": "local"
}
]
[root@cjr ~]# cd /var/lib/docker/volumes/test/_data/
[root@cjr _data]# ls
50x.html index.html
[root@cjr _data]# echo '222' > index2.html
[root@cjr _data]# docker exec -it nginx bash
root@b33996a72d56:/# cd /usr/share/nginx/html/
root@b33996a72d56:/usr/share/nginx/html# ls
50x.html index.html
root@b33996a72d56:/usr/share/nginx/html# touch 2
root@b33996a72d56:/usr/share/nginx/html# exit
exit
You have new mail in /var/spool/mail/root
[root@cjr _data]# cd /var/lib/docker/volumes/test/_data/
[root@cjr _data]# ls
2 50x.html index.html
[root@cjr _data]# docker exec -it nginx bash
root@b33996a72d56:/# cd /usr/share/nginx/html/
root@b33996a72d56:/usr/share/nginx/html# ls
2 50x.html index.html index2.html
以下是对你执行的命令及其作用的详细解释:
---
### 1. **创建Docker Volume**
```bash
[root@cjr ~]# docker volume create test
test
```
- **`docker volume create test`**:创建一个名为 `test` 的Docker Volume。
- **作用**:创建一个由Docker管理的存储卷,用于持久化数据。
---
### 2. **查看Nginx镜像**
```bash
[root@cjr ~]# docker images | grep nginx
nginx 1.26 e7580268c63c 8 months ago 188MB
```
- **`docker images`**:列出本地所有的Docker镜像。
- **`grep nginx`**:过滤出包含 `nginx` 的行。
- **输出**:显示本地已有的Nginx镜像及其版本(`1.26`)和大小(`188MB`)。
- **作用**:确认本地是否存在Nginx镜像。
---
### 3. **运行Nginx容器并挂载Volume**
```bash
[root@cjr ~]# docker run -d --name nginx -p 81:80 --volume test:/usr/share/nginx/html nginx:1.26
b33996a72d56978e81df3eae897e0ede317751feb6cb0c9500d36aaf7d785e18
```
- **`docker run`**:启动一个新的容器。
- **`-d`**:以后台(守护进程)模式运行容器。
- **`--name nginx`**:为容器指定名称为 `nginx`。
- **`-p 81:80`**:将容器的80端口映射到宿主机的81端口。
- **`--volume test:/usr/share/nginx/html`**:将名为 `test` 的Volume挂载到容器的 `/usr/share/nginx/html` 目录。
- **`nginx:1.26`**:使用 `nginx:1.26` 镜像启动容器。
- **作用**:启动一个Nginx容器,并将Volume挂载到Nginx的默认网页目录。
---
### 4. **查看Volume的详细信息**
```bash
[root@cjr ~]# docker inspect test
[
{
"CreatedAt": "2025-03-10T00:15:13+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/test/_data",
"Name": "test",
"Options": null,
"Scope": "local"
}
]
```
- **`docker inspect test`**:查看名为 `test` 的Volume的详细信息。
- **输出**:
- **`Mountpoint`**:Volume在宿主机上的实际存储路径为 `/var/lib/docker/volumes/test/_data`。
- **作用**:确认Volume的存储位置和配置信息。
---
### 5. **进入Volume的存储目录并查看文件**
```bash
[root@cjr ~]# cd /var/lib/docker/volumes/test/_data/
[root@cjr _data]# ls
50x.html index.html
```
- **`cd /var/lib/docker/volumes/test/_data/`**:进入Volume在宿主机上的存储目录。
- **`ls`**:列出目录内容,显示 `50x.html` 和 `index.html` 文件。
- **作用**:查看Volume中存储的文件。
---
### 6. **在Volume中创建新文件**
```bash
[root@cjr _data]# echo '222' > index2.html
```
- **`echo '222' > index2.html`**:在Volume目录中创建一个名为 `index2.html` 的文件,并写入内容 `222`。
- **作用**:在Volume中添加一个新文件。
---
### 7. **进入容器内部并查看挂载的目录**
```bash
[root@cjr _data]# docker exec -it nginx bash
root@b33996a72d56:/# cd /usr/share/nginx/html/
root@b33996a72d56:/usr/share/nginx/html# ls
50x.html index.html
```
- **`docker exec -it nginx bash`**:进入名为 `nginx` 的容器的Bash shell。
- **`cd /usr/share/nginx/html/`**:进入容器内挂载的Volume目录。
- **`ls`**:列出目录内容,显示 `50x.html` 和 `index.html` 文件。
- **作用**:确认Volume已成功挂载到容器内。
---
### 8. **在容器内创建新文件**
```bash
root@b33996a72d56:/usr/share/nginx/html# touch 2
root@b33996a72d56:/usr/share/nginx/html# exit
```
- **`touch 2`**:在容器内的挂载目录中创建一个名为 `2` 的空文件。
- **`exit`**:退出容器的Bash shell,返回宿主机终端。
- **作用**:在容器内操作挂载的Volume。
---
### 9. **在宿主机查看Volume目录的变化**
```bash
[root@cjr _data]# cd /var/lib/docker/volumes/test/_data/
[root@cjr _data]# ls
2 50x.html index.html
```
- **`ls`**:列出Volume目录内容,显示新增的文件 `2`。
- **作用**:确认容器内创建的文件已同步到宿主机的Volume目录。
---
### 10. **再次进入容器并查看挂载的目录**
```bash
[root@cjr _data]# docker exec -it nginx bash
root@b33996a72d56:/# cd /usr/share/nginx/html/
root@b33996a72d56:/usr/share/nginx/html# ls
2 50x.html index.html index2.html
```
- **`ls`**:列出容器内挂载目录的内容,显示新增的文件 `index2.html` 和 `2`。
- **作用**:确认宿主机对Volume的修改已同步到容器内。
---
### 总结
1. 你创建了一个名为 `test` 的Docker Volume。
2. 启动了一个Nginx容器,并将 `test` Volume挂载到容器的 `/usr/share/nginx/html` 目录。
3. 通过 `docker inspect` 查看了Volume的详细信息,确认了其在宿主机上的存储路径。
4. 在宿主机和容器内分别对挂载的Volume进行了文件操作,验证了Volume的数据同步功能。
通过这些操作,你可以确认:
- Volume的数据在宿主机和容器之间是共享的。
- 对Volume的修改(无论是在宿主机还是容器内)都会实时同步。