网站搬家到 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 系列之一一样, 参考链接:
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 /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 条评论