waterlaw 网站搬家到 docker 系列之一

1. python3 镜像准备

Dockerfile

docker build -t waterlaw:top .

生成一个 waterlaw:top 的镜像

2. 从 docker hub 拉取一个 postgres 镜像

docker pull postgres:9.6

3. 启动 postgres 容器

docker run --name pgsql -v /home/zjp/pgdata/:/var/lib/postgresql/data/ -e POSTGRES_PASSWORD=postgres -p 54329:5432 -d postgres:9.6

docker run,创建并运行一个容器;

--name,指定创建的容器的名字;

-e POSTGRES_PASSWORD=postgres,设置环境变量,指定数据库的登录口令为postgres;

-p 54329:5432,端口映射将容器的5432端口映射到外部机器的54329端口;

-d postgres:9.6,指定使用postgres:9.6作为镜像。

4. 创建 blog 数据库

1. 在运行的容器中执行命令

docker exec -it pgsql psql -U postgres -d postgres

docker exec :在运行的容器中执行命令 语法:

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

2. psql 下创建 blog 数据库

create database blog;

5. 备份数据

1. 在阿里云服务器上, 运行以下命令备份数据库

pg_dump -U postgres -h localhost blog > /home/zjp/blog.bak

2. 拷贝备份数据库到容器

docker cp 命令

docker cp /home/zjp/blog.bak CONTAINER:/tmp

3. 还原数据库数据

还原命令:

psql -U postgres -h localhost -d blog -f /tmp/blog.bak
docker exec -it <CONTAINER> psql -U postgres -h localhost -d blog -f /tmp/blog.bak bash

6. 启动 Django 容器

1. 暂停使用 8000 号端口的进程

netstat -ap | grep 8000
top
kill -9 pid

2. 修改 settings.py 中的数据库配置

'USER': '',
'PASSWORD': '',
'HOST': 'xxx',
'PORT': ''

这里 HOST 的地址是 pgsql 容器的 ip, 容器之间是挂在同一个网桥中, 因此可以通过容器 ip 互相访问。

3. 查看 pgsql 容器的 ip 地址

docker ps -a
docker inspect CONTAINER

docker inspect 的部分结果如下:

            "EndpointID": "938288987e78efa174a85d86d7bc435dd5431130b02c5a169f6d8f2c44722521",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.3",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:03",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "8e4ba51a7ad9e8ed9c76d27cd5722b0181ab056c6c13d0b8c44a18a8b654adb9",
                    "EndpointID": "938288987e78efa174a85d86d7bc435dd5431130b02c5a169f6d8f2c44722521",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }
            }
        }
    }
]

IPAddress 就是 pgsql 容器现在所分配的 ip, Django 容器可以通过该地址访问到数据库。

4. 运行 Django 容器

docker run -it -v /home/zjp/waterlawblog:/home/code -p 8000:8000 waterlaw:top bash

激活虚拟环境, 运行 python3 ./manage.py runserver 0.0.0.0:8000

. ../pysp/bin/activate
python3 ./manage.py runserver 0.0.0.0:8000

Django 不能通过IP访问 Docker 容器里的 Django 服务器

7. 感谢

以上就是最简单的 Docker 实践, 尚有很多不足之处,后面会改进, 在此非常感谢以下几位提供详细的博客分享, 我才能这么快配置好 docker 环境。

liuyueyi1995 : docker安装PostgreSQL

Chuck_Chen1222 : docker - 使用postgresql

CloudMan : 容器间通信的三种方式

widiot8023 : Django 不能通过IP访问 Docker 容器里的 Django 服务器

发表评论

评论内容
 

评论列表, 共 0 条评论