项目地址:BuildDevEnv
解决问题
Docker通过容器化技术,解决了软件开发、部署和交付中的环境一致性、依赖冲突、快速部署、资源利用、可移植性、版本控制、部署一致性等一系列问题,使应用程序能够在不同环境中以高效、稳定的方式运行,并加速了开发与部署过程。
核心概念
- Image(镜像): 类似于类。对镜像内容的修改,Docker 都会将这些修改铸造成一个镜像层,而一个镜像其实就是由其下层所有的镜像层所组成的。
- Container(容器): 类似于对象,包含程序运行的时候所需的一切。
- Network(网络): 不同容器之间的连接,容器与宿主机之间的连接
- Volume(数据卷): 实现文件系统目录的挂载。
启动方式
主要有3种启动方式
- 直接pull镜像启动。
docker pull golang:1.20
docker run golang:1.20
# docker run -ti golang:1.20 要交互终端的用这个
- 通过Dockerfile构筑镜像启动。
docker build -t ImageName:TagName dir
docker run golang:1.20
- 通过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使用 这一套可以很清晰的去构筑我们的项目,同时也方便后期的修改与维护。
遇到的一些问题
- 容器启动就关闭问题 因为容器没有一个前台进程, 如果没有前台进程执行,容器认为空闲,就会自行退出。
- 端口映射问题
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,深入一下云原生。