使用Dockerfile构建一个可访问的Todolist Manager服务

使用Dockerfile构建一个可访问的Todolist Manager服务

克隆项目

想要运行Todolist Manager,首先要有这个代码,直接从github上克隆:

git clone https://github.com/docker/getting-started.git
Cloning into 'getting-started'...
remote: Enumerating objects: 446, done.
remote: Total 446 (delta 0), reused 0 (delta 0), pack-reused 446
Receiving objects: 100% (446/446), 3.59 MiB | 154.00 KiB/s, done.
Resolving deltas: 100% (222/222), done.

生成Dockerfile

cd getting-started/app/ 

进入到getting-started/app/
新建一个名为Dockerfile的文件,注意,这是没有后缀的
文件内容如下:

FROM node:12-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]

在这里插入图片描述

构建镜像

保存文件之后,使用docker build命令构建容器镜像

docker build -t getting-started .
Sending build context to Docker daemon  4.661MB
Step 1/5 : FROM node:12-alpine
12-alpine: Pulling from library/node

33c60a64: Pulling fs layer 
a3f5f08b: Pulling fs layer 
7ca7dc77: Pulling fs layer 
Digest: sha256:5d8b181a0738654bbe659a68879298f8d2d4256685282ee1c2330d97c33e3eee[3A
Status: Downloaded newer image for node:12-alpine
 ---> 5c6db76c80d7
Step 2/5 : WORKDIR /app
 ---> Running in bc5a8353b010
Removing intermediate container bc5a8353b010
 ---> 80e40c5762a1
Step 3/5 : COPY . .
 ---> ea0ca48611bb
Step 4/5 : RUN yarn install --production
 ---> Running in bf9b1a1f68b5
yarn install v1.22.5
[1/4] Resolving packages...
[2/4] Fetching packages...
info fsevents@1.2.9: The platform "linux" is incompatible with this module.
info "fsevents@1.2.9" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
[4/4] Building fresh packages...
Done in 98.88s.
Removing intermediate container bf9b1a1f68b5
 ---> 06108fa025a0
Step 5/5 : CMD ["node", "src/index.js"]
 ---> Running in c73931efd30f
Removing intermediate container c73931efd30f
 ---> 5151545479b4
Successfully built 5151545479b4
Successfully tagged getting-started:latest

结合上面的Dockerfile解释一下这个命令做了什么:

这个命令使用Dockerfile来构建新的容器镜像。会下载许多layer。这是因为我们指示构建者要从node:12-alpine镜像开始。但是,由于我们的计算机上没有该镜像,因此会下载该镜像。

下载镜像后,我们将其复制到应用程序中,并用于yarn安装应用程序的依赖项。CMD指令指定从该镜像启动容器时要运行的默认命令。

最后,该-t标记了我们的镜像。可以简单地将其视为最终镜像的易于理解的名称。由于我们将镜像命名为getting-started,因此在运行容器时可以引用该镜像。

在这个命令的结尾处是有个符号.的,告诉Docker应该在当前目录中查找Dockerfile

运行容器

使用docker run命令启动容器,并指定我们刚刚创建的镜像的名称:

docker run -dp 3000:3000 getting-started
eab6f792cac8bf7f2245770e3817775f0acbea1473f761b5e57de147e55320d0

-d是后台运行,因为不需要交互,所以没有指定-it,而是-d
-p是指定端口映射,创建主机端口3000到容器端口3000的映射。如果没有端口映射,我们就不能访问应用程序。:前面是主机端口号,后面是容器的端口号。
而将-d -p写成-dp是因为-d后面不接参数,这样些可以减少命令的长度,这种写法是被允许的。
返回的这串字符串eab6f792cac8bf7f2245770e3817775f0acbea1473f761b5e57de147e55320d0,就是启动的这个容器的ID

docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                    NAMES
eab6f792cac8   getting-started   "docker-entrypoint.s…"   50 seconds ago   Up 50 seconds   0.0.0.0:3000->3000/tcp   clever_kepler

可以看到容器已经启动,每个容器对应一个CONTAINER ID,我们要操作这个容器的话,就可以引用它的ID号。比如docker stop eab6f7,只需应用前面一小段字符即可,不需要整串ID

访问应用

既然应用已经启动,那么可以通过浏览器访问http://localhost:3000/来访问这个应用。
在这里插入图片描述

更新应用

如果需要跟新应用,只需要重新build镜像,然后重启容器就可以了。

docker build -t getting-started .

先将其停止、删除再运行一个新的容器
停止:

docker stop eab6f79

删除:

docker rm eab6f79

如果没有上面这两步,就会报错docker: Error response from daemon: driver failed programming external connectivity on endpoint laughing_burnell (eab6f792cac8bf7f2245770e3817775f0acbea1473f761b5e57de147e55320d0): Bind for 0.0.0.0:3000 failed: port is already allocated.。因为端口号已经被占用了。
要查看之前运行的容器的ID,可以使用docker ps查看。
运行:

docker run -dp 3000:3000 getting-started
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ayiya_Oese

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值