思界 發表於 2025-12-25 10:23:40

使用Docker部署postgresql教程

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">使用Docker部署postgresql</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">使用docker-compose来部署</a></li></ul><li><a href="#_label1">进入postgres容器中执行SQL</a></li><ul class="second_class_ul"></ul><li><a href="#_label2">psql的使用</a></li><ul class="second_class_ul"></ul><li><a href="#_label3">补充postgres容器的环境变量</a></li><ul class="second_class_ul"></ul><li><a href="#_label4">总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>使用Docker部署postgresql</h2>
<p>postgresql数据库在Docker中的镜像的名称为<code>postgres</code>,可以从DockerHub中pull下来,如果pull不下来那么很大概率是网络问题导致的,这时候你可能需要在网上找一些能用的镜像源,以成功拉取<code>postgres</code>镜像。</p>
<p>有了<code>postgres</code>的镜像之后,你就可以在本地的Docker创建一个<code>postgres</code>的容器并运行。我们有两种方式来创建容器:</p>
<ul><li>直接使用命令行来创建<code>postgres</code>的容器并运行;</li><li>使用<code>docker-compose</code>来创建<code>postgres</code>的容器并运行;</li></ul>
<p>这里先介绍使用命令行的方式来创建<code>postgres</code>容器的方式:</p>
<div class="jb51code"><pre class="brush:bash;">docker run -d
--name postgres-exprdb
-p 5432:5432
-e POSTGRES_PASSWORD=123456
-e POSTGRES_USER=aderversa
-e POSTGRES_DB=testdb
-v ~/postgresql/data:/var/lib/postgresql/data
postgres
</pre></div>
<ul><li><code>-e</code>是用来设置<code>postgres</code>容器中环境变量的值的,有些特殊的环境变量将会影响到启动后的<code>postgresql</code>的一些参数,比如<code>postgresql</code>数据库的密码、用户等等。具体一些环境变量的含义可以查看dockerhub中有关于环境变量的介绍,本文的最后也会介绍一些环境变量的含义。</li><li><code>-p</code>将PostgreSQL的5432端口暴露到宿主机的5432端口,方便我们在外部访问容器内的PostgreSQL服务。</li><li><code>-v</code>将容器内的<code>/var/lib/postgresql/data</code>文件夹挂载到宿主机的<code>~/postgresql/data</code>文件夹下,这样数据库中的数据就不会因为我们删除了容器而丢失。你需要自己定义好这个数据文件夹该挂载到自己主机的什么地方上,这里我给出的值仅做参考。</li><li><code>--name postgres-exprdb</code>指定创建的PostgreSQL容器的名字。</li><li><code>-d</code>表示该容器在后台运行,并打印创建容器的ID到控制台。</li><li><code>postgres</code>是我们所使用的镜像。</li></ul>
<p>运行上述命令,使用<code>docker ps</code>查看容器状态:</p>
<div class="jb51code"><pre class="brush:bash;">CONTAINER ID   IMAGE      COMMAND                   CREATED         STATUS         PORTS                  NAMES
b1f5d4521cd0   postgres   "docker-entrypoint.s…"   8 seconds ago   Up 7 seconds   0.0.0.0:5432-&gt;5432/tcp   postgres-exprdb
</pre></div>
<p>可以看见,容器已经在后台运行了。之后,我们可以使用别的什么工具去访问已经创建好的<code>testdb</code>数据库,用定义好的特权用户<code>aderversa</code>,以及指定好的密码<code>123456</code>。</p>
<p>IP已知,端口已知,用户名和密码都有了,那么你就可以用你能想象到的方式去连接这个PostgreSQL数据库啦。</p>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>使用docker-compose来部署</h3>
<p>相比于在命令行中写冗长的命令,我更喜欢将容器的配置写到<code>docker-compose.yaml</code>文件中,然后一行:</p>
<div class="jb51code"><pre class="brush:bash;">docker compose -f docker-compose.yaml -p package_name up -d
</pre></div>
<ul><li><code>-f</code>指定要要操作的文件。</li><li><code>-p</code>指定项目的名称。</li><li><code>up</code>是创建并启动容器的命令。</li><li><code>-d</code>表示容器在后台启动。</li></ul>
<p>比如,我编写了一个<code>docker-compose.yaml</code>文件:</p>
<div class="jb51code"><pre class="brush:yaml;">version: "3.8"

