快速构建开发大项目环境-docker实践 | 青训营

94 阅读2分钟

项目地址:BuildDevEnv

解决问题

Docker通过容器化技术,解决了软件开发、部署和交付中的环境一致性、依赖冲突、快速部署、资源利用、可移植性、版本控制、部署一致性等一系列问题,使应用程序能够在不同环境中以高效、稳定的方式运行,并加速了开发与部署过程。

核心概念

  • Image(镜像): 类似于类。对镜像内容的修改,Docker 都会将这些修改铸造成一个镜像层,而一个镜像其实就是由其下层所有的镜像层所组成的。
  • Container(容器): 类似于对象,包含程序运行的时候所需的一切。
  • Network(网络): 不同容器之间的连接,容器与宿主机之间的连接
  • Volume(数据卷): 实现文件系统目录的挂载。

启动方式

主要有3种启动方式

  1. 直接pull镜像启动。
docker pull golang:1.20
docker run golang:1.20
# docker run -ti golang:1.20 要交互终端的用这个
  1. 通过Dockerfile构筑镜像启动。
docker build -t ImageName:TagName dir
docker run golang:1.20
  1. 通过docker-compose启动(目录要有docker-compose.yml文件)。
docker-compose build
docker-compose up

下面主要谈谈第3种是如何构建的。

项目构筑(docker-compose)

思路来源:go-zero实战:让微服务Go起来——2 环境搭建

.
├── code
├── data
│   ├── minio
│   ├── mysql
│   └── redis
├── docker-compose.yml
├── .env
├── etcd
│   └── Dockerfile
├── etcd-manage
│   └── Dockerfile
├── golang
│   └── Dockerfile
├── minio
│   ├── config
│   │   └── certs
│   │       └── CAs
│   └── Dockerfile
├── mysql
│   ├── Dockerfile
│   └── sql
├── mysql-manage
│   └── Dockerfile
├── readme.md
├── redis
│   └── Dockerfile
└── redis-manage
    └── Dockerfile
  • code:项目代码,挂载到golang容器中开发。
  • data:数据文件,挂载到数据库容器中管理。
  • .env:环境的配置,给docker-compose.yml使用 这一套可以很清晰的去构筑我们的项目,同时也方便后期的修改与维护。

遇到的一些问题

  1. 容器启动就关闭问题 因为容器没有一个前台进程, 如果没有前台进程执行,容器认为空闲,就会自行退出。
  2. 端口映射问题
ports:
# 设置端口映射
- "8080:8080" #api服务
- "8889:8889" #rpc-user
- "8890:8890" #

我们会去配置宿主机对容器的端口映射像上面这样,但是可能会陷入一个误区,即是双向映射的,但实际上映射是单向的,宿主机的127.0.0.1:8080->容器的127.0.0.1:8080,但是反过来并不成立,容器的 host.docker.internal:8080 -> 127.0.0.1:8080。所以使用本机服务的时候要注意。

总结

docker是一项十分值得学习和使用的技术,可以很方便的构建和分发开发和运行环境,在使用docker前,配置环境简直是痛苦面具,有时候配好了,重装下系统就又要重新配了。docker 容器之间的网络配置也很值得学习,涉及到很多计算机网络的知识。在有时间学习一下k8s,深入一下云原生。

推荐阅读

17 条 Docker 最佳实践

Docker Engine overview