容器化一个App
获取示例程序
├── getting-started-app/
│ ├── package.json
│ ├── README.md
│ ├── spec/
│ ├── src/
│ └── yarn.lock
创建App的镜像
创建镜像需要使用Dockerfile。Dockerfile是一个文本文件,没有扩展名,内容包含脚本命令。Docker使用这些指令创建镜像。
- 在
getting-started-app
目录下,也就是package.json
文件所在的目录下,创建一个文件,名称为Dockerfile
。
$ cd /path/to/getting-started-app
$ touch Dockerfile
- 编辑
Dockerfile
,添加如下内容
# syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
- 使用如下命令创建镜像
$ cd /path/to/getting-started-app
$ docker build -t getting-started .
docker build
命令使用Dockerfile创建一个新的镜像。你可能注意到了Docker下载了很多的层。这是因为在你命令里,创建工作从node:18-alpine
这个镜像开始。但是,你本地没有这个镜像,所以,Docker需要从注册中心下载。
当Docker下载镜像完成之后,Dockerfile中的命令将会复制到你的程序之中,然后,执行yarn
,下载程序的依赖。CMD
指令指定当容器启动之后默认执行的命令。
最后,-t
选项,给新镜像命名。你给镜像命名为getting-started
,随后,你就可以用这个名称启动容器。
在docker build
命令最后的这个.
,告诉Docker,让它在当前目录查找Dockerfile
。
启动容器
现在已经制作好了镜像,你可以使用docker run
命令在容器中运行这个程序。
- 使用刚才指定的镜像名,通过
docker run
运行程序。
$ docker run -dp 127.0.0.1:3000:3000 getting-started
这个-d
选项(–detach)会导致容器在后台运行。这意味着,Docker启动了你的容器,然后返回到命令行窗口。你可以通过执行docker ps
命令查看容器是否启动。
这个-p
选项(–publish)创建了一个主机和容器之间端口的映射。-p
选项的值的格式为HOST:CONTAINER
,其中HOST
是主机的地址,CONTAINER
是容器的端口。这个命令开放了容器的端口3000给127.0.0.1:3000(localhost:3000)。没有这个映射,你不能在宿主机访问容器内的程序。
注意,你现在如果在跟宿主机同一网络的外部的机器上是访问失败的,你需要修改命令
docker run -dp 3000:3000 getting-started
。
- 随后,你就可以访问 http://localhost:3000,你将会看到下面的效果
- 添加一项或几项,看看它运行的怎么样。你可以标记一项为已完成,或者删除它。
你如果看一下你的容器,你将看到至少有一个在端口3000上运行着的容器使用了getting-started
镜像。你可以执行如下命令查看你的容器。
$ docker ps
将输出以下内容
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8abacc5b4c5 getting-started "docker-entrypoint.s…" 28 minutes ago Up 4 minutes 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp optimistic_ellis
总结
这篇文章,我们学习了利用Dockerfile创建镜像的基本方法。一旦你创建好了镜像,你就可以用它运行容器。
下一篇文章,我们来学习当你修改了程序,如果创建一个新的镜像更新运行中的容器,你还会学到更多的命令。