services:
database_expr:
    image: postgres:latest
    container_name: postgres-expr
    restart: on-failure:3
    ports:
      - 5432:5432
    volumes:
      - ./db:/var/lib/postgresql/data
    healthcheck:
      test: [ "CMD", "pg_isready" ]
      interval: 10s
      timeout: 5s
      retries: 5
    environment:
      - POSTGRES_PASSWORD=123456
      - POSTGRES_USER=aderversa
      - POSTGRES_DB=testdb
</pre></div>
<p>直接对其进行操作就可以创建好容器并启动,用户不需要关心里面有什么配置。甚至如果你觉得使用<code>docker compose</code>的命令行来启动不够抽象,那么你可以将它编写入shell脚本中,用户直接运行脚本,只要用户安装了Docker环境,就可以安装PostgreSQL成功,他甚至不需要关心Docker命令应该如何使用。</p>
<p class="maodian"><a name="_label1"></a></p><h2>进入postgres容器中执行SQL</h2>
<p>使用命令:</p>
<div class="jb51code"><pre class="brush:bash;">docker ps
</pre></div>
<p>查找出刚才创建的PostgreSQL容器的ID:</p>
<div class="jb51code"><pre class="brush:bash;">CONTAINER ID   IMAGE             COMMAND                   CREATED      STATUS                  PORTS                  NAMES
dcf5e3c0ff7f   postgres:latest   "docker-entrypoint.s…"   13 hours ago   Up 13 hours (healthy)   0.0.0.0:5432-&gt;5432/tcp   postgres-expr
</pre></div>
<p>获得<code>container_id = dcf5e3c0ff7f</code>,接着我们使用以下命令进入容器的<code>bash</code>中,方便在操作容器:</p>
<div class="jb51code"><pre class="brush:bash;">docker exec -it dcf5e3c0ff7f /bin/bash
</pre></div>
<p>注意,如果是在Windows下执行这条命令的时候,使用<code>Git Bash</code>来执行可能会因为终端的一些问题执行失败,此时需要更换一下执行命令的终端,比如:PowerShell。</p>
<p>进入到容器中是这个样子的:</p>
<div class="jb51code"><pre class="brush:bash;">&gt; docker exec -it dcf5e3c0ff7f /bin/bash
root@dcf5e3c0ff7f:/#
</pre></div>
<p>第一行是在PowerShell中执行的,而第二行则是PostgreSQL容器中运行的bash进程。</p>
<p>接着我们就可以使用:</p>
<div class="jb51code"><pre class="brush:bash;">psql ... ]
</pre></div>
<p>这里介绍连接数据库需要使用的OPTION选项,具体的你可以使用<code>psql --help</code>来查看:</p>
<ul><li><code>-h</code>指定PostgreSQL数据库的IP地址。</li><li><code>-p</code>指定PostgreSQL数据库的端口号。</li><li><code>-U</code>指定登录到数据库的用户名,不指定默认就是<code>root</code>。</li><li><code>-w</code>从不提示输入密码,字面意思,不需要输入密码来进行访问数据库,默认是不需要输入密码的。</li><li><code>-W</code>强制密码输入。</li></ul>
<p>按照这个用法,我们可以用以下两种方式连接数据库:</p>
<div class="jb51code"><pre class="brush:bash;"># 这里由于我们在创建容器的时候指定的特权用户是aderversa,因此root被挤占掉了
# 用户名对于我这里来说是必须设置的。
psql -p 127.0.0.1 -p 5432 -U aderversa testdb
</pre></div>
<p>或者省事一点,直接使用:</p>
<div class="jb51code"><pre class="brush:bash;">psql testdb aderversa
</pre></div>
<p>执行成功后我们就能够进入<code>psql</code>的命令行:</p>
<div class="jb51code"><pre class="brush:bash;">psql (17.2 (Debian 17.2-1.pgdg120+1))
Type "help" for help.

testdb=#
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>psql的使用</h2>
<p>这里我们并不知道如何使用这个命令行,它提示我们可以使用<code>help</code>来获得帮助,那么就执行一波help,得到了以下信息:</p>
<div class="jb51code"><pre class="brush:bash;">You are using psql, the command-line interface to PostgreSQL.
Type:copyright for distribution terms
       h for help with SQL commands
       ? for help with psql commands
       g or terminate with semicolon to execute query
       q to quit
