挑战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
广告
将在 10 秒后关闭
bannerAds