Docker技术高级命令运用整理

一、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的修改(无论是在宿主机还是容器内)都会实时同步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云原生的爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值