挑战Docker
Docker文档
安装Docker
获取Docker
テスト
docker run -d -p 80:80 docker/getting-started
-dフラグと-pフラグはポートマッピング。これがないとアプリケーションにアクセスすることはできません。
如果没有问题,则会启动一个随机命名的容器。
根据图像启动容器。
指令等
docker version
docker run
docker image
docker container
docker build -t getting-started .
docker ps
创建Node.js应用的Docker镜像
准备一个合适的Node.js应用程序。
{
"name": "docker-guide",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"ronin-mocks": "^0.1.6",
"ronin-server": "^0.1.3"
}
}
const ronin = require('ronin-server')
const mocks = require('ronin-mocks')
const server = ronin.server()
server.use('/', mocks.server(server.Router(), false, true))
server.start()
这个程序监听在8000端口上。
对于根(/)端点,可以进行POST请求,发送的JSON数据将全部保存在内存中。
同样,可以发送GET请求到根端点,并接收之前发送的POST请求的结果作为JSON对象的数组。
curl --request POST \
--url http://localhost:8000/test \
--header 'content-type: application/json' \
--data '{"msg": "testing" }'
{"code":"success","payload":[{"msg":"testing","id":"31f23305-f5d0-4b4f-a16f-6f4c8ec93cf1","createDate":"2020-08-28T21:53:07.157Z"}]}
curl http://localhost:8000/test
不是根目录(/),而是测试(test),不过现在先不用在意。
# syntax=docker/dockerfile:1 // https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/builder/#syntax
# ベースイメージの指定
FROM node:12.18.1
# 環境変数の指定
ENV NODE_ENV=production
# ワーキングディレクトリの指定
WORKDIR /app
# npm install 実行のための準備
COPY ["package.json", "package-lock.json*", "./"]
# npm install
RUN npm install --production
# ソースコードをコピー
COPY . .
# 実行させるコマンドを指定
CMD [ "node", "server.js" ]
node_modules
构建执行
docker build --tag node-docker .
确认图像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
node-docker latest 694297f0c510 24 minutes ago 934MB
尝试添加标签
$ docker tag node-docker:latest node-docker:v1.0.0
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
node-docker latest 694297f0c510 26 minutes ago 934MB
node-docker v1.0.0 694297f0c510 26 minutes ago 934MB
docker tag 命令用于为镜像生成标签。
它并没有创建新的镜像。这个标签只是指向同一个镜像,相当于另一种引用镜像的方式。
这次尝试删除标签。
$ docker rmi node-docker:v1.0.0
Untagged: node-docker:v1.0.0
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
node-docker latest 694297f0c510 28 minutes ago 934MB
以容器形式执行图像。
docker run node-docker
虽然没有任何输出,但server.js已经启动了。
试试用curl进行通信
curl: (7) Failed to connect to localhost port 8000: Connection refused
因为没有进行端口映射,所以出现了错误。让我们做端口映射。
docker run --publish 8000:8000 node-docker
# --publish または -p
$ curl --request POST \
--url http://localhost:8000/test \
--header 'content-type: application/json' \
--data '{"msg": "testing" }'
{"code":"success","payload":[{"msg":"testing","id":"81c0040c-efb5-4bd3-8e4f-927b9f3c6a3c","createDate":"2022-02-17T01:18:19.546Z"},{"msg":"testing","id":"beb16ebd-0968-4bc3-9d98-8409d7c51862","createDate":"2022-02-17T01:18:40.310Z"}]}%
$ curl http://localhost:8000/test
{"code":"success","meta":{"total":2,"count":2},"payload":[{"msg":"testing","id":"81c0040c-efb5-4bd3-8e4f-927b9f3c6a3c","createDate":"2022-02-17T01:18:19.546Z"},{"msg":"testing","id":"beb16ebd-0968-4bc3-9d98-8409d7c51862","createDate":"2022-02-17T01:18:40.310Z"}]}%
可以了。
以分离模式执行
$ docker run -d -p 8000:8000 node-docker
# --detach または -d
1e39791c3eb854b6c2500eb28e8e655fcf30699ec49d7e62d198a9c8ecb3b24c
这将在后台执行。
显示正在运行的容器列表
docker ps
停止容器
指定容器名称或容器ID以停止容器。
$ docker stop unruffled_dubinsky
unruffled_dubinsky
停止容器并不意味着容器会被删除。
如果标记了-a,那么停止的容器也会被显示出来。
$ docker ps -a
# --all または -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e39791c3eb8 node-docker "docker-entrypoint.s…" 7 minutes ago Exited (0) 2 minutes ago unruffled_dubinsky
aafd432ebf20 node-docker "docker-entrypoint.s…" 13 minutes ago Exited (0) 9 minutes ago xenodochial_benz
e7ba3bb8c9b7 node-docker "docker-entrypoint.s…" 17 minutes ago Exited (0) 13 minutes ago determined_swanson
9bfc45d62bc6 docker/getting-started "/docker-entrypoint.…" 40 hours ago Exited (255) 26 hours ago 0.0.0.0:80->80/tcp infallible_brahmagupta
重新启动容器
docker restart unruffled_dubinsky
删除容器
可以在停止容器后执行删除操作
# 複数指定もOK
docker rm wonderful_kalam agitated_moser goofy_khayyam
# 全削除
$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
87a414adafad7d0f7d98d040830624cad6947494e1cee693c14dc280209cc906
# 停止して24時間停止したコンテナを削除
$ docker container prune -f --filter "until=24h"
# 停止して24時間停止したコンテナと、使っていないイメージおよびネットワークを削除
$ docker system prune -a --filter "until=24h"
我想指定一个容器名称,以避免生成随机名称。
只需要加上名字标志。
$ docker run -d -p 8000:8000 --name rest-server node-docker
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
87a414adafad node-docker "docker-entrypoint.s…" 1 second ago Up Less than a second 0.0.0.0:8000->8000/tcp rest-server