一个小时学会Docker(开源的应用容器引擎)
一、概要
1.1 为什么需要 Docker
在软件开发的世界里,环境一致性是个永恒的挑战。开发者在本地开发的应用,往往在部署到测试或生产环境时出现问题,这就是所谓的“在我的机器上可以运行”的困境。Docker 的出现,通过容器化技术,将应用及其依赖打包在一起,确保了在任何环境下的一致性,从而解决了这一问题。此外,Docker 还提供了资源隔离和快速部署的能力,使得开发和运维工作更加高效。
常规应用开发部署方式:自己在 Windows 上开发、测试 --> 到 Linux 服务器配置运行环境部署。
问题:我机器上跑都没问题,怎么到服务器就各种问题了
用 Docker 开发部署流程:自己在 Windows 上开发、测试 --> 打包为 Docker 镜像(可以理解为软件安装包) --> 各种服务器上只需要一个命令部署好
优点:确保了不同机器上跑都是一致的运行环境,不会出现我机器上跑正常,你机器跑就有问题的情况。
1.2 什么是 Docker
Docker 是一个开源的应用容器引擎,它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 是一个应用打包、分发、部署的工具
你也可以把它理解为一个轻量的虚拟机,它只虚拟你软件需要的运行环境,多余的一点都不要,
而普通虚拟机则是一个完整而庞大的系统,包含各种不管你要不要的软件。
1.3 跟普通虚拟机的对比
虚拟机(VM)通过模拟硬件来运行完整的操作系统,而 Docker 容器则是直接运行在宿主机的操作系统上,共享宿主机的内核。因此,Docker 容器比虚拟机更轻量,启动更快,资源消耗更少。简单来说,如果你把虚拟机比作完整的旅行大巴,那么 Docker 容器就像是一辆轻便的自行车,都能带你到达目的地,但后者更加高效和便捷。
特性 | 普通虚拟机 | Docker |
---|---|---|
跨平台 | 通常只能在桌面级系统运行,例如 Windows/Mac,无法在不带图形界面的服务器上运行 | 支持的系统非常多,各类 windows 和 Linux 都支持 |
性能 | 性能损耗大,内存占用高,因为是把整个完整系统都虚拟出来了 | 性能好,只虚拟软件所需运行环境,最大化减少没用的配置 |
自动化 | 需要手动安装所有东西 | 一个命令就可以自动部署好所需环境 |
稳定性 | 稳定性不高,不同系统差异大 | 稳定性好,不同系统都一样部署方式 |
1.4 Docker 的特点与优势
- 轻量级:Docker 容器直接运行在宿主机的操作系统上,不需要额外的操作系统,因此比虚拟机更节省资源。
- 快速部署:容器启动几乎是即时的,相比虚拟机的启动时间大大缩短。
- 一致性:确保开发、测试和生产环境的一致性,减少“在我的机器上可以运行”的问题。
- 可移植性:容器可以在任何安装了 Docker 的系统上运行,无论是开发、测试还是生产环境。
- 隔离性:每个容器都是独立的,一个容器的故障不会影响其他容器。
- 可扩展性:可以轻松地将应用扩展到多个容器,实现负载均衡和服务的高可用性。
1.5 Docker 通常用来做什么
Docker 被广泛应用于以下领域:
- 开发与测试:提供一致的开发环境,简化测试流程。
- 持续集成/持续部署(CI/CD):自动化应用的构建、测试和部署过程。
- 微服务架构:支持微服务的部署和管理,使得服务更加模块化和易于维护。
- 云计算和数据中心:容器化的应用更容易在云环境中部署和管理,提高了资源的利用率和应用的弹性。
1.6 Docker 中名词解释
- 镜像(Image):Docker 镜像是容器的模板。镜像包含了文件系统和应用运行所需的所有内容。
- 容器(Container):容器是镜像运行时的实例。容器可以创建、启动、停止、删除。
- 仓库(Repository):仓库是集中存放镜像文件的地方。Docker Hub 是最著名的公共仓库。
- Dockerfile:Dockerfile 是一种脚本,包含了从基础镜像开始,如何构建一个新的 Docker 镜像的指令。
- 端口映射(Port Mapping):端口映射允许你将容器内部的端口映射到宿主机的端口,从而能够访问运行在容器内部的应用。
- 卷(Volume):卷是 Docker 中用于数据持久化和共享的一种机制。它可以在容器之间共享和重用数据。
- 打包:就是把你软件运行所需的依赖、第三方库、软件打包到一起,变成一个安装包
- 分发:你可以把你打包好的“安装包”上传到一个镜像仓库,其他人可以非常方便的获取和安装
- 部署:拿着“安装包”就可以一个命令运行起来你的应用,自动模拟出一摸一样的运行环境,不管是在 Windows/Mac/Linux。
1.7 Docker 学习资料
为了帮助您更好地学习和掌握 Docker,这里为您整理了一些重要的学习资源,包括官方网站、中文学习网站以及官方文档等。
-
Docker 官方网站
官方网站是学习 Docker 的最佳起点,提供了最新的信息、教程和文档。您可以在这里找到从基础到高级的各种资源。
Docker 官方网站 -
Docker 官方文档
官方文档详细介绍了 Docker 的所有功能和使用方法,是深入学习 Docker 的重要资源。
Docker 官方文档 -
Docker Hub
Docker Hub 是 Docker 官方的镜像仓库,您可以在这里找到成千上万的预构建镜像,以及由社区维护的各种工具和应用。
Docker Hub - Docker中文网
- https://www.docker.org.cn/
通过这些资源的学习和实践,您将能够更快地掌握 Docker 的使用技巧,提高软件开发和部署的效率。记得在学习过程中多动手实践,这是掌握 Docker 最快的方式。
二、Docker安装
2.1、安装地址
桌面版:https://www.docker.com/products/docker-desktop
服务器版:https://docs.docker.com/engine/install/#server
2.2、启动报错解决
报错截图
解决方法:
控制面板->程序->启用或关闭 windows 功能,开启 Windows 虚拟化和 Linux 子系统(WSL2)
命令行安装 Linux 内核wsl.exe --install -d Ubuntu
你也可以打开微软商店 Microsoft Store 搜索 Linux 进行安装,选择一个最新版本的 Ubuntu 或者 Debian 都可以
上面命令很可能你安装不了,微软商店你也可能打不开,如果遇到这个问题,参考:https://blog.csdn.net/qq_42220935/article/details/104714114
设置开机启动 Hypervisorbcdedit /set hypervisorlaunchtype auto
注意要用管理员权限打开 PowerShell
设置默认使用版本2wsl.exe --set-default-version 2
查看 WSL 是否安装正确wsl.exe --list --verbose
应该如下图,可以看到一个 Linux 系统,名字你的不一定跟我的一样,看你安装的是什么版本。
并且 VERSION 是 2
确保 BIOS 已开启虚拟化,下图检查是否已开启好
如果是已禁用,请在开机时按 F2 进入 BIOS 开启一下,不会设置的可以网上搜索下自己主板的设置方法,Intel 和 AMD 的设置可能稍有不同
出现下图错误,点击链接安装最新版本的 WSL2
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
2.3、镜像加速源
镜像加速器 | 镜像加速器地址 |
---|---|
Docker 中国官方镜像 | https://registry.docker-cn.com |
DaoCloud 镜像站 | http://f1361db2.m.daocloud.io |
Azure 中国镜像 | https://dockerhub.azk8s.cn |
科大镜像站 | https://docker.mirrors.ustc.edu.cn |
阿里云 | https://ud6340vz.mirror.aliyuncs.com |
七牛云 | https://reg-mirror.qiniu.com |
网易云 | https://hub-mirror.c.163.com |
腾讯云 | https://mirror.ccs.tencentyun.com |
"registry-mirrors": ["https://registry.docker-cn.com"]
三、Docker 快速安装软件
3.1、直接安装的缺点
- 安装麻烦,可能有各种依赖,运行报错。例如:WordPress,ElasticSearch,Redis,ELK
- 可能对 Windows 并不友好,运行有各种兼容问题,软件只支持 Linux 上跑
- 不方便安装多版本软件,不能共存。
- 电脑安装了一堆软件,拖慢电脑速度。
- 不同系统和硬件,安装方式不一样
3.2、Docker 安装的优点
- 一个命令就可以安装好,快速方便
- 有大量的镜像,可直接使用
- 没有系统兼容问题,Linux 专享软件也照样跑
- 支持软件多版本共存
- 用完就丢,不拖慢电脑速度
- 不同系统和硬件,只要安装好 Docker 其他都一样了,一个命令搞定所有
3.3、演示 Docker 安装 Redis
Redis 官网:https://redis.io/
官网下载安装教程只有源码安装方式,没有 Windows 版本。想要自己安装 windows 版本需要去找别人编译好的安装包。
Docker 官方镜像仓库查找 Redis :https://hub.docker.com/
一个命令跑起来:docker run -d -p 6379:6379 --name redis redis:latest
docker run: 这是Docker命令行工具的基本命令之一,用于创建一个新的容器并运行一个镜像。
-d: 这个参数代表"detached",意味着容器将在后台运行。也就是说,一旦容器启动,命令行会立即返回,不会显示容器的输出。
-p 6379:6379: 这个参数用于端口映射。-p后面跟着的是两组数字,中间用冒号分隔。第一组数字是宿主机(也就是运行Docker的机器)上的端口,第二组数字是容器内部的端口。在这个例子中,宿主机的6379端口被映射到容器的6379端口上。这意味着,你可以通过访问宿主机的6379端口来与容器内的Redis服务进行通信。
--name redis: 这个参数用于给创建的容器指定一个名称。在这个例子中,容器的名称被设置为"redis"。这样做可以让你之后更方便地引用这个容器,而不需要记住容器的ID。
redis:latest: 这是要运行的Docker镜像的名称及标签。"redis"是镜像的名称,而"latest"是一个标签,代表要运行的是这个镜像的最新版本。Docker会自动从Docker Hub(一个公共的镜像仓库)拉取这个镜像,如果本地没有的话。
命令参考:https://docs.docker.com/engine/reference/commandline/run/
3.4、安装 Wordpress
docker-compose.yml
version: '3.1'
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- wordpress:/var/www/html
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql
volumes:
wordpress:
db:
3.5、安装 ELK
docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --name elk sebp/elk
内存不够解决方法
转到用户目录 cd ~
,路径类似这个:C:\Users\<UserName>
创建 .wslconfig
文件填入以下内容
[wsl2]
memory=10GB # Limits VM memory in WSL 2 to 4 GB
processors=2 # Makes the WSL 2 VM use two virtual processors
生效配置,命令行运行 wsl --shutdown
3.6、更多相关命令
docker ps
查看当前运行中的容器docker images
查看镜像列表docker rm container-id
删除指定 id 的容器docker stop/start container-id
停止/启动指定 id 的容器docker rmi image-id
删除指定 id 的镜像docker volume ls
查看 volume 列表docker network ls
查看网络列表
四、镜像制作
4.0、docker build详细
以下是关于 docker build
命令的详细说明,包括其用途、语法、常用选项以及一些示例。
用途
docker build
命令是 Docker 核心功能之一,用于根据指定的 Dockerfile 文件创建新的 Docker 镜像。Dockerfile 是一个文本文件,包含了一系列的指令和参数,用于定义如何构建镜像。
语法
docker build [OPTIONS] PATH | URL | -
在这里,OPTIONS
是可以传递给 docker build
命令的参数,PATH
是包含 Dockerfile 的本地文件路径,URL
是指向 Dockerfile 的远程地址,而 -
表示从 STDIN 读取 Dockerfile 内容。
常用选项
--build-arg=[]
: 设置镜像创建时的变量。--cpu-shares
: 设置 CPU 使用权重。--cpu-period
: 限制 CPU CFS 周期。--cpu-quota
: 限制 CPU CFS 配额。--cpuset-cpus
: 指定使用的 CPU id。--cpuset-mems
: 指定使用的内存 id。--disable-content-trust
: 忽略校验,默认开启。-f
或--file
: 指定要使用的 Dockerfile 路径。--force-rm
: 强制删除中间容器。--isolation
: 使用容器隔离技术。--label=[]
: 设置镜像使用的元数据。-m
或--memory
: 设置内存最大值。--memory-swap
: 设置 Swap 的最大值为内存+swap,"-1" 表示不限 swap。--no-cache
: 创建镜像的过程不使用缓存。--pull
: 尝试去更新镜像的新版本。--quiet
或-q
: 安静模式,成功后只输出镜像 ID。--rm
: 设置镜像成功后删除中间容器。--shm-size
: 设置 /dev/shm 的大小,默认值是 64M。--squash
: 将 Dockerfile 中所有的操作压缩为一层。--tag
或-t
: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。--network
: 在构建期间设置 RUN 指令的网络模式。
示例
-
使用当前目录的 Dockerfile 创建镜像,标签为
runoob/ubuntu:v1
。docker build -t runoob/ubuntu:v1 .
-
使用 URL
github.com/creack/docker-firefox
的 Dockerfile 创建镜像。docker build github.com/creack/docker-firefox
-
通过指定 Dockerfile 文件的位置和构建上下文来创建镜像。
docker build -f /path/to/a/Dockerfile .
-
使用标签、删除中间容器等选项创建镜像。
docker build -t bjc/demo:latest --rm .
其他注意事项
- 在构建镜像之前,Docker 会对 Dockerfile 进行语法检查。如果存在语法错误,构建过程将停止,并返回错误信息。
- 构建镜像时,可以通过
.
表示当前目录作为构建上下文,或者使用其他路径。 - 构建过程中,可以通过
--no-cache
选项来避免使用之前的构建缓存,以便捕获最新的文件变化。 - 使用
--label
选项可以为镜像添加元数据,这些元数据可以用于分类、搜索和过滤镜像。
通过上述信息,您应该能够更深入地理解 docker build
命令,并有效地使用它来创建 Docker 镜像。
4.1、docker run命令详细
docker run
是 Docker 命令行中非常核心的一个命令,用于创建一个新的容器并运行一个镜像,或者在已经存在的容器上执行命令。以下是关于 docker run
命令的详细说明,包括其常用选项和一些典型使用场景。
基本语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS
:可以传递给docker run
命令的参数。IMAGE
:指定要运行的镜像名称。COMMAND
:在容器内运行的命令。ARG...
:传递给命令的参数。
常用选项
-d
或--detach
:后台运行容器,并返回容器ID。--name
:为容器指定一个名称。-p
或--publish
:端口映射,将容器的端口映射到宿主机的端口。-e
或--env
:设置环境变量。-v
或--volume
:挂载卷,将宿主机的文件或目录挂载到容器中。--restart
:容器退出时的重启策略,如no
、on-failure
、always
等。--cpus
:限制容器使用的 CPU 核心数。--memory
或-m
:设置容器可以使用的最大内存量。--net
:指定容器的网络连接方式,如bridge
、host
、none
、container
等。--detach-keyboard
:当容器是前台运行的交互式容器时,允许您通过按下Ctrl-q
来分离容器。--tty
或-t
:分配一个伪终端,通常与--detach-keyboard
一起使用。--entrypoint
:覆盖容器的默认入口点。--user
或-u
:指定运行容器时的用户身份。
典型使用场景
-
运行一个简单的容器:
docker run -d --name my_container my_image
这个命令会创建并运行一个名为
my_container
的容器,使用my_image
镜像,并在后台运行。 -
映射端口:
docker run -d --name my_container -p 8080:80 my_image
这个命令会将容器的80端口映射到宿主机的8080端口。
-
设置环境变量:
docker run -d --name my_container -e "VAR=value" my_image
这个命令会在容器中设置一个名为
VAR
的环境变量,值为value
。 -
挂载卷:
docker run -d --name my_container -v /path/on/host:/path/in/container my_image
这个命令会将宿主机的
/path/on/host
目录挂载到容器的/path/in/container
目录。 -
限制资源:
docker run -d --name my_container --cpus="1.5" --memory="2g" my_image
这个命令会限制容器最多只能使用1.5个CPU核心和2GB的内存。
-
运行交互式容器:
docker run -it --name my_container my_image /bin/bash
这个命令会启动一个交互式的 bash 会话,允许您在容器内部执行命令。
注意事项
- 当使用
docker run
命令时,确保您有权限访问指定的镜像。 - 使用
docker run
时,可以通过--network
选项来控制容器的网络隔离。 - 如果您需要频繁地运行相同的命令,可以考虑使用
docker-compose
来管理您的容器和服务。 - 在生产环境中,建议使用
--restart
策略来确保服务的高可用性。
通过上述信息,您应该能够更深入地理解 docker run
命令,并有效地使用它来创建和管理 Docker 容器。
4.1、什么是dockerfile?
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile
中的指令自动生成映像。
docker build
命令用于从Dockerfile构建映像。可以在docker build
命令中使用-f
标志指向文件系统中任何位置的Dockerfile。
例:
docker build -f -t /path/to/a/Dockerfile registry:v1.0.1
4.2、Dockerfile的基本结构
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。
4.3、Dockerfile文件说明
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#
字符开头则被视为注释。可以在Docker文件中使用RUN
,CMD
,FROM
,EXPOSE
,ENV
等指令。
在这里列出了一些常用的指令。
FROM:指定基础镜像,必须为第一个命令
格式:
FROM
FROM
:
FROM
@
示例:
FROM mysql:5.6
注:
tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
MAINTAINER: 维护者信息
格式:
MAINTAINER
示例:
MAINTAINER zhangsan
MAINTAINER tom@163.com
MAINTAINER zhangsan <tom@163.com>
RUN:构建镜像时执行的命令
RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
shell执行
格式:
RUN
exec执行
格式:
RUN ["executable", "param1", "param2"]
示例:
RUN ["executable", "param1", "param2"]
RUN apk update
RUN ["/etc/execfile", "arg1", "arg1"]
注:
RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
ADD:将本地文件添加到容器中,tar类型文件会自动解压,可以访问网络资源,类似wget
格式:
ADD ...
ADD ["",... ""] 用于支持包含空格的路径
示例:
ADD hom* /mydir/ # 添加所有以"hom"开头的文件
ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"
ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
CMD:构建容器后调用,也就是在容器启动时才进行调用。
格式:
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
示例:
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]
注:
CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
docker run
docker run
LABEL:用于为镜像添加元数据
格式:
LABEL = = = ...
示例:
LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
注:
使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
ENV:设置环境变量
格式:
ENV
ENV = ...
示例:
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat fluffy
EXPOSE:指定于外界交互的端口
docker run
-P
VOLUME:用于指定持久化目录
格式:
VOLUME ["/path/to/dir"]
示例:
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
注:
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1 卷可以容器间共享和重用
2 容器并不一定要和其它容器共享卷
3 修改卷后会立即生效
4 对卷的修改不会对镜像产生影响
5 卷会一直存在,直到没有任何容器在使用它
WORKDIR:工作目录,类似于cd命令
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
注:
通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run
运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
格式:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
示例:
USER www
注:
使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run
运行容器时,可以通过-u参数来覆盖所指定的用户。
ARG:用于指定传递给构建运行时的变量
格式:
ARG [=]
示例:
ARG site
ARG build_user=www
ONBUILD:用于设置镜像触发器
格式:
ONBUILD [INSTRUCTION]
示例:
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
注:
当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
以下是一个小例子:
# This my first nginx Dockerfile
# Version 1.0
# Base images 基础镜像
FROM centos
#MAINTAINER 维护者信息
MAINTAINER zhangsan
#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#ADD 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/
#RUN 执行以下命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www
#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
RUN echo "daemon off;" >> /etc/nginx.conf
#EXPOSE 映射端口
EXPOSE 80
#CMD 运行以下命令
CMD ["nginx"]
解释常用指令的意义
Dockerfile 文件中还是其它参数,参考:http://www.docker.org.cn/dockerppt/114.html
4.4、打包简单的前端项目
1、创建一个新项目,npm init -y
2、创建一个index.js文件,充当一个web服务器
//依赖一个http模块,相当于java中的import,与C#中的using var http = require("http"); //创建一个服务器对象 server = http.createServer(function (req, res) { //设置请求成功时响应头部的MIME为纯文本 res.writeHeader(200, { "Content-Type": "text/html" }); //向客户端输出字符 res.end("<h2>Hello Docker!!!\n</h2>"); }); //让服务器监听本地8000端口开始运行 server.listen(8000, "0.0.0.0"); console.log("server is runing at 0.0.0.0:8000");
要特别注意的是IP地址要选择0.0.0.0而不是127.0.0.1,因为127.0.0.1是监听本机,容器外无法访问
3、编写Dockerfile文件
# 使用Node.js官方镜像作为基础镜像
FROM node:lts-alpine
LABEL author="zhangguo"
# 设置工作目录
WORKDIR /app
# 添加文件到工作目录
COPY . .
# 暴露端口
EXPOSE 8000
# 启动命令
CMD ["node", "index.js"] && tail -f /dev/null
4、构建镜像文件
docker build -t dd02:v2 .
5、将本地镜像部署在容器中运行
docker run --name dd02-hellodocker -p 8000:8000 dd02:v2
6、运行效果
4.5、打包前端vite项目示例
1、创建一个vite vue项目
npm create vite@latest
2、本地测试运行
pnpm i
3、创建Dockerfile文件
# 使用Node.js官方镜像作为基础镜像
FROM node:lts-alpine
# 设置容器内的工作目录
WORKDIR /app
# 将package.json和package-lock.json复制到工作目录
COPY package*.json ./
# 安装项目依赖
RUN npm install
# 将项目文件复制到工作目录
COPY . .
# 若需要,可以运行构建脚本
RUN npm run build
# 开放8080端口供容器外部访问
EXPOSE 8080
# 运行Vite前端服务器
CMD ["npm", "run", "dev"]
4、打包成本地镜像
docker build -t vitedemo:v1 .
cannot replace to directory /var/lib/docker/overlay2/yqtfh4ukqct3pq9g36h7kqfrr/merged/app/node_modules/@vitejs/plugin-vue with file
打包前删除node_modules目录
5、运行到容器中
docker run -d -p 5173:5173 vitedemo:v1
虽然运行成功,但访问不到
原因是因为没有对外暴露IP,修改package.json文件,如下:
"scripts": {
"dev": "vite --host 0.0.0.0",
"build": "vue-tsc && vite build",
"preview": "vite preview"
},
#父镜像,Node.js的长期支持(LTS)版本,并且使用了Alpine Linux作为操作系统基础
FROM node:lts-alpine
#设置当前工作目录
WORKDIR /app
#复制package.json和package-lock.json到工作目录
COPY package*.json .
#安装pnpm
RUN npm install pnpm -g --registry=https://registry.npmmirror.com
#安装依赖
RUN pnpm install
#复制所有文件到工作目录
COPY . .
#暴露端口
EXPOSE 5173
#启动命令
CMD ["npm", "run","dev"]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义