本文列举了使用 Docker 过程中遇到的问题。
时区
基于 Debian 的镜像通过设置 环境变量 改变时区,在 Dockerfile 中增加 ENV 或在启动容器时指定 $ docker run -e TZ=Asia/Shanghai ...。
1 | ENV TZ=Asia/Shanghai |
基于 Alpine 的镜像先安装 tzdate,再设置环境变量
1 | RUN apk add --no-cache tzdata |
交叉运行
https://github.com/justincormack/cross-docker
x86_64 架构运行其他架构( armhf 等)容器,原理是运用 QEMU。
macOS 不用以上脚本,实际测试中与树莓派对比,性能较差,毕竟是虚拟机。
网络
macOS
macOS 不能 ping 通容器(Linux docker0 默认为 172.17.0.1),所以容器想要 ping 主机,必须填写路由器分配给主机的 IP(192.168.199.100,而不是 172.17.0.1)。
DNS、host
不能在文件中写入配置,写入也不生效。在 daemon.json 中可以配置 DNS , 设置 hosts 请通过 docker build 、docker run 时的命令参数进行设置。
使用 Docker Compose
本博客系列文章运行容器方式由 docker run 转变为 docker-compose。
必须使用 .env.example 文件来定义变量。使用时将 .env.example 复制为 .env 文件。
规范
一个容器,一个服务
比如不要在一个容器中安装 LNMP,可以使用 Docker Compose 分配到 3 个容器,集中启动、管理。
一个容器运行多个服务:https://docs.docker.com/engine/admin/multi-service_container/
命令
使用 docker image 管理镜像 代替 docker images
使用 docker container 管理容器 代替 docker ps
使用 docker volume 管理数据卷
使用 docker network 管理容器网络
数据管理
详细内容请查看 Docker 数据管理
开发环境
Use bind mounts to give your container access to your source code
生产环境
Use volumes to store container data.
不赞成使用
容器互联
反对 --link,请使用自定义的 Docker 网络来连接多个容器
数据管理
反对 -v 或 --volume,请使用 --mount
废弃功能
https://docs.docker.com/engine/deprecated/