mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-26 03:35:31 +00:00
Remove blank lines after code block markers
This commit is contained in:
@@ -9,7 +9,6 @@
|
||||
```html
|
||||
<h1>Hello, Docker!</h1>
|
||||
```
|
||||
|
||||
### 1.1.2 编写 Dockerfile
|
||||
|
||||
在同级目录下创建一个名为 `Dockerfile` (无后缀) 的文件:
|
||||
@@ -18,7 +17,6 @@
|
||||
FROM nginx:alpine
|
||||
COPY index.html /usr/share/nginx/html/index.html
|
||||
```
|
||||
|
||||
### 1.1.3 构建镜像
|
||||
|
||||
打开终端,进入该目录,执行构建命令:
|
||||
@@ -26,7 +24,6 @@ COPY index.html /usr/share/nginx/html/index.html
|
||||
```bash
|
||||
$ docker build -t my-hello-world .
|
||||
```
|
||||
|
||||
* `docker build`:构建命令
|
||||
* `-t my-hello-world`:给镜像起个名字 (标签)
|
||||
* `.`:指定上下文路径为当前目录
|
||||
@@ -38,7 +35,6 @@ $ docker build -t my-hello-world .
|
||||
```bash
|
||||
$ docker run -d -p 8080:80 my-hello-world
|
||||
```
|
||||
|
||||
* `docker run`:运行命令
|
||||
* `-d`:后台运行
|
||||
* `-p 8080:80`:将宿主机的 8080 端口映射到容器的 80 端口
|
||||
@@ -52,7 +48,6 @@ $ docker run -d -p 8080:80 my-hello-world
|
||||
停止并删除容器:
|
||||
|
||||
```bash
|
||||
|
||||
## 查看正在运行的容器 ID
|
||||
|
||||
$ docker ps
|
||||
@@ -65,5 +60,4 @@ $ docker stop <CONTAINER_ID>
|
||||
|
||||
$ docker rm <CONTAINER_ID>
|
||||
```
|
||||
|
||||
恭喜!你已经完成了第一次 Docker 实战。接下来请阅读 [Docker 核心概念](../02_basic_concept/README.md)做深入了解。
|
||||
|
||||
@@ -26,7 +26,6 @@ flowchart LR
|
||||
end
|
||||
A -.->|不一致| C
|
||||
```
|
||||
|
||||
有了 Docker:
|
||||
|
||||
```mermaid
|
||||
@@ -41,7 +40,6 @@ flowchart LR
|
||||
end
|
||||
A == 一致 ==> C
|
||||
```
|
||||
|
||||
### 1.2.3 Docker vs 虚拟机
|
||||
|
||||
很多人第一次接触 Docker 时会问:**“这不就是虚拟机吗?”** 答案是:**不是,而且差别很大。**
|
||||
@@ -94,7 +92,6 @@ flowchart LR
|
||||
runC --> OCI["OCI<br/>标准化"]
|
||||
end
|
||||
```
|
||||
|
||||
- **LXC** (2013):Docker 最初基于 Linux Containers
|
||||
- **libcontainer** (2014,v0.7):Docker 自研的容器运行时
|
||||
- **runC** (2015,v1.11):捐献给 OCI 的标准容器运行时
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
│ └── 测试:"这个功能在测试环境跑不起来"
|
||||
└── 开发者:"不可能,在我电脑上明明能跑啊……"
|
||||
```
|
||||
|
||||
笔者统计过,这个问题通常由以下原因导致:
|
||||
|
||||
- Python/Node/Java 版本不一致
|
||||
@@ -34,7 +33,6 @@
|
||||
├── Day 4:问老同事怎么配的,他也忘了
|
||||
└── Day 5:终于能跑起来了!但不知道为什么……
|
||||
```
|
||||
|
||||
#### 场景三:服务器迁移的恐惧
|
||||
|
||||
```bash
|
||||
@@ -43,7 +41,6 @@
|
||||
运维:"当时是一个已经离职的同事配的……"
|
||||
所有人:😱
|
||||
```
|
||||
|
||||
### 1.3.2 Docker 如何解决这些问题
|
||||
|
||||
Docker 的出现为上述问题提供了完美的解决方案。它通过 “一次构建,到处运行” 的核心理念,从根本上改变了软件交付的方式。
|
||||
@@ -57,7 +54,6 @@ flowchart LR
|
||||
test -- "有问题<br/>反馈修改和更新" --> dev
|
||||
test -- "没问题<br/>发布" --> prod["生产环境"]
|
||||
```
|
||||
|
||||
### 1.3.3 Docker 的核心优势
|
||||
|
||||
除了解决上述痛点,Docker 还拥有诸多显著的技术优势,包括环境一致性、秒级启动、高效的资源利用等。
|
||||
@@ -71,7 +67,6 @@ Docker 镜像包含了应用运行所需的 **一切**:代码、运行时、
|
||||
- ✅ 新人入职,一条命令就能启动开发环境
|
||||
|
||||
```bash
|
||||
|
||||
## 新同事入职第一天
|
||||
|
||||
$ git clone https://github.com/company/project.git
|
||||
@@ -81,7 +76,6 @@ $ docker compose up
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
#### 2. 秒级启动
|
||||
|
||||
传统虚拟机启动需要几分钟 (引导操作系统),而 Docker 容器启动通常只需要 **几秒甚至几百毫秒**。
|
||||
@@ -132,7 +126,6 @@ flowchart TD
|
||||
Server2 --- Containers
|
||||
end
|
||||
```
|
||||
|
||||
#### 4. 持续交付和部署
|
||||
|
||||
Docker 完美契合 DevOps 的工作流程:
|
||||
@@ -143,7 +136,6 @@ flowchart LR
|
||||
B --> C["自动测试<br/>(容器内运行测试)"]
|
||||
C --> D["自动部署<br/>(容器滚动更新)"]
|
||||
```
|
||||
|
||||
使用 [Dockerfile](../04_image/4.5_build.md) 定义镜像构建过程,使得:
|
||||
|
||||
- 构建过程 **可重复、可追溯**
|
||||
@@ -190,7 +182,6 @@ flowchart TD
|
||||
Worker --> DB
|
||||
end
|
||||
```
|
||||
|
||||
### 1.3.4 Docker 不适合的场景
|
||||
|
||||
笔者认为,技术选型要客观。Docker 并非银弹,以下场景可能不太适合:
|
||||
|
||||
Reference in New Issue
Block a user