Update from Sync Service
This commit is contained in:
@@ -1,246 +0,0 @@
|
||||
---
|
||||
title: Docker 容器化部署指南
|
||||
tags:
|
||||
- Docker
|
||||
- DevOps
|
||||
- 容器化
|
||||
- Linux
|
||||
created: 2026-04-21
|
||||
---
|
||||
|
||||
# Docker 容器化部署指南
|
||||
|
||||
## 核心概念
|
||||
|
||||
| 概念 | 说明 |
|
||||
|------|------|
|
||||
| **镜像(Image)** | 只读模板,包含运行应用所需的文件系统 |
|
||||
| **容器(Container)** | 镜像的运行实例,类似轻量级虚拟机 |
|
||||
| **仓库(Registry)** | 存储和分发镜像的服务(Docker Hub、GHCR) |
|
||||
| **Dockerfile** | 定义镜像构建步骤的脚本 |
|
||||
|
||||
## 常用命令
|
||||
|
||||
### 镜像操作
|
||||
|
||||
```bash
|
||||
# 查看本地镜像
|
||||
docker images
|
||||
|
||||
# 拉取镜像
|
||||
docker pull nginx:latest
|
||||
|
||||
# 构建镜像
|
||||
docker build -t myapp:1.0 .
|
||||
|
||||
# 删除镜像
|
||||
docker rmi myapp:1.0
|
||||
|
||||
# 推送镜像
|
||||
docker push myrepo/myapp:1.0
|
||||
```
|
||||
|
||||
### 容器操作
|
||||
|
||||
```bash
|
||||
# 运行容器
|
||||
docker run -d --name myapp -p 8080:80 nginx
|
||||
|
||||
# 查看运行中的容器
|
||||
docker ps
|
||||
|
||||
# 查看所有容器(包括停止的)
|
||||
docker ps -a
|
||||
|
||||
# 停止/启动容器
|
||||
docker stop myapp
|
||||
docker start myapp
|
||||
|
||||
# 进入容器
|
||||
docker exec -it myapp /bin/bash
|
||||
|
||||
# 查看日志
|
||||
docker logs -f myapp
|
||||
|
||||
# 删除容器
|
||||
docker rm myapp
|
||||
```
|
||||
|
||||
### Docker Compose
|
||||
|
||||
```bash
|
||||
# 启动服务
|
||||
docker compose up -d
|
||||
|
||||
# 查看服务状态
|
||||
docker compose ps
|
||||
|
||||
# 重启服务
|
||||
docker compose restart
|
||||
|
||||
# 查看日志
|
||||
docker compose logs -f
|
||||
|
||||
# 停止服务
|
||||
docker compose down
|
||||
|
||||
# 重新构建并启动
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
## Dockerfile 最佳实践
|
||||
|
||||
```dockerfile
|
||||
# 1. 使用多阶段构建减小镜像体积
|
||||
FROM node:20-alpine AS builder
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm ci --only=production
|
||||
COPY . .
|
||||
RUN npm run build
|
||||
|
||||
# 2. 生产镜像使用非 root 用户
|
||||
FROM node:20-alpine AS production
|
||||
WORKDIR /app
|
||||
COPY --from=builder /app/dist ./dist
|
||||
COPY --from=builder /app/node_modules ./node_modules
|
||||
USER node
|
||||
EXPOSE 3000
|
||||
CMD ["node", "dist/index.js"]
|
||||
|
||||
# 3. 使用 .dockerignore 排除不必要的文件
|
||||
# .git
|
||||
# node_modules
|
||||
# *.log
|
||||
# .env
|
||||
```
|
||||
|
||||
## 常用 Docker Compose 示例
|
||||
|
||||
### 基础 Web 应用
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
web:
|
||||
image: nginx:alpine
|
||||
ports:
|
||||
- "80:80"
|
||||
volumes:
|
||||
- ./html:/usr/share/nginx/html:ro
|
||||
restart: unless-stopped
|
||||
|
||||
app:
|
||||
build: .
|
||||
ports:
|
||||
- "3000:3000"
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
depends_on:
|
||||
- db
|
||||
restart: unless-stopped
|
||||
|
||||
db:
|
||||
image: postgres:15-alpine
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
environment:
|
||||
POSTGRES_DB: myapp
|
||||
POSTGRES_USER: user
|
||||
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
```
|
||||
|
||||
### Clash + metacubexd(代理面板)
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
clash:
|
||||
container_name: clash
|
||||
image: metacubex/mihomo:Alpha
|
||||
restart: unless-stopped
|
||||
network_mode: host
|
||||
pid: host
|
||||
cap_add:
|
||||
- ALL
|
||||
volumes:
|
||||
- ./config:/root/.config/mihomo
|
||||
- /dev/net/tun:/dev/net/tun
|
||||
|
||||
dashboard:
|
||||
container_name: dashboard
|
||||
image: ghcr.io/metacubex/metacubexd:latest
|
||||
restart: unless-stopped
|
||||
network_mode: host
|
||||
```
|
||||
|
||||
## 安装 Docker(Linux)
|
||||
|
||||
```bash
|
||||
# Ubuntu/Debian
|
||||
curl -fsSL https://get.docker.com | sudo sh
|
||||
sudo usermod -aG docker $USER
|
||||
|
||||
# Docker Compose(独立安装)
|
||||
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" \
|
||||
-o /usr/local/bin/docker-compose
|
||||
sudo chmod +x /usr/local/bin/docker-compose
|
||||
```
|
||||
|
||||
## 网络模式选择
|
||||
|
||||
| 模式 | 说明 | 适用场景 |
|
||||
|------|------|----------|
|
||||
| **bridge(默认)** | NAT 网络,端口需映射 | 单容器简单应用 |
|
||||
| **host** | 共享宿主机网络栈 | TUN/透明代理、性能敏感应用 |
|
||||
| **overlay** | 跨主机容器网络 | Docker Swarm 集群 |
|
||||
| **none** | 禁用网络 | 隔离安全环境 |
|
||||
|
||||
## 常用参数
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|------|
|
||||
| `-d` | 后台运行(detached) |
|
||||
| `-p 8080:80` | 端口映射(宿主机:容器) |
|
||||
| `-v ./data:/data` | 卷挂载 |
|
||||
| `-e KEY=val` | 环境变量 |
|
||||
| `--name myapp` | 容器命名 |
|
||||
| `--restart unless-stopped` | 自动重启策略 |
|
||||
| `--network mynet` | 加入指定网络 |
|
||||
| `-it` | 交互式终端 |
|
||||
| `--rm` | 容器停止后自动删除 |
|
||||
|
||||
## 清理命令
|
||||
|
||||
```bash
|
||||
# 删除已停止的容器
|
||||
docker container prune
|
||||
|
||||
# 删除悬空镜像(无 tag)
|
||||
docker image prune
|
||||
|
||||
# 删除所有未使用的镜像
|
||||
docker image prune -a
|
||||
|
||||
# 删除已停止的容器和未使用的镜像
|
||||
docker system prune
|
||||
|
||||
# 完全清理(包括卷)
|
||||
docker system prune -a --volumes
|
||||
```
|
||||
|
||||
## 故障排查
|
||||
|
||||
| 问题 | 解决方案 |
|
||||
|------|---------|
|
||||
| 容器无法启动 | `docker logs <container>` 查看日志 |
|
||||
| 端口冲突 | 检查宿主机端口占用 `netstat -tlnp` |
|
||||
| 权限不足 | 确保用户在 docker 组 `groups $USER` |
|
||||
| 镜像拉取慢 | 配置国内镜像加速 |
|
||||
| TUN 不工作 | 确认 host 模式 + `/dev/net/tun` 挂载 |
|
||||
@@ -1,3 +0,0 @@
|
||||
==单节点安装==
|
||||
==在rancher/rancher容器的内置etcd中,映射与宿主机的====/var/lib/rancher====目录下。==
|
||||
> 来自 <[https://docs.rancher.cn/rancher2x/faqs/important-issue.html#_11-%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E7%9A%84l4%E5%B1%82%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E6%9C%8D%E5%8A%A1%E5%A4%84%E4%BA%8E-%E6%8C%82%E8%B5%B7-%E7%8A%B6%E6%80%81%EF%BC%9F](https://docs.rancher.cn/rancher2x/faqs/important-issue.html#_11-%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E7%9A%84l4%E5%B1%82%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E6%9C%8D%E5%8A%A1%E5%A4%84%E4%BA%8E-%E6%8C%82%E8%B5%B7-%E7%8A%B6%E6%80%81%EF%BC%9F)>
|
||||
@@ -1,7 +0,0 @@
|
||||
==.==
|
||||
==在您想要使用单个节点运行Rancher并且能够将相同节点添加到集群的情况下,您必须调整为====rancher/rancher====容器映射的主机端口。==
|
||||
==如果一个节点被添加到集群,它将部署使用端口80和443的ingress控制器。这与====rancher/rancher====容器默认映射的端口冲突。==
|
||||
==注意不建议在生产中把Rancher/Rancher和Rancher/Rancher-Agent运行在一台主机上,但可用于开发/演示。==
|
||||
==要更改主机端口映射,替换====-p 80:80 -p 443:443====为====-p 8080:80 -p 8443:443====:==
|
||||
docker run -d --restart=unless-stopped \ -p 8080:80 -p 8443:443 \ -v <主机路径>:/var/lib/rancher/ \ rancher/rancher:stable (或者rancher/rancher:latest)
|
||||
> 来自 <[https://docs.rancher.cn/rancher2x/faqs/important-issue.html#_4-%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85](https://docs.rancher.cn/rancher2x/faqs/important-issue.html#_4-%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85)>
|
||||
@@ -1,88 +0,0 @@
|
||||
1.镜像下载
|
||||
下载 `MongoDB` 镜像命令:
|
||||
|
||||
```
|
||||
```
|
||||
docker pull mongo
|
||||
```
|
||||
```
|
||||
执行 `docker images` 查看镜像,下载成功,如下图:
|
||||
|
||||
2.启动 `MongoDB`
|
||||
启动 `MongoDB` 命令:
|
||||
|
||||
```
|
||||
```
|
||||
docker run -p 27017:27017 -v $PWD/db:/data/db -d mongo:latest
|
||||
```
|
||||
|
||||
```
|
||||
==命令说明:==
|
||||
|
||||
```
|
||||
```
|
||||
 -p 27017:27017 :
|
||||
```
|
||||
|
||||
```
|
||||
==将容器的==
|
||||
|
||||
```
|
||||
```
|
||||
27017
|
||||
```
|
||||
|
||||
```
|
||||
==端口映射到主机的==
|
||||
|
||||
```
|
||||
```
|
||||
27017
|
||||
```
|
||||
|
||||
```
|
||||
==端口==
|
||||
|
||||
```
|
||||
```
|
||||
 -v $PWD/db:/data/db :
|
||||
```
|
||||
|
||||
```
|
||||
==将主机中当前目录下的==`db`==挂载到容器的==
|
||||
|
||||
```
|
||||
```
|
||||
/data/db
|
||||
```
|
||||
|
||||
```
|
||||
==,作为==`mongo`==数据存储目录==``
|
||||
启动成功,如下图:
|
||||
|
||||
3.测试连接 `MongoDB`
|
||||
连接 `MongoDB` 命令:
|
||||
|
||||
```
|
||||
```
|
||||
docker run -it mongo:latest mongo --host 172.17.0.1
|
||||
```
|
||||
|
||||
```
|
||||
==命令说明:==
|
||||
|
||||
```
|
||||
```
|
||||

|
||||
```
|
||||
|
||||
```
|
||||
==使用==`mongo`==镜像执行==`mongo` ==命令连接到刚启动的容器==`,`==主机==`IP`==为==
|
||||
|
||||
```
|
||||
```
|
||||
172.17.0.1
|
||||
```
|
||||
|
||||
```
|
||||
提示信息 `It looks like you are trying to access MongoDB over HTTP on the native driver port.` ,nice,部署 `MongoD` 成功!
|
||||
@@ -1,17 +0,0 @@
|
||||
**Docker安装redis**
|
||||
**1.首先下载redis镜像:**
|
||||
docker pull redis
|
||||
**2.然后创建一个文件夹用来存放redis的配置文件、数据等(也就是所谓的挂载目录,作用就是将此目录中的文件或文件夹覆盖掉容器内部的文件或文件夹)**
|
||||
**3.在上面创建的目录下使用命令启动redis容器**
|
||||
docker run -d -p 6379:6379 -v $PWD/conf/redis.conf:/usr/local/etc/redis/redis.conf -v $PWD/data:/data --name docker-redis docker.io/redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes
|
||||
**解释一下上面命令的意义:**
|
||||
-d:表示后台运行,不加-d执行上面的命令你就会看到redis启动的日志信息了
|
||||
-p:表示端口映射,冒号左面的是我们的宿主机的端口,也就是我们虚拟机的端口,而右侧则表示的是mysql容器内的端口
|
||||
--name:是我们给redis容器取的名字
|
||||
-v:表示挂载路径,$PWD表示当前目录下,冒号左面的表示我们宿主机的挂载目录,也就是我们虚拟机所在的文件路径,冒号右边则表是的是redis容器在容器内部的路径,上面的命令我分别挂载了redis.conf(redis的配置文件),如需使用配置文件的方式启动redis,这里则需要加上,还有redis存放数据所在的目录
|
||||
--appendonly yes:表示redis开启持久化策略
|
||||
|
||||
作者:GatHub
|
||||
链接:https://www.jianshu.com/p/2f95680f21c5
|
||||
来源:简书
|
||||
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
|
||||
@@ -1,12 +0,0 @@
|
||||
**1****、设置****docker****开机启动**
|
||||
systemctl enable docker
|
||||
**2****、设置容器自动重启**
|
||||
**1****)、创建容器时设置**
|
||||
|
||||
docker run -d --restart=always --name 设置容器名 使用的镜像(上面命令 --name后面两个参数根据实际情况自行修改)
|
||||
--restart具体参数值详细信息: no容器退出时,不重启容器; on-failure 只有在非0状态退出时才重新启动容器; always 无论退出状态是如何,都重启容器;
|
||||
|
||||
**2****)、修改已有容器,使用****update**
|
||||
docker update --restart=always 容器ID(或者容器名)
|
||||
(容器ID或者容器名根据实际情况修改)
|
||||
> 来自 <[https://www.cnblogs.com/763977251-sg/p/11839918.html](https://www.cnblogs.com/763977251-sg/p/11839918.html)>
|
||||
@@ -1,65 +0,0 @@
|
||||
**docker rm & docker rmi & docker prune** **的差异**
|
||||
|
||||
**docker rm** **:** ==删除一个或多个== **容器**
|
||||
**docker rmi** **:** ==删除一个或多个== **镜像**
|
||||
**docker prune**==:== ==用来删除不再使用的== **docker** **对象**
|
||||
|
||||
**依据镜像名称来** **删除**
|
||||
docker rm `docker ps -a |grep 10.10.200.175/rancher/* | awk '{print $1}'`
|
||||
docker stop `docker ps -a | awk '{print $1}'`
|
||||
**Docker rm** **命令**
|
||||
**语法**
|
||||
docker rm [OPTIONS] CONTAINER [CONTAINER...]
|
||||
==OPTIONS====说明:==
|
||||
|
||||
- **-f** **:** ==通过====SIGKILL====信号====强制删除====一个运行中的容器==
|
||||
- **-l** **:** ==移除容器间的网络连接,而非容器本身==
|
||||
- **-v** **:** ==删除与容器关联的卷==
|
||||
|
||||
|
||||
**实例**
|
||||
==强制删除容器====db01====、====db02====:==
|
||||
docker rm -f db01 db02
|
||||
|
||||
==移除容器== ==my-nginx== ==对容器====db01====的连接,连接名====db01====:==
|
||||
docker rm -l db01
|
||||
|
||||
==删除容器== ==my-nginx====,并删除容器挂载的数据卷:==
|
||||
docker rm -v my-nginx
|
||||
|
||||
|
||||
**Docker rmi** **命令**
|
||||
**语法**
|
||||
docker rmi [OPTIONS] IMAGE [IMAGE...]
|
||||
==OPTIONS====说明:==
|
||||
|
||||
- **-f** **:** ==强制删除==
|
||||
- **--no-prune** **:** ==不移除该镜像的过程镜像,默认移除==
|
||||
|
||||
|
||||
**实例**
|
||||
==强制删除本地镜像== ==mongo:3.2==
|
||||
docker rmi -f mongo:3.2
|
||||
|
||||

|
||||
|
||||
|
||||
**Docker prune** **命令**
|
||||
==删除== ==所有未被== ==tag== ==标记和未被容器使用的镜像====:==
|
||||
docker image prune
|
||||
|
||||
==删除== ==所有未被容器使用的镜像====:==
|
||||
docker image prune -a
|
||||
|
||||
==删除== ==所有停止运行的容器====:==
|
||||
docker container prune
|
||||
|
||||
==删除== ==所有未被挂载的卷====:==
|
||||
docker volume prune
|
||||
|
||||
==删除== ==所有网络====:==
|
||||
docker network prune
|
||||
|
||||
==删除== ==docker== ==所有资源====:==
|
||||
docker system prune
|
||||
\> 来自 \<[https://www.cnblogs.com/miracle-luna/p/11111907.html](https://www.cnblogs.com/miracle-luna/p/11111907.html)\>
|
||||
@@ -1,7 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
|
||||
<html><head>
|
||||
<title>404 Not Found</title>
|
||||
</head><body>
|
||||
<h1>Not Found</h1>
|
||||
<p>The requested URL was not found on this server.</p>
|
||||
</body></html>
|
||||
@@ -1,2 +0,0 @@
|
||||
1. ==大量====镜像通过命令 docker image prune -f 清理。==
|
||||
2. ==通过命令 docker images | awk 'NR!=1{print $1":"$2}' | xargs docker rmi 可以批量清除无用的镜像,且不会影响使用中的镜像和基础镜像,满足笔者的需求。== > 来自 <[https://www.cnblogs.com/sqgzy/p/11864675.html](https://www.cnblogs.com/sqgzy/p/11864675.html)> > 来自 <[https://www.cnblogs.com/sqgzy/p/11864675.html](https://www.cnblogs.com/sqgzy/p/11864675.html)>
|
||||
@@ -1,28 +0,0 @@
|
||||
**方法一:**
|
||||
==#====显示所有的容器,过滤出====Exited====状态的容器,取出这些容器的====ID====,==
|
||||
==sudo docker ps -a|grep Exited|awk '{print $1}'==
|
||||
==#====查询所有的容器,过滤出====Exited====状态的容器,列出容器====ID====,删除这些容器==
|
||||
==sudo docker rm `docker ps -a|grep Exited|awk '{print $1}'`==
|
||||
xx
|
||||
**方法二:**
|
||||
==#====删除所有未运行的容器(已经运行的删除不了,未运行的就一起被删除了)==
|
||||
==sudo docker rm $(sudo docker ps -a -q)==
|
||||
|
||||
**方法三:**
|
||||
==#====根据容器的状态,删除====Exited====状态的容器==
|
||||
==sudo docker rm $(sudo docker ps -qf status=exited)==
|
||||
|
||||
**方法四:**
|
||||
==#Docker 1.13====版本以后,可以使用== ==docker containers prune== ==命令,删除孤立的容器。==
|
||||
==sudo docker container prune==
|
||||
|
||||
~~#~~~~删除所有镜像~~
|
||||
~~sudo docker rmi $(docker images -q)~~
|
||||
|
||||
**附图:**
|
||||
==02-====删除所有的容器,所有未运行的容器都被删除,正在运行的无法删除,达到删除不用容器的目的。==
|
||||
==03-====低于====1.13====版本的====Docker====,可以根据容器的状态来进行删除==
|
||||
==04-====查询所有的容器,过滤出状态为====Exited====的容器==
|
||||
==05-Docker 1.13====版本以后,开始支持====prune====命令,快速删除已退出的容器==
|
||||
|
||||
> 来自 <[https://blog.csdn.net/jiangeeq/article/details/79499324](https://blog.csdn.net/jiangeeq/article/details/79499324)>
|
||||
@@ -1,4 +0,0 @@
|
||||
==INSTALL AS A CONTAINER==
|
||||
==Compose can also be run inside a container, from a small bash script wrapper. To install compose as a container run this command:==
|
||||
sudo curl -L --fail [https://github.com/docker/compose/releases/download/1.25.4/run.sh](https://github.com/docker/compose/releases/download/1.25.4/run.sh) -o /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-compose
|
||||
> 来自 <[https://docs.docker.com/compose/install/#alternative-install-options](https://docs.docker.com/compose/install/#alternative-install-options)>
|
||||
Reference in New Issue
Block a user