制作自己的镜像

    |     2023年9月13日   |   Java技术, web前端技术   |     0 条评论   |    155

 

1.Wsl2安装CentOS7

2.Docker 简介和安装

3.Docker 快速安装软件

4.制作自己的镜像

5.Docker-Compose发布与部署

1695908720839

为自己的 Web 项目构建镜像

示例项目代码:https://github.com/gzyunke/test-docker

示例项目代码: D:\projects\workspace_web\GuoguWebadmin

这是一个 Nodejs + express 写的 后端接口 项目软件依赖:nodejs项目依赖库:express …

编写 Dockerfile

FROM node:14
MAINTAINER easydoc.net
​
# 复制代码
ADD . /app
​
# 设置容器启动后的默认运行目录
WORKDIR /app
​
# 运行命令,安装依赖
# RUN 命令可以有多个,但是可以用 && 连接多个命令来减少层级。
# 例如 RUN npm install && cd /app && mkdir logs
RUN npm install --registry=https://registry.npm.taobao.org
​
# CMD 指令只能一个,是容器启动后执行的命令,算是程序的入口。
# 如果还需要运行其他命令可以用 && 连接,也可以写成一个shell脚本去执行。
# 例如 CMD cd /app && ./start.sh
CMD node app.js

Dockerfile文档

实用技巧:如果你写 Dockerfile 时经常遇到一些运行错误,依赖错误等,你可以直接运行一个依赖的底,然后进入终端进行配置环境,成功后再把做过的步骤命令写道 Dockerfile 文件中,这样编写调试会快很多。例如上面的底是node:11,我们可以运行docker run -it -d node:11 bash,跑起来后进入容器终端配置依赖的软件,然后尝试跑起来自己的软件,最后把所有做过的步骤写入到 Dockerfile 就好了。掌握好这个技巧,你的 Dockerfile 文件编写起来就非常的得心应手了。

Build 为镜像(安装包)和运行

编译 docker build -t test:v1 .

-t 设置镜像名字和版本号命令参考:https://docs.docker.com/engine/reference/commandline/build/

运行 docker run -p 8080:8080 --name test-hello test:v1

-p 映射容器内端口到宿主机--name 容器名字-d 后台运行命令参考文档:https://docs.docker.com/engine/reference/run/

目录挂载

现存问题

  • 使用 Docker 运行后,我们改了项目代码不会立刻生效,需要重新buildrun,很是麻烦。

  • 容器里面产生的数据,例如 log 文件,数据库备份文件,容器删除后就丢失了。

几种挂载方式

  • bind mount 直接把宿主机目录映射到容器内,适合挂代码目录和配置文件。可挂到多个容器上

  • volume 由容器创建和管理,创建在宿主机,所以删除容器不会丢失,官方推荐,更高效,Linux 文件系统,适合存储数据库数据。可挂到多个容器上

  • tmpfs mount 适合存储临时文件,存宿主机内存中。不可多容器共享。

文档参考:https://docs.docker.com/storage/

挂载演示

bind mount 方式用绝对路径 -v D:/code:/app

volume 方式,只需要一个名字 -v db-data:/app

示例:docker run -p 8080:8080 --name test-hello -v D:/code:/app -d test:v1

注意! 因为挂载后,容器里的代码就会替换为你本机的代码了,如果你代码目录没有node_modules目录,你需要在代码目录执行下npm install --registry=https://registry.npm.taobao.org确保依赖库都已经安装,否则可能会提示“Error: Cannot find module ‘koa’” 如果你的电脑没有安装 nodejs,你需要安装一下才能执行上面的命令。

多容器通信

学习目标

项目往往都不是独立运行的,需要数据库、缓存这些东西配合运作。这节我们把前面的 Web 项目增加一个 Redis 依赖,多跑一个 Redis 容器,演示如何多容器之间的通信。

创建虚拟网络

要想多容器之间互通,从 Web 容器访问 Redis 容器,我们只需要把他们放到同个网络中就可以了。

文档参考:https://docs.docker.com/engine/reference/commandline/network/

1695908720839

演示

创建一个名为test-net的网络:

docker network create test-net

运行 Redis 在 test-net 网络中,别名redis

docker run -d --name redis --network test-net --network-alias redis redis:latest

转载请注明来源:制作自己的镜像
回复 取消