mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-23 10:15:24 +00:00
Remove blank lines after code block markers
This commit is contained in:
@@ -44,7 +44,6 @@ RUN apt-get update && apt-get install -y \
|
||||
mercurial \
|
||||
subversion
|
||||
```
|
||||
|
||||
#### 构建缓存
|
||||
|
||||
在镜像的构建过程中,Docker 会遍历 `Dockerfile` 文件中的指令,然后按顺序执行。在执行每条指令之前,Docker 都会在缓存中查找是否已经存在可重用的镜像,如果有就使用现存的镜像,不再重复创建。如果你不想在构建过程中使用缓存,你可以在 `docker build` 命令中使用 `--no-cache=true` 选项。
|
||||
@@ -73,7 +72,6 @@ RUN apt-get update && apt-get install -y \
|
||||
> 注意:如果你的字符串中包含空格,必须将字符串放入引号中或者对空格使用转义。如果字符串内容本身就包含引号,必须对引号使用转义。
|
||||
|
||||
```docker
|
||||
|
||||
## Set one or more individual labels
|
||||
|
||||
LABEL com.example.version="0.0.1-beta"
|
||||
@@ -84,11 +82,9 @@ LABEL com.example.release-date="2015-02-12"
|
||||
|
||||
LABEL com.example.version.is-production=""
|
||||
```
|
||||
|
||||
一个镜像可以包含多个标签,但建议将多个标签放入到一个 `LABEL` 指令中。
|
||||
|
||||
```docker
|
||||
|
||||
## Set multiple labels at once, using line-continuation characters to break long lines
|
||||
|
||||
LABEL vendor=ACME\ Incorporated \
|
||||
@@ -97,7 +93,6 @@ LABEL vendor=ACME\ Incorporated \
|
||||
com.example.version="0.0.1-beta" \
|
||||
com.example.release-date="2015-02-12"
|
||||
```
|
||||
|
||||
关于标签可以接受的键值对,参考 [Understanding object labels](https://docs.docker.com/config/labels-custom-metadata/)。关于查询标签信息,参考 [Managing labels on objects](https://docs.docker.com/config/labels-custom-metadata/)。
|
||||
|
||||
#### RUN
|
||||
@@ -118,7 +113,6 @@ RUN apt-get update && apt-get install -y \
|
||||
package-baz \
|
||||
package-foo
|
||||
```
|
||||
|
||||
将 `apt-get update` 放在一条单独的 `RUN` 声明中会导致缓存问题以及后续的 `apt-get install` 失败。比如,假设你有一个 `Dockerfile` 文件:
|
||||
|
||||
```docker
|
||||
@@ -128,7 +122,6 @@ RUN apt-get update
|
||||
|
||||
RUN apt-get install -y curl
|
||||
```
|
||||
|
||||
构建镜像后,所有的层都在 Docker 的缓存中。假设你后来又修改了其中的 `apt-get install` 添加了一个包:
|
||||
|
||||
```docker
|
||||
@@ -138,7 +131,6 @@ RUN apt-get update
|
||||
|
||||
RUN apt-get install -y curl nginx
|
||||
```
|
||||
|
||||
Docker 发现修改后的 `RUN apt-get update` 指令和之前的完全一样。所以,`apt-get update` 不会执行,而是使用之前的缓存镜像。因为 `apt-get update` 没有运行,后面的 `apt-get install` 可能安装的是过时的 `curl` 和 `nginx` 版本。
|
||||
|
||||
使用 `RUN apt-get update && apt-get install -y` 可以确保你的 Dockerfiles 每次安装的都是包的最新的版本,而且这个过程不需要进一步的编码或额外干预。这项技术叫作 `cache busting`。你也可以显示指定一个包的版本号来达到 `cache-busting`,这就是所谓的固定版本,例如:
|
||||
@@ -149,7 +141,6 @@ RUN apt-get update && apt-get install -y \
|
||||
package-baz \
|
||||
package-foo=1.3.*
|
||||
```
|
||||
|
||||
固定版本会迫使构建过程检索特定的版本,而不管缓存中有什么。这项技术也可以减少因所需包中未预料到的变化而导致的失败。
|
||||
|
||||
下面是一个 `RUN` 指令的示例模板,展示了所有关于 `apt-get` 的建议。
|
||||
@@ -167,7 +158,6 @@ RUN apt-get update && apt-get install -y \
|
||||
redis-server \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
```
|
||||
|
||||
其中 `redis-server` 是示例包。确保安装的是最新版本。
|
||||
|
||||
另外,清理掉 apt 缓存 `var/lib/apt/lists` 可以减小镜像大小。因为 `RUN` 指令的开头为 `apt-get update`,包缓存总是会在 `apt-get install` 之前刷新。
|
||||
@@ -203,7 +193,6 @@ RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/
|
||||
|
||||
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
|
||||
```
|
||||
|
||||
类似于程序中的常量,这种方法可以让你只需改变 `ENV` 指令来自动的改变容器中的软件版本。
|
||||
|
||||
#### ADD 和 COPY
|
||||
@@ -219,7 +208,6 @@ RUN pip install --requirement /tmp/requirements.txt
|
||||
|
||||
COPY . /tmp/
|
||||
```
|
||||
|
||||
如果将 `COPY . /tmp/` 放置在 `RUN` 指令之前,只要 `.` 目录中任何一个文件变化,都会导致后续指令的缓存失效。
|
||||
|
||||
为了让镜像尽量小,最好不要使用 `ADD` 指令从远程 URL 获取包,而是使用 `curl` 和 `wget`。这样你可以在文件提取完之后删掉不再需要的文件来避免在镜像中额外添加一层。比如尽量避免下面的用法:
|
||||
@@ -231,7 +219,6 @@ RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
|
||||
|
||||
RUN make -C /usr/src/things all
|
||||
```
|
||||
|
||||
而是应该使用下面这种方法:
|
||||
|
||||
```docker
|
||||
@@ -240,7 +227,6 @@ RUN mkdir -p /usr/src/things \
|
||||
| tar -xJC /usr/src/things \
|
||||
&& make -C /usr/src/things all
|
||||
```
|
||||
|
||||
上面使用的管道操作,所以没有中间文件需要删除。
|
||||
|
||||
对于其他不需要 `ADD` 的自动提取功能的文件或目录,你应该使用 `COPY`。
|
||||
@@ -256,19 +242,16 @@ ENTRYPOINT ["s3cmd"]
|
||||
|
||||
CMD ["--help"]
|
||||
```
|
||||
|
||||
现在直接运行该镜像创建的容器会显示命令帮助:
|
||||
|
||||
```bash
|
||||
$ docker run s3cmd
|
||||
```
|
||||
|
||||
或者提供正确的参数来执行某个命令:
|
||||
|
||||
```bash
|
||||
$ docker run s3cmd ls s3://mybucket
|
||||
```
|
||||
|
||||
这样镜像名可以当成命令行的参考。
|
||||
|
||||
`ENTRYPOINT` 指令也可以结合一个辅助脚本使用,和前面命令行风格类似,即使启动工具需要不止一个步骤。
|
||||
@@ -291,7 +274,6 @@ fi
|
||||
|
||||
exec "$@"
|
||||
```
|
||||
|
||||
> 注意:该脚本使用了 Bash 的内置命令 exec,所以最后运行的进程就是容器的 PID 为 1 的进程。这样,进程就可以接收到任何发送给容器的 Unix 信号了。
|
||||
|
||||
该辅助脚本被拷贝到容器,并在容器启动时通过 `ENTRYPOINT` 执行:
|
||||
@@ -301,7 +283,6 @@ COPY ./docker-entrypoint.sh /
|
||||
|
||||
ENTRYPOINT ["/docker-entrypoint.sh"]
|
||||
```
|
||||
|
||||
该脚本可以让用户用几种不同的方式和 `Postgres` 交互。
|
||||
|
||||
你可以很简单地启动 `Postgres`:
|
||||
@@ -309,19 +290,16 @@ ENTRYPOINT ["/docker-entrypoint.sh"]
|
||||
```bash
|
||||
$ docker run postgres
|
||||
```
|
||||
|
||||
也可以执行 `Postgres` 并传递参数:
|
||||
|
||||
```bash
|
||||
$ docker run postgres postgres --help
|
||||
```
|
||||
|
||||
最后,你还可以启动另外一个完全不同的工具,比如 `Bash`:
|
||||
|
||||
```bash
|
||||
$ docker run --rm -it postgres bash
|
||||
```
|
||||
|
||||
#### VOLUME
|
||||
|
||||
`VOLUME` 指令用于暴露任何数据库存储文件,配置文件,或容器创建的文件和目录。强烈建议使用 `VOLUME` 来管理镜像中的可变部分和用户可以改变的部分。
|
||||
|
||||
@@ -9,13 +9,11 @@
|
||||
"debug": true
|
||||
}
|
||||
```
|
||||
|
||||
重启守护进程。
|
||||
|
||||
```bash
|
||||
$ sudo kill -SIGHUP $(pidof dockerd)
|
||||
```
|
||||
|
||||
此时 dockerd 会在日志中输入更多信息供分析。
|
||||
|
||||
### 检查内核日志
|
||||
@@ -24,7 +22,6 @@ $ sudo kill -SIGHUP $(pidof dockerd)
|
||||
$ sudo dmesg |grep dockerd
|
||||
$ sudo dmesg |grep runc
|
||||
```
|
||||
|
||||
### Docker 不响应时处理
|
||||
|
||||
可以杀死 dockerd 进程查看其堆栈调用情况。
|
||||
@@ -32,7 +29,6 @@ $ sudo dmesg |grep runc
|
||||
```bash
|
||||
$ sudo kill -SIGUSR1 $(pidof dockerd)
|
||||
```
|
||||
|
||||
### 重置 Docker 本地数据
|
||||
|
||||
*注意,本操作会移除所有的 Docker 本地数据,包括镜像和容器等。*
|
||||
@@ -42,13 +38,11 @@ $ sudo kill -SIGUSR1 $(pidof dockerd)
|
||||
```bash
|
||||
$ docker system prune
|
||||
```
|
||||
|
||||
如果你只是想 “恢复出厂设置”,在 Docker Desktop 里也提供了相应入口。
|
||||
|
||||
```bash
|
||||
$ sudo rm -rf /var/lib/docker
|
||||
```
|
||||
|
||||
### 常见故障排查
|
||||
|
||||
#### 容器启动失败
|
||||
|
||||
@@ -52,7 +52,6 @@
|
||||
```bash
|
||||
docker inspect --format '{{ .State.Pid }}' <CONTAINER ID or NAME>
|
||||
```
|
||||
|
||||
### 如何获取某个容器的 IP 地址?
|
||||
|
||||
答:可以使用
|
||||
@@ -60,7 +59,6 @@ docker inspect --format '{{ .State.Pid }}' <CONTAINER ID or NAME>
|
||||
```bash
|
||||
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <CONTAINER ID or NAME>
|
||||
```
|
||||
|
||||
### 如何给容器指定一个固定 IP 地址,而不是每次重启容器 IP 地址都会变?
|
||||
|
||||
答:使用以下命令启动容器可以使容器 IP 固定不变
|
||||
@@ -70,7 +68,6 @@ $ docker network create -d bridge --subnet 172.25.0.0/16 my-net
|
||||
|
||||
$ docker run --network=my-net --ip=172.25.3.3 -itd --name=my-container busybox
|
||||
```
|
||||
|
||||
### 如何临时退出一个正在交互的容器的终端,而不终止它?
|
||||
|
||||
答:按 `Ctrl-p Ctrl-q`。如果按 `Ctrl-c` 往往会让容器内应用进程终止,进而会终止容器。
|
||||
@@ -126,7 +123,6 @@ tmpfs 48G 228K 48G 1% /dev/shm
|
||||
lrwxrwxrwx. 1 root root 15 11月 17 13:43 docker -> /storage/docker
|
||||
[root@s26 lib]# service docker start
|
||||
```
|
||||
|
||||
### 使用内存和 swap 限制启动容器时候报警告:“WARNING:Your kernel does not support cgroup swap limit。WARNING:Your kernel does not support swap limit capabilities。Limitation discarded。”?
|
||||
|
||||
答:这是因为系统默认没有开启对内存和 swap 使用的统计功能,引入该功能会带来性能的下降。要开启该功能,可以采取如下操作:
|
||||
@@ -186,26 +182,22 @@ lrwxrwxrwx. 1 root root 15 11月 17 13:43 docker -> /storage/docker
|
||||
$ docker inspect --format='{{. State.Pid}} ' $container_id
|
||||
1234
|
||||
```
|
||||
|
||||
接下来,在 `/proc` 目录下,把对应的网络命名空间文件链接到 `/var/run/netns` 目录。
|
||||
|
||||
```bash
|
||||
$ sudo ln -s /proc/1234/ns/net /var/run/netns/
|
||||
```
|
||||
|
||||
然后,在宿主主机上就可以看到容器的网络命名空间信息。例如
|
||||
|
||||
```bash
|
||||
$ sudo ip netns show
|
||||
1234
|
||||
```
|
||||
|
||||
此时,用户可以通过正常的系统命令来查看或操作容器的命名空间了。例如修改容器的 IP 地址信息为 `172.17.0.100/16`。
|
||||
|
||||
```bash
|
||||
$ sudo ip netns exec 1234 ifconfig eth0 172.17.0.100/16
|
||||
```
|
||||
|
||||
### 如何获取容器绑定到本地那个 veth 接口上?
|
||||
|
||||
答:Docker 容器启动后,会通过 veth 接口对连接到本地网桥,veth 接口命名跟容器命名毫无关系,十分难以找到对应关系。
|
||||
|
||||
@@ -35,7 +35,6 @@ Docker 安装配置
|
||||
├── 镜像加速器配置
|
||||
└── 权限和用户配置
|
||||
```
|
||||
|
||||
**学习资源:**
|
||||
- [官方教程](https://docs.docker.com/get-started/)
|
||||
- 本书第 1-3 章:入门篇基础概念
|
||||
@@ -48,14 +47,12 @@ Docker 安装配置
|
||||
|
||||
**验证学习成果:**
|
||||
```bash
|
||||
|
||||
# 完成以下任务说明基础入门完成
|
||||
1. 运行官方 nginx 镜像,访问 http://localhost
|
||||
2. 使用 docker exec 进入容器修改首页
|
||||
3. 提交修改为新镜像
|
||||
4. 推送镜像到 Docker Hub(需创建账户)
|
||||
```
|
||||
|
||||
#### 第二阶段:核心开发(2-6 周)
|
||||
|
||||
**学习目标:**
|
||||
@@ -111,7 +108,6 @@ Docker Compose
|
||||
├── exec / run
|
||||
└── build / push
|
||||
```
|
||||
|
||||
**学习资源:**
|
||||
- 本书第 4-11 章:进阶篇
|
||||
- [Docker 官方最佳实践](https://docs.docker.com/develop/dev-best-practices/)
|
||||
@@ -139,7 +135,6 @@ Docker Compose
|
||||
- 数据持久化
|
||||
- 备份恢复策略
|
||||
```
|
||||
|
||||
#### 第三阶段:生产优化(6-12 周)
|
||||
|
||||
**学习目标:**
|
||||
@@ -220,7 +215,6 @@ CI/CD 集成
|
||||
├── Buildah(镜像构建)
|
||||
└── Kollabot
|
||||
```
|
||||
|
||||
**学习资源:**
|
||||
- 本书第 12-21 章:深入篇和实战篇
|
||||
- [Kubernetes 官方文档](https://kubernetes.io/docs/)
|
||||
@@ -254,7 +248,6 @@ CI/CD 集成
|
||||
- 部署有状态应用
|
||||
- 配置持久化存储
|
||||
```
|
||||
|
||||
#### 第四阶段:专家深造(12+ 周)
|
||||
|
||||
**学习目标:**
|
||||
@@ -321,7 +314,6 @@ DevOps 工程化
|
||||
├── 代码审查
|
||||
└── 文档和最佳实践传播
|
||||
```
|
||||
|
||||
**贡献机会:**
|
||||
- [Kubernetes](https://github.com/kubernetes/kubernetes)
|
||||
- [Cilium](https://github.com/cilium/cilium)
|
||||
@@ -384,7 +376,6 @@ Kubernetes 进阶 (Week 24-36)
|
||||
├── 成本优化
|
||||
└── 开源贡献
|
||||
```
|
||||
|
||||
### 推荐学习资源
|
||||
|
||||
#### 官方文档
|
||||
@@ -466,10 +457,8 @@ Kubernetes 进阶 (Week 24-36)
|
||||
- Logging drivers
|
||||
- 事件处理
|
||||
```
|
||||
|
||||
准备建议:
|
||||
```bash
|
||||
|
||||
# 1. 学习本书第 1-11 章(基础到中级)
|
||||
# 2. 完成 20+ 个实战项目
|
||||
# 3. 参考官方学习指南
|
||||
@@ -486,7 +475,6 @@ docker volume / network / service
|
||||
docker compose up / down / logs / ps
|
||||
docker stats / events / inspect
|
||||
```
|
||||
|
||||
#### Kubernetes 认证
|
||||
|
||||
**认证路径:**
|
||||
@@ -530,7 +518,6 @@ A(要点):
|
||||
|
||||
总结:容器更轻量、更快、密度更高
|
||||
```
|
||||
|
||||
**Q2: 什么是 Docker 镜像?它如何存储的?**
|
||||
|
||||
A(要点):
|
||||
@@ -550,7 +537,6 @@ A(要点):
|
||||
- 层级缓存加快构建
|
||||
- 支持高效分发
|
||||
```
|
||||
|
||||
**Q3: 容器如何实现隔离?**
|
||||
|
||||
A(要点):
|
||||
@@ -575,7 +561,6 @@ A(要点):
|
||||
|
||||
4. SELinux / AppArmor(强制访问控制)
|
||||
```
|
||||
|
||||
#### Dockerfile 面试题
|
||||
|
||||
**Q4: 如何优化 Docker 镜像大小?**
|
||||
@@ -608,7 +593,6 @@ A(要点):
|
||||
7. 压缩资源:
|
||||
gzip 静态文件,压缩图片
|
||||
```
|
||||
|
||||
**Q5: CMD 和 ENTRYPOINT 有什么区别?**
|
||||
|
||||
A(要点):
|
||||
@@ -630,7 +614,6 @@ CMD ["--port", "8000"]
|
||||
# 运行 docker run image --debug 会执行:
|
||||
# python app.py --debug
|
||||
```
|
||||
|
||||
#### 网络和存储面试题
|
||||
|
||||
**Q6: Docker 网络驱动的区别?**
|
||||
@@ -660,7 +643,6 @@ macvlan:
|
||||
None:
|
||||
- 无网络,完全隔离
|
||||
```
|
||||
|
||||
**Q7: Volume 和 Bind Mount 有什么区别?**
|
||||
|
||||
A(要点):
|
||||
@@ -682,7 +664,6 @@ tmpfs:
|
||||
- 用于临时文件、敏感数据
|
||||
- 性能最好,重启丢失
|
||||
```
|
||||
|
||||
#### 安全和生产面试题
|
||||
|
||||
**Q8: 如何提高 Docker 安全性?**
|
||||
@@ -712,7 +693,6 @@ A(要点):
|
||||
- 配置网络策略
|
||||
- 限制出入站流量
|
||||
```
|
||||
|
||||
**Q9: 容器被 OOM 杀死,如何诊断和解决?**
|
||||
|
||||
A(要点):
|
||||
@@ -744,7 +724,6 @@ A(要点):
|
||||
4. 使用内存交换(最后手段):
|
||||
docker run -m 512m --memory-swap 1g
|
||||
```
|
||||
|
||||
**Q10: 如何在 CI/CD 中集成 Docker?**
|
||||
|
||||
A(要点):
|
||||
@@ -779,11 +758,9 @@ A(要点):
|
||||
5. 触发 ArgoCD / Flux 自动部署
|
||||
6. 监控部署状态
|
||||
```
|
||||
|
||||
### 学习进度跟踪模板
|
||||
|
||||
```markdown
|
||||
|
||||
# Docker 学习进度跟踪
|
||||
|
||||
## 第一阶段:基础入门(目标:2 周)
|
||||
@@ -828,13 +805,11 @@ A(要点):
|
||||
- [ ] 监控和日志系统
|
||||
- [ ] CI/CD 流程实现
|
||||
```
|
||||
|
||||
### 快速参考速查表
|
||||
|
||||
**常用命令速查:**
|
||||
|
||||
```bash
|
||||
|
||||
# 镜像管理
|
||||
docker build -t image:tag . # 构建镜像
|
||||
docker images # 列出镜像
|
||||
|
||||
@@ -20,13 +20,11 @@
|
||||
```bash
|
||||
$ docker run --name rocky -it rockylinux:9 bash
|
||||
```
|
||||
|
||||
使用旧版 CentOS 7 (**仅用于维护旧项目,不推荐**):
|
||||
|
||||
```bash
|
||||
$ docker run --name centos -it centos:7 bash
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
|
||||
请到 [CentOS 官方镜像文档目录](https://github.com/docker-library/docs/tree/master/centos) 查看。
|
||||
|
||||
@@ -13,7 +13,6 @@ MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结
|
||||
```bash
|
||||
$ docker run -d -p 9000:9000 -p 9090:9090 minio/minio server /data --console-address ':9090'
|
||||
```
|
||||
|
||||
### 离线部署
|
||||
|
||||
许多生产环境是一般是没有公网资源的,这就需要从有公网资源的服务器上把镜像导出,然后导入到需要运行镜像的内网服务器。
|
||||
@@ -25,7 +24,6 @@ $ docker run -d -p 9000:9000 -p 9090:9090 minio/minio server /data --console-add
|
||||
```bash
|
||||
$ docker save -o minio.tar minio/minio:latest
|
||||
```
|
||||
|
||||
> 使用 docker save 的时候,也可以使用 image id 来导出,但是那样导出的时候,就会丢失原来的镜像名称,推荐,还是使用镜像名字+tag 来导出镜像
|
||||
|
||||
#### 导入镜像
|
||||
@@ -35,7 +33,6 @@ $ docker save -o minio.tar minio/minio:latest
|
||||
```bash
|
||||
$ docker load -i minio.tar
|
||||
```
|
||||
|
||||
#### 运行 minio
|
||||
|
||||
- 把 `/mnt/data` 改成要替换的数据目录
|
||||
@@ -52,7 +49,6 @@ $ sudo docker run -d -p 9000:9000 -p 9090:9090 --name minio1 \
|
||||
--restart=always \
|
||||
minio/minio server /data --console-address ':9090'
|
||||
```
|
||||
|
||||
#### 访问 web 管理页面
|
||||
|
||||
打开 `http://<server-ip>:9090` 访问 Web 控制台。
|
||||
|
||||
@@ -13,22 +13,18 @@
|
||||
```bash
|
||||
$ docker run --name mongo -d mongo
|
||||
```
|
||||
|
||||
使用其他应用连接到容器,首先创建网络
|
||||
```bash
|
||||
$ docker network create my-mongo-net
|
||||
```
|
||||
|
||||
然后启动 MongoDB 容器
|
||||
```bash
|
||||
$ docker run --name some-mongo -d --network my-mongo-net mongo
|
||||
```
|
||||
|
||||
最后启动应用容器
|
||||
```bash
|
||||
$ docker run --name some-app -d --network my-mongo-net application-that-uses-mongo
|
||||
```
|
||||
|
||||
或者通过 `mongo`
|
||||
|
||||
```bash
|
||||
@@ -37,7 +33,6 @@ $ docker run -it --rm \
|
||||
mongo \
|
||||
sh -c 'exec mongo "some-mongo:27017/test"'
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
|
||||
请到 [Mongo 官方镜像文档目录](https://github.com/docker-library/docs/tree/master/mongo) 查看。
|
||||
|
||||
@@ -13,24 +13,20 @@
|
||||
```bash
|
||||
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql
|
||||
```
|
||||
|
||||
之后就可以使用其它应用来连接到该容器。
|
||||
|
||||
首先创建网络
|
||||
```bash
|
||||
$ docker network create my-mysql-net
|
||||
```
|
||||
|
||||
然后启动 MySQL 容器
|
||||
```bash
|
||||
$ docker run --name some-mysql -d --network my-mysql-net -e MYSQL_ROOT_PASSWORD=mysecretpassword mysql
|
||||
```
|
||||
|
||||
最后启动应用容器
|
||||
```bash
|
||||
$ docker run --name some-app -d --network my-mysql-net application-that-uses-mysql
|
||||
```
|
||||
|
||||
或者通过 `mysql` 命令行连接。
|
||||
|
||||
```bash
|
||||
@@ -40,7 +36,6 @@ $ docker run -it --rm \
|
||||
sh -c 'exec mysql -hsome-mysql -P3306 -uroot -pmysecretpassword'
|
||||
```
|
||||
|
||||
|
||||
### Dockerfile
|
||||
|
||||
请到 [MySQL 官方镜像文档目录](https://github.com/docker-library/docs/tree/master/mysql) 查看。
|
||||
|
||||
@@ -13,27 +13,23 @@
|
||||
```bash
|
||||
$ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
|
||||
```
|
||||
|
||||
用户也可以不使用这种映射方式,通过利用 Dockerfile 来直接将静态页面内容放到镜像中,内容为
|
||||
|
||||
```docker
|
||||
FROM nginx
|
||||
COPY static-html-directory /usr/share/nginx/html
|
||||
```
|
||||
|
||||
之后生成新的镜像,并启动一个容器。
|
||||
|
||||
```bash
|
||||
$ docker build -t some-content-nginx .
|
||||
$ docker run --name some-nginx -d some-content-nginx
|
||||
```
|
||||
|
||||
开放端口,并映射到本地的 `8080` 端口。
|
||||
|
||||
```bash
|
||||
$ docker run --name some-nginx -d -p 8080:80 some-content-nginx
|
||||
```
|
||||
|
||||
Nginx 的默认配置文件路径为 `/etc/nginx/nginx.conf`,可以通过映射它来使用本地的配置文件,例如
|
||||
|
||||
```bash
|
||||
@@ -43,7 +39,6 @@ $ docker run -d \
|
||||
-v /path/nginx.conf:/etc/nginx/nginx.conf:ro \
|
||||
nginx
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
|
||||
请到 [Nginx 官方镜像文档目录](https://github.com/docker-library/docs/tree/master/nginx) 查看。
|
||||
|
||||
@@ -17,14 +17,12 @@ FROM node:20
|
||||
|
||||
EXPOSE 8888
|
||||
```
|
||||
|
||||
然后创建镜像,并启动容器。
|
||||
|
||||
```bash
|
||||
$ docker build -t my-nodejs-app
|
||||
$ docker run -it --rm --name my-running-app my-nodejs-app
|
||||
```
|
||||
|
||||
也可以直接运行一个简单容器。
|
||||
|
||||
```bash
|
||||
@@ -37,7 +35,6 @@ $ docker run -it --rm \
|
||||
node:20-alpine \
|
||||
node your-daemon-or-script.js
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
|
||||
请到 [Node 官方镜像文档目录](https://github.com/docker-library/docs/tree/master/node) 查看。
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
```bash
|
||||
$ docker run -it --rm -v "$PWD":/app -w /app php:alpine php your-script.php
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
|
||||
请到 [PHP 官方镜像文档目录](https://github.com/docker-library/docs/tree/master/php) 查看。
|
||||
|
||||
@@ -13,30 +13,25 @@
|
||||
```bash
|
||||
$ docker run --name some-redis -d -p 6379:6379 redis
|
||||
```
|
||||
|
||||
另外还可以启用[持久存储](https://redis.io/topics/persistence)。
|
||||
|
||||
```bash
|
||||
$ docker run --name some-redis -d -p 6379:6379 redis redis-server --appendonly yes
|
||||
```
|
||||
|
||||
默认数据存储位置在 `VOLUME/data`。可以使用 `--volumes-from some-volume-container` 或 `-v /docker/host/dir:/data` 将数据存放到本地。
|
||||
|
||||
使用其他应用连接到容器,首先创建网络
|
||||
```bash
|
||||
$ docker network create my-redis-net
|
||||
```
|
||||
|
||||
然后启动 redis 容器
|
||||
```bash
|
||||
$ docker run --name some-redis -d --network my-redis-net redis
|
||||
```
|
||||
|
||||
最后启动应用容器
|
||||
```bash
|
||||
$ docker run --name some-app -d --network my-redis-net application-that-uses-redis
|
||||
```
|
||||
|
||||
或者通过 `redis-cli`
|
||||
|
||||
```bash
|
||||
@@ -45,7 +40,6 @@ $ docker run -it --rm \
|
||||
redis \
|
||||
sh -c 'exec redis-cli -h some-redis'
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
|
||||
请到 [Redis 官方镜像文档目录](https://github.com/docker-library/docs/tree/master/redis) 查看。
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
$ docker run --name some-ubuntu -it ubuntu:20.04
|
||||
root@523c70904d54:/#
|
||||
```
|
||||
|
||||
### Dockerfile
|
||||
|
||||
请到 [Ubuntu 官方镜像文档目录](https://github.com/docker-library/docs/tree/master/ubuntu) 查看。
|
||||
|
||||
@@ -14,17 +14,14 @@
|
||||
```bash
|
||||
$ docker network create my-wordpress-net
|
||||
```
|
||||
|
||||
启动 MySQL 容器
|
||||
```bash
|
||||
$ docker run --name some-mysql -d --network my-wordpress-net -e MYSQL_ROOT_PASSWORD=mysecretpassword mysql
|
||||
```
|
||||
|
||||
启动 WordPress 容器
|
||||
```bash
|
||||
$ docker run --name some-wordpress -d --network my-wordpress-net -e WORDPRESS_DB_HOST=some-mysql -e WORDPRESS_DB_PASSWORD=mysecretpassword wordpress
|
||||
```
|
||||
|
||||
启动 WordPress 容器时可以指定的一些环境变量包括:
|
||||
|
||||
* `WORDPRESS_DB_HOST`:MySQL 服务的主机名
|
||||
|
||||
Reference in New Issue
Block a user