DanLevy.net

Docker 服务器设置

用单条命令启动数据库服务器

Hero image for Docker 服务器设置

Docker 服务器设置

历史说明:这是 2015 年本地开发参考。有助于理解旧工作流,但不要将这些代码片段视为当前生产建议。现代 Docker Compose 文件、自定义网络、固定镜像版本、身份验证、密钥和经过审查的更新自动化是如今更安全的默认做法。

本指南适合谁?

别再让这些理由阻碍你!

一行命令快速链接

本文提供启动最流行数据库的一行命令,包括:

PostgreSQL 图标 Postgres

MongoDB 图标 MongoDB

MySQL 图标 MySQL

Elastic 图标 ElasticSearch

注意: 这些命令是作为本地开发快捷方式编写的。如果将其用于生产环境,请先添加身份验证、密钥管理、备份、网络策略、固定镜像版本和升级计划。

高级 Docker 用户: 如果你熟悉 docker-compose,可以将下面的 shell 命令转换到你的 docker-compose.yml 文件中使用。

Postgres 服务器

启动一个容器,命名为 pg-localhost

Terminal window
# 将数据库文件存储在容器外的本地路径
mkdir -p $HOME/.postgres-data
docker run \
--name pg-localhost \
-p 127.0.0.1:5432:5432 \
-e POSTGRES_PASSWORD=password \
--restart unless-stopped \
-it \
--shm-size=256mb \
postgres:16-alpine \
postgres -c 'listen_addresses=*' \
-c 'password_encryption=scram-sha-256' \
-c 'shared_memory_type=sysv' \
-c 'shared_buffers=256MB' \
-c 'max_connections=200'

根据需要调整命令行选项。(postgres 守护进程参数在 Docker 镜像名称 postgres:16-alpine 之后开始。参见 postgres -c 'listen_addresses=*'...

以 postgres 用户身份访问 psql 提示符

Terminal window
docker exec --user postgres -it pg-localhost psql

以 root 身份访问容器的 shell

Terminal window
docker exec -it pg-localhost bash

注意: 上述命令使用官方的 Alpine Linux 基础镜像。这不是你典型的 debian 环境。

要使用 debian/ubuntu 基础镜像,将 postgres:12-alpine 改为 postgres:12

MongoDB 服务器

Terminal window
mkdir -p $HOME/.mongodb/data
docker run -d \
--name mongodb \
--restart on-failure:5 \
-p 127.0.0.1:27017:27017 \
-v $HOME/.mongodb:/data \
mongo:7 \
bash -c 'mongod --bind_ip 0.0.0.0'

服务器配置完成后,用以下命令验证数据是否位于 $HOME/.mongodb

Terminal window
ls -lach $HOME/.mongodb

使用 mongosh CLI 工具连接到服务器。(如果尚未安装,请参见下文。)

Terminal window
#> 使用默认参数:
mongosh

你应该会看到类似这样的输出:

Mongo shell 输出预览

安装 Mongo CLI 工具

使用 brew 和 OSX
Terminal window
brew tap mongodb/brew
brew install mongodb-community-shell

MySQL 服务器

警告: 请修改下方 MYSQL_ROOT_PASSWORD 中的密码。

Terminal window
mkdir -p $HOME/.mysql
docker run -d \
-v $HOME/.mysql:/var/lib/mysql \
-p 127.0.0.1:3306:3306 \
--name mysql-$USER \
-e MYSQL_DATABASE=$USER \
-e MYSQL_ROOT_HOST='172.*.*.*' \
-e MYSQL_ROOT_PASSWORD='p@ssw0rd' \
mysql/mysql-server:8

ElasticSearch 服务器

Terminal window
mkdir -p $HOME/.elastic
docker run -d \
--name elastic \
-p 127.0.0.1:9200:9200 \
-p 127.0.0.1:9300:9300 \
-v $HOME/.elastic:/data \
docker.elastic.co/elasticsearch/elasticsearch:8.15.5 bash -c 'elasticsearch --cluster.name elastic_cluster --node.name elastic01 --path.data /data/elastic-data --path.logs /data/elastic-logs '
安全说明

注意: -p 127.0.0.1:27017:27017 这种端口选项会阻止除 Docker 服务器本地回环网络之外的访问。 要“发布”暴露的端口,请移除本地 IP 地址前缀以允许外部访问:-p 27017:27017请确保已采取必要的安全预防措施。

建议: 始终使用端口扫描工具(如 nmap/masscan)验证你的网络配置(在另一网络的独立系统上执行)。

现在你已经掌握了启动数据库服务器的命令,下一步是将你的应用程序打包成 Docker 镜像。第二部分继续如下:

打包 NodeJS Web 应用

  1. 在项目根目录添加一个名为 Dockerfile 的空白文件。
  2. (可选,推荐)使用 .gitignore 规则添加 .dockerignore,排除大型非必要路径。默认情况下,所有项目文件都会被包含。

在应用根目录创建 Dockerfile

# NodeJS 示例
FROM node:22
EXPOSE 3000
COPY . /app/
WORKDIR /app
RUN apt-get update && apt-get dist-upgrade -yqq
RUN ["npm", "install"]
# 可覆盖命令
CMD ["npm", "start"]

通过终端命令更容易展示如何使用 Dockerfile 并查看结果(见下方命令)。

在终端中,cd 到你的项目文件夹,每次部署变更(或需要更改/升级操作系统或环境配置)时运行以下 build 命令。

Terminal window
docker build -t app-name-here .

关键 Docker 命令参考

构建 Docker 镜像

Terminal window
docker build -t app-name-here .

创建/运行 Web 应用并链接数据库服务器

Terminal window
docker network create app-local
docker network connect app-local mongodb
docker network connect app-local elastic
docker run -d --name webapp01 --network app-local -p 3000:3000 app-name-here

交互式运行(非守护进程,在终端中)

Terminal window
docker run -it --name webapp01 --network app-local -p 3000:3000 app-name-here bash

删除容器实例或镜像

重要:任何未存储在挂载卷路径上的数据都将丢失!!

Terminal window
# 删除镜像
docker rmi -f app-name-here
docker rm -f webapp01
# 现在重新运行上面的 `docker run...` 命令
# 例如,先停止上面的数据库实例,运行:`docker stop {mongo,elastic}`
docker rm -f mongo elastic