学习是程序员日常的一部分。既然是学习,就少不了写代码,搭建运行环境,部署数据库等等。
之前都是习惯了去下载安装软件,但是还是少不了要去解决一些:环境变量配置、windows 下乱七八糟的问题,等等。不但会影响进度,还影响心情。

现在有了 Docker ,就都把这些交出去吧。但是,但是,但是 Docker 也是需要一些配置的!比如 镜像加速,单独的网络,单独的数据卷,再加上 Compose 和 Swam 。但是幸好这些都是一次性的,而且可以零迁移到 Production 环境。所以还是可以接受的,性价比比较高。

安装 Docker

直接下载安装包安装就好了。windows 和 mac 的安装包,是包含了 docker-machine 的。Linux 上要自己单独安装。

Docker 镜像加速

在 Docker Daemon 里可以添加 Registry 配置,或者修改 /etc/docker/daemon.json 配置。重启生效。

{
"registry-mirrors": ["https://dockerhub.azk8s.cn/","https://registry.docker-cn.com"]
}

Docker 起 postgres + pgadmin4

直接去 docker-postgres docker-pgadmin4 上照着文档执行命令就可以了。

docker pull postgres:alpine
docker run --name pgsql -e POSTGRES_PASSWORD=password -d postgres:alpine
docker pull dpage/pgadmin4
docker run --name pgadmin -p 80:80 \
-e "PGADMIN_DEFAULT_EMAIL=user@domain.com" \ # 登录website要使用的账号和密码
-e "PGADMIN_DEFAULT_PASSWORD=SuperSecret" \
-d dpage/pgadmin4

问题:

  1. 两个容器正常起来之后,添加 pgsql 到 pgadmin4 的时候,遇到了点网络问题。

使用localhost 和 127.0.0.1 都连不上。后来是使用 docker network inspect bridge 查看默认的 bridge 的网络里,pgsql container 的 IP 地址,用这个地址连接的。

其他

  1. 使用数据卷,方便数据的备份和扩展。

  2. 直接使用 –link 连通多个 Docker 容器。

  3. 使用 Docker 创建新的网络。

  4. 使用 Docker Machine, Compose 和 Swarm。

  5. 更新于 2020年3月15日14:36:11

docker-postgres 官方推荐使用 postgres + adminer

使用如下 stack.yml 文件

# 启动命令 docker stack deploy postgres -c stack.yml
# 执行的时候可能会需要先执行 `docker swarm init`

# 访问 localhost:8080
# user/password 是 postgres/postgres

version: '3.7'

services:

postgres:
image: postgres
restart: always
ports:
- "5432"
environment:
POSTGRES_PASSWORD: postgres
volumes:
- "postgres-data:/var/lib/postgresql/data"
networks:
- app_net

adminer:
image: adminer
restart: always
ports:
- 8080:8080
networks:
- app_net

networks:
app_net:

volumes:
postgres-data:
  1. Postgresql 创建用户
CREATE USER tester WITH PASSWORD 'test_password';
GRANT ALL PRIVILEGES ON DATABASE "test_database" to tester;
  1. Postgresql 给用户添加只读权限
    -- Grant usage/select to a single table
    GRANT CONNECT ON DATABASE mydb TO xxx;
    -- This assumes you're actually connected to mydb..
    GRANT USAGE ON SCHEMA public TO xxx;
    GRANT SELECT ON mytable TO xxx;

    -- Multiple tables/views (PostgreSQL 9.0+)
    GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;