docker学习系列16 使用过程的一些经验总结
- COPY 和 ADD 命令具有相同的特点:只复制目录中的内容而不包含目录自身。
比如 backend 目录的结构如下:
--- backend -- model -- controller
如果执行
WORKDIR /app COPY backend .
容器内app底下会是model和controller目录,并不是backend目录。
如果要拷贝整个目录,应该:COPY backend ./backend
- 如果修改了 Dockerfile,记得要重新执行build,即生成新的镜像。这样启动后才能看到效果。
- 打包node项目中的node_modules问题。
某node项目结构:
src node_modules package.json package-lock.json
dockerfile部分代码
FROM node:8.12-alpine RUN mkdir -p /app WORKDIR /app COPY package.json . COPY package-lock.json . RUN npm install ...
我们在容器内生成了项目所依赖的node_modules文件。这是docker的build阶段。
之后在run启动阶段时,在mouted共享目录时要特别小心,如果挂载整个项目,容器内的node_modules会被项目中的覆盖。
最好把需要挂载的文件单独放到一个目录中。
- 关于项目目录是挂载好,还是COPY ADD好,stackoverflow上有人也问过
- COPY/ADD 文件是镜像的一部分,在docker构建阶段执行。比较适合项目的生产环境,比如自动化。对于成熟稳定的项目,把编译后的可以直接运行的代码打包进镜像内也利于分发。
- volumn 是在docker运行阶段,本地文件变化能方便的反应到容器中,比较适合项目的开发阶段。
要根据实际情况,挂载可以节省空间,便于修改。如果是想文件COPY到容器,每次修改文件都需要重新制作镜像。
- 关于 docker-compose,对于镜像的版本,数据库密码等不建议直接写死到 docker-compose.yml 中,可以新建.env文件。
docker-compose部分
mysql: build: ./docker-build/mysql ports: - "33060:3306" volumes: - ./docker-build/mysql/data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: ${DOCKER_MYSQL_PASSPORD-123456}
.env文件DOCKER_MYSQL_PASSPORD=mypassord
比如下面的${DOCKER_MYSQL_PASSPORD-123456}
表示优先去.env
文件找定义的key值,如果没有则使用默认值,即123456。
docker-compose.yml 受版本控制,.env不受。更多细节参考
- 在 Laravel 项目中,如果数据库跑在容器里,在宿主机直接执行
php aritsan
是不行的,
需要进到容器里执行,或者在宿主机执行docker-compose exec <mycontainer> php artisan
或者是docker exec -it <mycontainer> php artisan
- 如果php项目用的nginx的php-fpm容器,想重启php-fpm,容器内使用
kill -USR2 1
,容器外执行docker exec -it <mycontainer> kill -USR2 1
\ - docker-compose down要慎用,他会销毁所有容器和网络等。如果你之前在容器里修改过文件,都会没有。当然docker也不推荐直接在容器动手脚,建议写个shell脚本,启动之后在容器内执行。
- 还是 mysql 数据库问题,如果容器启动了 mysql,之后通过配置修改了密码,可能会造成重新连接后死活显示"Access denied"。
这是因为如果建立了共享卷volume,里面存的还是老的user信息,需要docker-compose rm -v
清除卷然后重连。 - 删除日志
find /var/lib/docker/containers/ -type f -name "*.log" -delete
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
AWS Fargate告诉你:什么是容器即服务
本文翻译自:Freecodecamp, 原文地址:An intro to Amazon Fargate: what it is, why it’s awesome (and not), and when to use it, 英文原作者为 Emmanuel Marboeuf 当亚马逊在2017年底的AWS re:Invent大会上和EKS一起宣布 Fargate的时候,它还备受冷落,当时我所关注的博客和大佬只是轻描淡写地说: 哦,有这么个新玩意,它将允许ECS用户直接在云中运行容器。 作为开发人员,这真的让我大吃一惊。让我们看看为什么。 解放生产力 我觉得软件开发领域已有五次重大革命,大大提高了开发者的工作效率,并以最高效率编写与部署应用。他们都解决了一系列的重大问题: 云服务(IaaS)的出现:解决了基础架构的成本和可扩展性问题 开源社区,会议,工作坊,技术博客,StackOverflow等:让知识惠及到更多人 版本控制系统,协作工具,持续集成工具 解决了项目的并行开发和集成问题 容器化架构 无服务器计算服务(PaaS) 降低服务器和系统管理成本 这些革命中的都有一个共同特点:它们都...
- 下一篇
玩转神龙服务器的Hyper-V虚拟化网络之 配置直通网卡
在上一篇 玩转神龙服务器的Hyper-V虚拟化网络之 配置NAT网络 的文章中我们使用NAT的方式使Hyper-V VM可以访问公网。在这一篇里,我们会使用直通网卡的特性来使VM有对外提供服务的功能。 前置条件 神龙服务器,一块主网卡。另外,需要创建额外的辅助网卡,并创建EIP绑定到此辅助网卡。需要创建多少VM,就要创建多少辅助网卡和EIP。 安装Hyper-V Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All 运行完后会自动重启两次。 创建虚拟机 这里我预先Copy了阿里云的镜像VHD文件win2016_64_dtc_1607_en-us_40G_noxen_20180801.vhd放在了D盘。我会为每一个虚拟机新建一个基于此VHD的差异磁盘。 $
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境