克隆项目
想要运行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