</pre></div>
<p>这里它告诉我们:</p>
<ul><li><p><code>copyright</code>,可以PostgreSQL DDMS的一些条款,里面大概是说:不管你出于何种目的,该软件和其文档都是允许你使用、复制、修改和发布的,并且是不需要任何费用,不需要修改的同意&hellip;看起来是非常宽松的声明,毕竟PostgreSQL遵循的是BSD协议。</p></li><li><p><code>h</code>显示SQL命令,比如<code>CREATE TABLE</code> <code>ALTER TABLE</code>&hellip;。</p></li><li><p><code>?</code>显示psql的命令,这里面还是非常多命令的,大多都是用来查看数据库的状态的,比如存在什么表、数据库、视图之类的。这里介绍一些常用的、简单的命令:</p>
<ul><li><code>l</code>,列出所有数据库;</li><li><code>c</code>,连接到数据库某个数据库,如果先前有连接到某个数据库那么这个操作就是更换连接的数据库;</li><li><code>dt</code>,查看正在使用的数据库中存在哪些表(注意,默认创建的表似乎是不会列出来的);</li></ul></li><li><p><code>g</code>执行psql的上一个命令。</p></li><li><p><code>q</code>退出psql。</p></li></ul>
<p>以上就是psql的基本用法了,你可以按照自己的在上面执行SQL语句,比如:</p>
<div class="jb51code"><pre class="brush:bash;">create table user ( id int primary key );
</pre></div>
<p>注意SQL命令以<code>;</code>结尾就可以了。</p>
<p>创建完成后可以使用:</p>
<div class="jb51code"><pre class="brush:bash;">dt
</pre></div>
<p>来查看你是否创建成功。</p>
<p>接下来就是你发挥创造力的时候了,自己尝试着使用psql吧。</p>
<p class="maodian"><a name="_label3"></a></p><h2>补充postgres容器的环境变量</h2>
<ul><li><code>POSTGRES_PASSWORD</code>,<strong>必要的</strong>环境变量。这个环境变量将设置PostgreSQL容器中特权用户的密码。如果你要使用PostgreSQL镜像,让它以容器的形式的运行,那么这个环境变量就必须要设置,它一定不能够为空或者未定义。默认的特权用户将由<code>POSTGRES_USER</code>来定义。</li><li><code>POSTGRES_USER</code>,可选的环境变量。设置PostgreSQL容器中的特权用户名,需要与<code>POSTGRES_PASSWORD</code>一起使用,以此设置好特权用户的名字和密码。如果该环境变量未被指定,那么默认的特权用户名为<code>postgres</code>。</li><li><code>POSTGRES_DB</code>,可选的环境变量。定义容器首次运行创建的默认数据库的名字。如果该环境变量未被使用,那么该环境变量的值等于<code>POSTGRES_USER</code>的值。</li><li><code>POSTGRES_INITDB_ARGS</code>,可选的环境变量。大概最终是以这种方式被利用:<code>postgres initdb ${POSTGRES_INITDB_ARGS}</code>。</li><li><code>POSTGRES_INITDB_WALDIR</code>,可选的环境变量。定义PostgreSQL事务日志的位置。默认的事务日志的位置是PostgreSQL主数据文件夹(<code>PGDATA</code>指定)下的一个子文件夹。</li><li><code>POSTGRES_HOST_AUTH_METHOD</code>,可选的环境变量。(个人理解,似乎是与密码摘要相关的东西,这一般不需要我们关注,如果有兴趣可以去<a href="https://www.postgresql.org/docs/14/auth-password.html" rel="external nofollow"   target="_blank">PostgreSQL: Documentation: 14: 21.5. Password Authentication</a>了解一下)。</li><li><code>PGDATA</code>,可选的环境变量。定义PostgreSQL主数据文件夹的位置,默认是<code>/var/lib/postgresql/data</code>,如果有调整位置的需求那么可以按需求设置该变量的值。</li></ul>
<p class="maodian"><a name="_label4"></a></p><h2>总结</h2>
<p>以上为个人经验,希望能给大家一个参考,也希望大家多多支持琼殿技术社区。</p>
頁: [1]
查看完整版本: 使用Docker部署postgresql教程