对了,我们来学习一下Docker吧(验证日志)
验证日志。请不要根据此执行任何操作(此日志可能包含大量返工)。
在开始着手之前需要记住的事情 (关于问题)
dockerfile, docker-composeってなんだ
docker imageを開発メンバーで共有するためには?(docker hub?をローカルで作れる?)
docker-composeとPacemakerの絡み方
Node.jsのAppをコンテナ化する時にImageにファイルを入れるのか、Volumeで常にホストをマウントするのか(前者だと思ってるけどネタがなさすぎる)
Dockerfile和Docker Compose是什么?
在Docker领域术语繁多,需要有一个大致的理解。
参考的网址合集
-
- [Django] Dockerファイルとdocker-compose.ymlの違い
- Dockerfile と docker-compose を利用すると何がうれしいのか?
Docker Compose与Pacemaker的关联方式
请提供参考网址集合。
- ocf_heartbeat_docker-compose
这个感觉可能有。或许能用docker-compose来进行RA控制。
但是每次都需要进行构建之类的操作,我可能无法应付。
先试一下吧
Docker的安装
参考网址集合
-
- 簡単な4つの方法】UbuntuにDockerをインストールするには
- Ubuntu 22.04にdockerをインストールする
听说安装的方法有三种。
-
- 在apt中顺利获取到最新的东西
-
- 事先获取.deb文件并进行本地安装
- 自动安装脚本
第三个正直是啥意思呢?作为构建管理的人我更喜欢第二个选项,不过暂时先试试第一个。
首先更新apt仓库,并获取所需的包来获取与Docker相关的apt仓库。
# aptリポジトリを最新化
$ sudo apt update
# docker関連のaptリポジトリを追加するために必要なパッケージを取得
$ sudo apt install ca-certificates curl gnupg lsb-release
将Docker的GPG密钥添加到apt注册中。
参考:GPG是什么?
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ sudo chmod a+r /etc/apt/keyrings/docker.gpg
对于chmod中的a+r,我曾想知道是什么意思,后来发现是指“all + r”。平时我习惯略写chmod +x,但要明确指定的话就变成a+x了。
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
tee是什么来着。
tee命令是什么?”tee”命令用于将从标准输入接收到的内容写入标准输出和文件。可以同时进行保存到文件和输出到标准输出,也可以输出到多个文件。
不需要使用tee,如果要把它丟到/dev/null里的話,可以直接嘛…不行吗?
$ sudo apt update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
在我参考的两个网站上,最后一点差异是docker-compose-plugin的存在与否。我曾经在很久以前一次短暂接触docker时记得这个。因为将来可能会需要,所以最好提前安装好。
我本以为不需要指定,但它已经包含在内了。看起来它似乎和其他某个一同安装了。
$ docker -v
Docker version 24.0.6, build ed223bc
让普通用户能够运行Docker
$ getent group | grep docker
docker:x:999:
$ sudo usermod -aG docker $USER
$ getent group | grep docker
docker:x:999:udon
只要重新登录并使用id命令确认所属。
$ id
uid=1000(udon) gid=1000(udon) groups=1000(udon),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lxd),999(docker)
确认动作
$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
我试着写一个 Dockerfile。
学习在容器中启动Node.js的最佳实践。
参考链接合集
-
- DockerでNode.jsを動かすときのベストプラクティス
- Dockerイメージを軽量化しよう
试着放空大脑,模仿例题中的错误方法。
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
{
"name": "nodejs-docker",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"author": "conop",
"license": "MIT",
"dependencies": {
"express": "^4.18.1"
}
}
$ ls -ltR ../opt
../opt:
total 8
-rw-rw-r-- 1 udon udon 214 Sep 18 14:42 pakcage.json
-rw-rw-r-- 1 udon udon 219 Sep 18 14:41 index.js
FROM node
WORKDIR /app
COPY . .
RUN yarn install
CMD "yarn" "start"
$ docker build -t nodejs-docker .
:
[+] Building 55.9s (9/9) FINISHED docker:default
:
docker run -p 3000:3000 nodejs-docker
>> yarn run v1.22.18
>> $ node index.js
>> sample app listening on port 3000
$ docker image ls nodejs-docker
REPOSITORY TAG IMAGE ID CREATED SIZE
nodejs-docker latest cce892b92beb 17 minutes ago 1.1GB
node.js的版本是什么?
LTS的最新版本是18.17.1。
支持到2025年4月30日。
Docker仓库
以下是带有 slim 版的:
-
- 18.17.1-bookworm-slim
-
- 18.17.1-slim
-
- 18.17.1-bullseye-slim
- 18.17.1-buster-slim
书呆子、中的人、捣乱鬼的区别在哪里?
不同类型和选择Docker镜像的方法
似乎是Debian的版本。我想使用有很多成就的bullseye版本,但在安全性方面是否选择最新的bookworm版本令我很犹豫。
$ cat Dockerfile
FROM node:18.17.1-bookworm-slim
WORKDIR /app
COPY . .
RUN yarn install
CMD "yarn" "start"
$ docker build -t nodejs-docker .
$ docker image ls nodejs-docker
REPOSITORY TAG IMAGE ID CREATED SIZE
nodejs-docker latest df64eef74043 2 seconds ago 249MB
哇!减少了好多。太感动了。
-
- npmとは yarnとは
-
- DockerfileのRUN命令
- Dockerfileリファレンス – RUN
$ cat Dockerfile
FROM node:18.17.1-bookworm-slim
WORKDIR /app
COPY . .
RUN yarn install --prod --frozen-lockfile
CMD "yarn" "start"
-
- package-lock.jsonとyarn.lockとは!? 分かりやすくシンプルに解説!!
- パッケージマネージャー「Yarn」の使い方
$ cat Dockerfile
FROM node:18.17.1-bookworm-slim
WORKDIR /app
COPY package.json ./
RUN yarn install --prod --frozen-lockfile
COPY . .
CMD "yarn" "start"
因为没有使用过yarn进行包管理,所以没有yarn.lock文件,暂时将其排除。
-
- Dockerfileリファレンス – ENTRYPOINT
- DockerfileのCMDとENTRYPOINTの違い
听说咬一口Tini可以解决各种问题
$ cat Dockerfile
FROM node:18.17.1-bookworm-slim
WORKDIR /app
RUN apk add --no-cache tini
COPY package.json ./
RUN yarn install --prod --frozen-lockfile
COPY . .
ENTRYPOINT ["/sbin/tini", "--" ]
CMD "node", "index.js"
- Docker 環境別 no cache install
$ cat Dockerfile
FROM node:18.17.1-bookworm-slim
ENV NODE_ENV production
WORKDIR /app
RUN apt-get update
RUN apt-get install -y tini
RUN apt-get clean
RUN rm -rf /var/lib/apt/lists/*
ENTRYPOINT ["/sbin/tini", "--" ]
COPY --chown=node:node package.json ./
RUN yarn install --prod --frozen-lockfile
COPY --chown=node:node . .
USER node
CMD "node", "index.js"
$ docker image ls nodejs-docker
REPOSITORY TAG IMAGE ID CREATED SIZE
nodejs-docker latest ac301270a047 53 seconds ago 270MB
$ docker run -p 3000:3000 nodejs-docker
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/sbin/tini": stat /sbin/tini: no such file or directory: unknown.
ERRO[0000] error waiting for container:
嗯,找不到/sbin/tini。
根据调查,发现如果是阿尔派系统,应该使用/sbin/tini。我们要用/usr/sbin/tini。
$ cat Dockerfile
FROM node:18.17.1-bookworm-slim
ENV NODE_ENV production
WORKDIR /app
RUN apt-get update
RUN apt-get install -y tini
RUN apt-get clean
RUN rm -rf /var/lib/apt/lists/*
ENTRYPOINT ["/usr/bin/tini", "--" ]
COPY --chown=node:node package.json ./
RUN yarn install --prod --frozen-lockfile
COPY --chown=node:node . .
USER node
CMD which tini
CMD "node", "index.js"
$ docker run -p 3000:3000 nodejs-docker
/bin/sh: 1: node,: not found
妈咪!!!
$ cat Dockerfile
FROM node:18.17.1-bookworm-slim
ENV NODE_ENV production
WORKDIR /app
RUN apt-get update
RUN apt-get install -y tini
RUN apt-get clean
RUN rm -rf /var/lib/apt/lists/*
ENTRYPOINT ["/usr/bin/tini", "--" ]
COPY --chown=node:node package.json ./
RUN yarn install --prod --frozen-lockfile
COPY --chown=node:node . .
USER node
CMD ["node", "index.js"]
最后,我忘了将CMD转换为Json格式。
$ docker run -p 3000:3000 nodejs-docker
Example app listening on port 3000
^C $