zoukankan      html  css  js  c++  java
  • Docker WSL2安装Postgres数据库

    postgres是一款被称为“用了都说好”的数据库,我还没有用过,无法评价。我最近在打算继续学一下数据库,以及ORM。由于求异心理,所有人都在这mysql那mysql,我不想用mysql,但又想用开源免费的东西,所以就盯上了postgres。

    今天我尝试使用Docker安装postgres。我的电脑是windows傻大黑粗游戏本,因为上班之后一直月光,没存下钱换轻薄本换Mac或者组台式,就继续用上学时候的游戏本(有薪水合适的工作的话,求求老板们带带我吧,人在上海)。

    环境准备
    Run起Postgres镜像
    解决问题
    使用DBMS连接到数据库

    环境准备

    首先系统里应该装有Docker,这个就不细说了。值得一提的是我的Docker Desktop在上次更新后,提示我要不要从hyper-v切换到WSL2,我当然是切换了,这也给我这次安装造成了一些小麻烦。下面列出一些可能用得到的文档,建议都浏览一下:

    Run起Postgres镜像

    我习惯先pull下镜像再run。执行pull命令:

    docker pull postgres
    

    pull完成后,开始run。我是在WSL的shell里执行的命令,不是在PowerShell里,所以命令格式不太一样。
    在文档 https://hub.docker.com/_/postgres 中往下翻,翻到"How to extend this image"标题下的"Environment Variables"小标题,简单浏览一下这几个环境变量的意义。因为页面全是英语,很反人类,我很简单地按照我的理解翻译几个当前可能用得到的,如果有错误或者有不准确地地方,请大家务必在评论区指正,谢谢大家。

    1. POSTGRES_PASSWORD,是唯一的必选环境变量,用于给用户设置密码。默认的用户名是"postgres",如果把POSTGRES_PASSWORD设置为"password",则可以使用用户名"postgres"和密码"password"来连接数据库。
    2. POSTGRES_USER,可以指定用户名,替换默认的"postgres"。
    3. POSTGRES_DB,可以给默认的数据库取一个别名,如果不取,默认数据库名为环境变量POSTGRES_USER的值。
    4. PGDATA,可以指定一个(容器内的)目录,这个目录会存放数据库文件。为了防止容器被删除后数据丢失,一般都把这个目录挂载到本机(WSL 2)上。

    剩下的环境变量可以等以后深入使用时再了解,现在看了也记不住。

    然后下面有一个示例:

    $ docker run -d 
        --name some-postgres 
        -e POSTGRES_PASSWORD=mysecretpassword 
        -e PGDATA=/var/lib/postgresql/data/pgdata 
        -v /custom/mount:/var/lib/postgresql/data 
        postgres
    

    看到这个我就直接好起来了,直接一行一行复制上,复制的过程中进行一些修改。给容器重新取个名字,就叫postgres1。把POSTGRES_PASSWORD设成自己的密码,用默认的用户名,我在本机D盘里新建一个目录D:/DockerFolder(踩了个坑),把数据库文件挂载到这个目录下,所以-v的命令也要改。

    我的命令是这样:

    docker run -d 
        --name postgres1 
        -e POSTGRES_PASSWORD=password 
        -e PGDATA=/var/lib/postgresql/data/pgdata 
        -v /mnt/d/DockerFolder/postgres1mount:/var/lib/postgresql/data/pgdata 
        postgres
    

    其中/mnt/d/DockerFolder是主机的D盘下的DockerFolder文件夹在WSL 2中的位置。按下回车。

    解决问题

    不出意料地把容器ID返回给了我们。然后我们执行命令来查看容器状态:

    docker ps
    

    发现什么都没有......

    别慌,问题不大,我们复制一下返回的ID,看一下日志:

    原来是加权限的时候被拒了。也不要试什么sudo了,肯定没什么用。

    从Docker、WSL 2到postgres,这种在国内很小众的东西出了问题,去百度它的话基本就是浪费时间,直接google,stackoverflow都行。

    https://github.com/docker-library/postgres/issues/116

    上面这个链接是官方库的issue,里面提了各种解决方法,前面的几十条基本都没什么用,我都试过了,也基本没解释问题的原因,直到这一条:

    问题出在我们Docker运行在WSL或者其他虚拟机上,但却挂载到本机的路径下。我原以为WSL中用/mnt/d/DockerFolder这种路径是没有问题的,看来我还是错了。我在WSL的/home/kit(kit是我的用户名)下新建一个目录DockerMount用来挂载Docker的卷。之前我还使用docker ps -a看过了postgres的默认端口是5432,所以docker run的时候加一个-p,映射到主机的5432端口,方便我们后面用DBMS来连接。

    别忘了先用docker rm [ID]删掉原来的容器。

    docker run -d 
        --name postgres1 
        -e POSTGRES_PASSWORD=password 
        -e PGDATA=/var/lib/postgresql/data/pgdata 
        -v /home/kit/DockerMount:/var/lib/postgresql/data 
        -p 5432:5432 
        postgres
    

    执行完命令后,容器终于跑起来了,端口也映射上了。

    使用DBMS连接到数据库

    数据库都用开源免费的,DBMS当然不能再用Navicat了,我也负担不起。所以选择使用pgAdmin,现在它的大版本是4。

    下载地址:
    https://www.pgadmin.org/download/pgadmin-4-windows/

    在里面选择一款你喜欢的版本,我选择的是最新的小版本4.27。下载速度极慢,需要用特殊姿势提速。

    下载完安装,安装完运行,直接自动在浏览器里打开了,需要设置一个密码。

    很好看,长这个样子:

    点一下Add New Server,第一个tab页的Name,随便取一个,再点第二个tab页的Connection:

    这个是重点,Host填localhost或127.0.0.1(但注意localhost不完全等于127.0.0.1,详情可以自己百度,在这里是一样的)。

    Port填docker run时用-p填映射到的本机端口,如果你改了的话,也填修改后的端口。

    Maintenance database和Username如果你在docker run时修改了默认值的话,也填修改后的。

    Password处填上密码,并选中Save password,点击下方软盘图标的Save,会自动测试能否连接成功并连接。

    可以看到这里连接成功了,界面也很好看,剩下的可以慢慢探索。本篇文章就到这里结束了,谢谢大家。

  • 相关阅读:
    包含源文件 —— 是奇技淫巧还是饮鸩止渴?
    感谢各位网友——《品悟C——抛弃 C程序设计 中的谬误与恶习》正式出版
    能否用痰盂盛饭——谈谈在头文件中定义外部变量
    C:劣书简易鉴别法
    从“站在巨人的肩上”到“跪到侏儒之脚下”——图灵公司副主编自供(二)
    劣质代码评析——刻舟求剑的故事
    Python自然语言处理学习笔记(36): 4.8 Python库的样本
    Python自然语言处理学习笔记(38): 4.10 深入阅读
    Python自然语言处理学习笔记(37):4.9 小结
    Python自然语言处理学习笔记(35): 4.7 算法设计
  • 原文地址:https://www.cnblogs.com/Kit-L/p/13850040.html
Copyright © 2011-2022 走看看