使用 Docker 高效搭建本地开发环境(详细教程)
点击上方“芋道源码”,选择“设为星标”
管她前浪,还是后浪?
能浪的浪,才是好浪!
每天 10:33 更新文章,每天掉亿点点头发...
源码精品专栏
- 原创 | Java 2021 超神之路,很肝~
- 中文详细注释的开源项目
- RPC 框架 Dubbo 源码解析
- 网络应用框架 Netty 源码解析
- 消息中间件 RocketMQ 源码解析
- 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析
- 作业调度中间件 Elastic-Job 源码解析
- 分布式事务中间件 TCC-Transaction 源码解析
- Eureka 和 Hystrix 源码解析
- Java 并发源码
- 本地开发之痛苦
- 什么是
Docker
Docker
本地开发环境的好处- 安装
Docker
- 安装
docker-composer
- 下载
laradock
- 配置
env
文件 - 运行容器
- 配置web项目
- 配置宿主机的
host
- 配置
nginx
- 访问
本地开发之痛苦
在开发之前,首先你需要安装各种开发工具和服务支持到你的开发环境当中,可能会出依赖问题,环境变量问题,端口冲突,经编译库问题等等。
开发途中,可能你又需要依赖一些其他的服务,你最好祈祷不会出问题,可能你又要重写来配置你的环境,因为你的所有的依赖服务都在你的唯一的工作空间里面。
如果你的伙伴的操作系统不统一,可能你还会遇到一些不同元字符解析不一致的问题。
然后上线之前,可能你在本地开发调试都可以完美运行,一但部署到服务器,就会出现各种问题。因为大多数情况下,我们的开发环境和生产环境并不相同。
可能你下次又有要用到一个新的开项目的开发环境。你又要重复面对上面这些问题.
你不得不去审视,你要话费大量的时间用在搭建环境当中来。
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
- 项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
- 视频教程:https://doc.iocoder.cn/video/
什么是Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux
机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。对我们而言,我觉得只需要把他理解成一个便携的应用容器 即可
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
- 项目地址:https://gitee.com/zhijiantianya/yudao-cloud
- 视频教程:https://doc.iocoder.cn/video/
Docker
本地开发环境的好处
试错
对开发者而言,每天会催生出的各式各样的新技术都需要尝试,然而开发者却不太可能为他们一一搭建好环境并进行测试。时间非常宝贵,正是得益于 Docker
,让我们有可能在一条或者几条命令内就搭建完环境,而且这个环境大到一个特定版本的操作系统,小到一个软件。Docker 有一个傻瓜化的获取软件的方法,Docker
后台会自动获得环境镜像并且运行环境。
统一开发和生产环境
对于一般的小公司来说,搭建一个公用的开发环境是一件不那么划算的事情。那么就可以用Docker
来统一开发环境,因为不管你用的是Windows
、Mac
还是 Ubuntu
。如果生产环境也使用的Docker
的话,你甚至可以直接打包一套环境,直接丢上去就可以运行了,再也不用担心开发-生产环境之间的差异了。
高性能
虚拟机的粒度是虚拟出的机 ,而Docker
的粒度则是被限制的应用 ,相比较而言 Docker 的内存占用更少,更加轻量级,性能也更优。
而秒级的启动,也可以让我们启动电脑时候,开发环境的运行是无感知的。
成果展示
我们可能经常要给用户或者是同事展示一样功能的,但是搭建演示环境的过程却是非常麻烦的。现在可以直接将我们的镜像打包丢过去,而不必去做任何环境配置的工作,同时也不必担心他们的环境配置会导致我们的产品无法运行。
安装Docker
在mac
平台下,就是去下载一个dmg
的安装文件。下载好了之后,双击,然后拖入就可以了,windows
应该也是类似的。
就是安装qq
一样简单,傻瓜式的。
附上dockerhub
上的下载链接:
https://hub.docker.com/search/?type=edition&offering=community&q=
成功之后属于docker version
如果出来版本信息就是安装成功,类似如下
Client: Docker Engine - Community
Version: 18.09.0
API version: 1.39
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:47:43 2018
OS/Arch: darwin/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.0
API version: 1.39 (minimum version 1.12)
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:55:00 2018
OS/Arch: linux/amd64
Experimental: true
安装docker-composer
一般来说,mac安装docker
之后就会携带docker-composer
。
其他平台,附上下载链接:
https://github.com/docker/compose/releases
安装完成之后可以输入命令检测
➜ ~ docker-compose version
docker-compose version 1.23.2, build 1110ad01
docker-py version: 3.6.0
CPython version: 3.6.6
OpenSSL version: OpenSSL 1.1.0h 27 Mar 2018
如果没有出现版本相关信息,可以尝试再次安装
下载laradock
laradock
的项目地址是https://github.com/laradock/laradock
我们找一个地方clone
下来即可
我这里是在我的用户目录下面新建了一个Docker
目录,然后clone
了项目下来
配置env
文件
- 拷贝example成.env cp env-example env
.env
文件中APP_CODE_PATH_HOST
是本地路径APP_CODE_PATH_CONTAINER
是远程映射路径,看需求修改,大多数情况下是不需要的- 如果有调试代码的需求,也可以将
PHP_FPM_INSTALL_XDEBUG
和WORKSPACE_INSTALL_XDEBUG
两个选项打开 - 如果还有其他的需求,可以在
.env
里面搜索,里面已经将大多数配置项都给独立出来了
运行容器
进入到laradock
的工作目录下面,就是clone
的项目的根目录我的工作目录就是~/Docker/laradock
。
然后运行如下命令
docker-compose up -d nginx mysql
就会看到在自动执行build
操作,并且build完了之后自动后台启动了如下容器
- nginx
- php-fpm
- workspace
- mysql
那是因为php-fpm
和workspace
还有docker-in-docker
是随nginx
一并启动的
所以实际上
docker-compose up -d nginx mysql
和
docker-compose up -d nginx workspace php-fpm mysql
这两条命令的效果是一样的,可以都带上,也可以不写。
up
命令在第一次启动的时候实际上就是build
+ start
的组合,如果容器不存在,那么就build
一个容器,并且启动服务,如果容器存在那么直接启动服务,大概就是这么个意思 -d
的意思是后台运行
配置web项目
一下是我laravel
项目的部分配置
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=blog
DB_USERNAME=root
DB_PASSWORD=root
......
注意,数据库主机必须得是别名才可以,如果DB_CONNECTION
这个地方输入172.0.0.1或者是localhost
都是会连接失败的。
在其它的项目中也必须是这样的,配置数据库链接,redis
,或者MemCache
链接都必须设置成具体的别名。或者你说我找到各个容器的ip,可以嘛。可以,但是并不建议这样做,因为ip是会变动的。
具体别名可以参考./docker-compose.yml
文件中的设置
这个主要的技术实现应该是用了docker
的虚拟网桥技术.
配置宿主机的host
因为,往往我们访问的时候,是通过宿主机上面的浏览器发送请求的,所以,配置宿主机上面的host
必不可少。
vim /etc/hosts
我这里加入一条我自己设置的虚拟域名
127.0.0.1 blog.test
然后保存,刷新下host。
配置nginx
进入到./laradock/nginx/sites
文件夹,然后ll
一下,我们会发现,laradock已经帮我们放了好多列举的文件进来
app.conf.example default.conf laravel.conf.example symfony.conf.example
根据需求拷贝一份,然后修改一下就可以了,都不是很难,由于我们本地是laravel开发的博客项目,所以我就直接拷贝laravel.conf.example
,然后使用vim打开
cp laravel.conf.example blog.conf vim blog.conf
打开后的内容...
server {
listen 80;
listen [::]:80;
# For https
# listen 443 ssl;
# listen [::]:443 ssl ipv6only=on;
# ssl_certificate /etc/nginx/ssl/default.crt;
# ssl_certificate_key /etc/nginx/ssl/default.key;
server_name laravel.test;
root /var/www/laravel/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass php-upstream;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fixes timeouts
fastcgi_read_timeout 600;
include fastcgi_params;
我们会发现,如果没有特殊需求的话,这个里面大多数地方我们并不需要修改。我们只需要关注server_name
和root
这两个参数,把这个里面的laravel
换成我们项目名就可以了,这里我们换成blog
下面是修改后的内容
server {
listen 80;
listen [::]:80;
# For https
# listen 443 ssl;
# listen [::]:443 ssl ipv6only=on;
# ssl_certificate /etc/nginx/ssl/default.crt;
# ssl_certificate_key /etc/nginx/ssl/default.key;
server_name blog.test;
root /var/www/blog/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass php-upstream;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fixes timeouts
fastcgi_read_timeout 600;
include fastcgi_params;
访问
输入url
http://blog.test/
浏览器返回结果
欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:
已在知识星球更新源码解析如下:
最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。
提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)
相关文章
- docker拷贝目录到容器_docker退出容器命令
- 经验总结 | Docker 使用笔记
- Nginx教程_nginx docker
- 让Docker决定写入的位置
- 8. 云服务器及 Docker 教程
- Docker配置Redis持久化
- Docker容器实战六:构建定制化镜像
- Docker离线安装教程「建议收藏」
- Linux+MCSM9+Docker 搭建我的世界Java版服务器,MC开服教程
- docker安装nacos
- 「Docker学习系列教程」9-Docker容器数据卷介绍
- 【图文安装教程】在docker中安装kibana
- 【图文安装教程】Docker安装ES的拼音分词器-搜索时候自动补全必备
- 「Docker学习系列教程」9-Docker容器数据卷介绍
- Docker服务的删除本地镜像命令(docker rmi 镜像id)
- Docker关闭容器命令(docker stop)
- Docker高级篇:docker网络的四种类型
- 「 [Docker]当你的docker无法解析DNS 」
- 「 【Docker】用docker运行2048小游戏(玩转docker) 」
- 【Docker 系列】docker 学习十一,docker 总结和面试题整理
- Docker网络
- Google 开源 Docker 镜像差异分析工具 container
- Docker在企业中的应用现状报告
- docker-容器启动入门
- 《Docker教程》翻译邀请
- 使用 Docker 轻松安装 MySQL 数据库(docker安装mysql)
- 的docker容器创建并使用Docker容器启动Redis数据库(创建并启动名为redis)