Administrator@DESKTOP-V8D67KJ ~/Desktop/Nodejs_Docker
$ docker build .[+] Building 2.0s (10/10) FINISHED
=>[internal] load build definition from Dockerfile 0.1s
=>=> transferring dockerfile: 32B 0.0s
=>[internal] load .dockerignore 0.1s
=>=> transferring context: 34B 0.0s
=>[internal] load metadata for docker.io/library/node:18-alpine3.15 1.6s
=>[internal] load build context 0.1s
=>=> transferring context: 98B 0.0s
=>[1/5] FROM docker.io/library/node:18-alpine3.15@sha256:cc01b1f106743660b64c19b5ed6668be7a6523f28229103af5e77c381f68babc 0.0s
=> CACHED [2/5] WORKDIR /Nodejs_Docker 0.0s
=> CACHED [3/5] COPY package.json .0.0s
=> CACHED [4/5] RUN npminstall0.0s
=> CACHED [5/5] COPY ..0.0s
=> exporting to image 0.1s
=>=> exporting layers 0.0s
=>=> writing image sha256:d5ba72249903ad72b9ef9bc1b9af607c564c4310182107c3c28d70d98a9fdc90 0.0s
# 查看镜像 要执行 docker image ls
Administrator@DESKTOP-V8D67KJ ~/Desktop/Nodejs_Docker
# 这里的 image 可以是复数 也可以 是下面那条命令
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none><none> d5ba72249903 8 hours ago 173MB
Administrator@DESKTOP-V8D67KJ ~/Desktop/Nodejs_Docker
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
<none><none> d5ba72249903 9 hours ago 173MB
此时的镜像是没有名字的 所以是 none
可以看到 这个镜像要比虚拟机小不知道要缩多少倍
使用 docker tag 来给镜像命名 只不过后面要加上镜像的ID 当有很少的镜像的时候可以偷懒只写 镜像 ID 的前几个字母
docker tag d5ba codervibe/Nodejs_Docker:v1.0
这个时候 出错了
Administrator@DESKTOP-V8D67KJ ~/Desktop/Nodejs_Docker
$ docker tag d5bacodervibe/NodejsDocker:v1.0:v1.0
Error parsing reference: "codervibe/NodejsDocker:v1.0" is not a valid repository/tag: invalid reference format: repository name must be lowercase
Error parsing reference: “codervibe/NodejsDocker:v1.0” is not a valid repository/tag: invalid reference format: repository name must be lowercase
这句报错的主要意思是 无效的参考格式:存储库名称必须为小写
Administrator@DESKTOP-V8D67KJ ~/Desktop/Nodejs_Docker
$ docker tag d5ba codervibe/nodejsdocker:v1.0
命名完成后 就会是这个样子
Administrator@DESKTOP-V8D67KJ ~/Desktop/Nodejs_Docker
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
codervibe/nodejsdocker v1.0 d5ba72249903 10 hours ago 173MB
Administrator@DESKTOP-V8D67KJ ~/Desktop/Nodejs_Docker
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.er ID, head over to https://hub.docker.com to create one.
Username: codervibe
Password: # 这里的密码输入是没有提示的 直接输入即可
Login Succeeded
Logging in with your password grants your terminal complete access to your account.
For better security, log in with a limited-privilege personal access token. Learn more at https://docs.docker.com/go/access-tokens/
使用 docker push 命令将镜像 推送到 Docker Hub
Administrator@DESKTOP-V8D67KJ ~/Desktop/Nodejs_Docker
$ docker push codervibe/nodejsdocker
Using default tag: latest
The push refers to repository [docker.io/codervibe/nodejsdocker]
tag does not exist: codervibe/nodejsdocker:latest
C:\Users\Administrator\Desktop\Nodejs_Docker>docker push codervibe/nodejsdocker:v1.0
The push refers to repository [docker.io/codervibe/nodejsdocker]
The push refers to repository [docker.io/codervibe/nodejsdocker]
2775f1c9b046: Pushed
a33a33455a09: Pushed
30abd3b96b2d: Pushed
b826e180ca43: Pushed
7873ffdc5975: Pushed
6c3b0ca38fdf: Pushed
2510f5d20f3d: Pushing [==>]8.301MB/153.7MB
34d5ebaa5410: Pushed
C:\Users\Administrator\Desktop\Nodejs_Docker>docker build -t eggimage:v1.0 .# 这里的镜像名称是我随便命名的 只是为了练习 -t 这个选项[+] Building 5.7s (11/11) FINISHED
=>[internal] load build definition from Dockerfile 0.2s
=>=> transferring dockerfile: 32B 0.1s
=>[internal] load .dockerignore 0.1s
=>=> transferring context: 34B 0.0s
=>[internal] load metadata for docker.io/library/node:18-alpine3.15 5.2s
=>[auth] library/node:pull token for registry-1.docker.io 0.0s
=>[1/5] FROM docker.io/library/node:18-alpine3.15@sha256:cd3a7004267e419477b 0.0s
=>[internal] load build context 0.0s
=>=> transferring context: 98B 0.0s
=> CACHED [2/5] WORKDIR /Nodejs_Docker 0.0s
=> CACHED [3/5] COPY package.json .0.0s
=> CACHED [4/5] RUN npminstall0.0s
=> CACHED [5/5] COPY ..0.0s
=> exporting to image 0.1s
=>=> exporting layers 0.0s
=>=> writing image sha256:d8644d361b47699737ba982baa6ebab28b52c67f37920e60fe 0.0s
=>=> naming to docker.io/library/eggimage:v1.0 0.0s
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
因为 docker 使用缓存来构建 所以速度会非常快
这时 使用 docker image ls 就可以查看了
C:\Users\Administrator\Desktop\Nodejs_Docker>docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
codervibe/nodejsdocker v1.0 d8644d361b47 2 hours ago 173MB
eggimage v1.0 d8644d361b47 2 hours ago 173MB
C:\Users\Administrator\Desktop\Nodejs_Docker>
既然已经推送到 Docker Hub 我就不想存在本地了
我们就可以使用 docker rmi 来删除镜像
如果镜像还在使用中 就需要用 -f 来 force 强制执行
-f 之后 要加上 镜像的名字
需要注意的 是 目前创建的两个镜像内容是一样的,因此 他们的 ID 也是一样的
也就是说 -f 后面 加上 镜像的名字 或者 镜像的 ID 都是可以的
C:\Users\Administrator\Desktop\Nodejs_Docker>docker rmi -f eggimage:v1.0
Untagged: eggimage:v1.0
C:\Users\Administrator\Desktop\Nodejs_Docker>docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
codervibe/nodejsdocker v1.0 d8644d361b47 2 hours ago 173MB
C:\Users\Administrator\Desktop\Nodejs_Docker>docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
codervibe/nodejsdocker v1.0 d8644d361b47 2 hours ago 173MB
C:\Users\Administrator\Desktop\Nodejs_Docker>docker rmi d8644d361b47
Untagged: codervibe/nodejsdocker:v1.0
Untagged: codervibe/nodejsdocker@sha256:1dadf1a34c48f2f48454aa831841d45a569182baf18b7a5370a9eef4d804461b
Deleted: sha256:d8644d361b47699737ba982baa6ebab28b52c67f37920e60fe98331b3636a127
如果想将镜像存储到本地 可以直接使用 docker pull 镜像名字
C:\Users\Administrator\Desktop\Nodejs_Docker>docker pull codervibe/nodejsdocker:v1.0
v1.0: Pulling from codervibe/nodejsdocker
9621f1afde84: Already exists
b2ff27170c03: Already exists
857f24243633: Already exists
f5234ba59f34: Already exists
5995d794dc7a: Already exists
cf24c846c22c: Already exists
9584af0953fe: Already exists
4eb143716138: Already exists
Digest: sha256:1dadf1a34c48f2f48454aa831841d45a569182baf18b7a5370a9eef4d804461b
Status: Downloaded newer image for codervibe/nodejsdocker:v1.0
docker.io/codervibe/nodejsdocker:v1.0
C:\Users\Administrator\Desktop\Nodejs_Docker>docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
codervibe/nodejsdocker v1.0 d8644d361b47 2 hours ago 173MB
C:\Users\Administrator\Desktop\Nodejs_Docker>docker run -d codervibe/nodejsdocker:v1.0
dfc4ee868b97972d42b4426ad84680baf1a751ae2cb71fdaec96215d86b7a975
但是我们要怎么确认我们的容器在运行呢?
这就需要用到 docker ps 命令
ps 表示 process status 的意思
这个命令的结果显示 容器ID 使用的镜像 以及端口号信息
C:\Users\Administrator\Desktop\Nodejs_Docker>docker run -d codervibe/nodejsdocker:v1.0
310912d64d40fb392601ff037996631a36617305161e01812eab7d68806d800a
C:\Users\Administrator\Desktop\Nodejs_Docker>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
310912d64d40 codervibe/nodejsdocker:v1.0 "docker-entrypoint.s…" 4 seconds ago Up 2 seconds 3000/tcp sweet_ganguly
C:\Users\Administrator\Desktop\Nodejs_Docker>docker run -d -p 3000:3000 codervibe/nodejsdocker:v1.0
5f09e5345f7c29ea6eade03124862ba43b348aa6a5c5b5e2b48612fbb4645914
如果要用别的端口也是可以的 只要端口不和其他应用冲突就好
此外 还可以 使用 --name 选项来给这个 docker 容器 指定一个名字
C:\Users\Administrator\Desktop\Nodejs_Docker>docker run -d-p3000:3000 --name codervib_nodejsdocker codervibe/nodejsdocker:v1.0
2263e077332dda2fc9ad656804d5de056cd9f8fa69c4b71081292df557e35f7b
如果不指定名字 docker 会自动给这个容器一个名字
再次 使用 docker ps 查看一下 运行的容器
C:\Users\Administrator\Desktop\Nodejs_Docker>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48c80a257409 codervibe/nodejsdocker:v1.0 "docker-entrypoint.s…"5 minutes ago Up 5 minutes 0.0.0.0:3000->3000/tcp busy_shamir
C:\Users\Administrator\Desktop\Nodejs_Docker>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8325df245b17 codervibe/nodejsdocker:v1.0 "docker-entrypoint.s…"4 seconds ago Up 3 seconds 3000/tcp, 0.0.0.0:3001->3001/tcp epic_johnson
48c80a257409 codervibe/nodejsdocker:v1.0 "docker-entrypoint.s…"15 minutes ago Up 15 minutes 0.0.0.0:3000->3000/tcp busy_shamir
C:\Users\Administrator\Desktop\Nodejs_Docker>docker stop 832832
C:\Users\Administrator\Desktop\Nodejs_Docker>docker ps-a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48c80a257409 codervibe/nodejsdocker:v1.0 "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:3000->3000/tcp busy_shamir
C:\Users\Administrator\Desktop\Nodejs_Docker>docker exec-it busy_shamir /bin/sh
/Nodejs_Docker #
/Nodejs_Docker # exit
C:\Users\Administrator\Desktop\Nodejs_Docker>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48c80a257409 codervibe/nodejsdocker:v1.0 "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:3000->3000/tcp busy_shamir
C:\Users\Administrator\Desktop\Nodejs_Docker>docker rm -f 48c80a25740
48c80a25740
C:\Users\Administrator\Desktop\Nodejs_Docker>docker rm-f codervibe_nodejsdocker
codervibe_nodejsdocker
C:\Users\Administrator\Desktop\Nodejs_Docker>npm i nodemon --save-dev
added 32 packages, and audited 90 packages in 2m
10 packages are looking for funding
run `npm fund`for details
found 0 vulnerabilities
C:\Users\Administrator\Desktop\Nodejs_Docker>
安装以后 package.json 文件 就会有更新
{"name":"nodejs_docker","version":"1.0.0","description":"","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":[],"author":"","license":"ISC","dependencies":{"express":"^4.18.2"},"devDependencies":{// 这里多了一个 nodemon"nodemon":"^2.0.20"}}
安装以后我们还要启动nodemon
因此在package.json 文件 中设置一下 执行命令
// 在此处 修改"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},// 修改为"scripts":{"test":"nodemon app.js"},// 如果是 windows 系统则修改为"scripts":{"test":"nodemon -L app.js"},// 即可
要用 nodemon 运行 因此需要修改一下 Dockerfile
FROM node:18-alpine3.15
WORKDIR /Nodejs_Docker
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node","app.js"]
也就是修改 CMD ["node","app.js"]这句话
将其修改为 CMD ["npm","run","dev"]
FROM node:18-alpine3.15
WORKDIR /Nodejs_Docker
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm","run","dev"]