网站搬家到 docker 系列之二-- 搭建本地 docker 环境

提示: 该教程有两个作用, 一是用于搭建本地开发环境, 二是方便未来迁移到新服务器时使用。

1. 备份 docker 镜像

docker save -o waterlaw.tar waterlaw:top postgres:9.6

2. 拷贝 tar 文件到本地

scp zjp@waterlaw.top:/home/zjp/waterlaw.tar E:\

本地磁盘 E 下有一个 waterlaw.tar 的文件, 可将它存放在网盘, 方便以后使用。

3. 备份数据库

docker exec -it pgsql pg_dump -U postgres -h localhost blog > /tmp/blog.bak

提示

-bash: /tmp/blog.bak: Permission denied

尝试

docker exec -it pgsql pg_dump -U postgres -h localhost blog > /tmp/blog2.bak

服务器 /tmp/

auth file num user group size time File
-rw-rw-r-- 1 zjp zjp 141419 Oct 5 21:44 blog2.bak
-rw-rw-r-- 1 postgres postgres 0 Sep 17 20:18 blog.bak

拷贝到主目录

cp /tmp/blog2.bak ~

下载到本地

scp zjp@waterlaw.top:/home/zjp/blog2.bak E:\

4. 加载 tar 为镜像

docker load -i E:\waterlaw.tar

接下去的操作和 waterlaw 网站搬家到 docker 系列之一一样, 参考链接:

waterlaw 网站搬家到 docker 系列之一

5. 启动 postgres 容器

win10 由于 docker 支持不完善的原因, 这里不挂在 pgdata 数据目录。

docker run --name pgsql -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作为镜像。

可能会遇到如下异常:

docker.exe: Error response from daemon: driver failed programming external connectivity on endpoint 

重启 docker 服务即可。

6. 创建 blog 数据库

docker exec -it pgsql psql -U postgres -d postgres
create database blog;

7. 还原数据库数据

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

docker cp 命令

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

实际运行:

docker cp E:\blog2.bak pgsql:/tmp

2. 还原数据库数据

还原命令:

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

8. 启动 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 的部分结果如下:

        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "09e9ec36e77da5cf06f4d1d173e31139a95aa68c8aba6e764e3dc6d2ace215c1",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "5432/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "54329"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/09e9ec36e77d",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "2d5072e8a37b1748e33c04ff44cbe59b7897316a070609eebf3d345485198350",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "395a8b1ecbf7c215b6ad8c93f241c715151fb7b41c081320982ec5e6c61a042b",
                    "EndpointID": "2d5072e8a37b1748e33c04ff44cbe59b7897316a070609eebf3d345485198350",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

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

4. 运行 Django 容器

docker run -it -v E:\Projects\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

在本机访问 localhost:8000 即可看到网站首页。 Django 不能通过IP访问 Docker 容器里的 Django 服务器

发表评论

评论内容
 

评论列表, 共 0 条评论