[docker] utility container

2024-04-24 18:52
文章标签 docker container utility

本文主要是介绍[docker] utility container,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[docker] utility container

utility container 我感觉就是工具,可以减少一些系统安装软件的容器

使用场景

主要还是系统减负,比如说正常情况下运行一个 node 项目,那么系统上一定需要安装一个 npm,哪怕是创建一个新的项目,使用 npm init,也是需要保证本机上安装一个 npm,但是如果将其放到 docker 容器中,那么就不需要安装 npm 了

如果只是 node,那么问题倒也不是很大,但是参考一下 laravel 项目,官方文说,必须 安装 PHP 和 Composer,推荐 安装 Node 和 NPM:

Before creating your first Laravel project, make sure that your local machine has PHP and Composer installed. If you are developing on macOS, PHP and Composer can be installed in minutes via Laravel Herd. In addition, we recommend installing Node and NPM

Installation

这种情况下,安装工具就相对而言比较困难

另一个情况是不同的库,但是会产生冲突。比如说 MariaDB 和 MySQL,默认导出的 port 都是 3306,但是二者不兼容,包括使用的 SQL Driver 都不一样。我就因为想要同时安装 MariaDB 和 MySQL 导致一些文件冲突,然后折腾了一个下午才彻底删除干净,重新安装了 MySQL

再后来干脆就使用 MySQL 的 docker 了

使用 util container 的方法

简单介绍一下用 util container 的方式

直接 -it

这种大多数情况下是需要用 REPL,如:

docker run -it --rm node
11Welcome to Node.js v21.7.3.
Type ".help" for more information.
> 1 + 1
2
> console.log('hello docker')
hello docker
undefined
>

另一种使用方式如下:

docker run -it node npm init -y
Wrote to /package.json:{"name": "","version": "1.0.0","description": "","main": "index.js","directories": {"lib": "lib"},"scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","license": "ISC"
}

这样就可以创建一个空白的 node 项目了

另外也可以在 run 的同时 attach 一个 bash,这样可以直接通过命令行执行

exec

但是有的情况下,已经使用 docker run,又想额外加一些功能,这时候就可以使用 exec,如:

# 假设之前的指令是启动一个 node 容器docker exec -it sweet_nightingale npm init -y
Wrote to /package.json:{"name": "","version": "1.0.0","description": "","main": "index.js","directories": {"lib": "lib"},"scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","license": "ISC"
}

exec 是在 docker 容器内运行指令的 arg,如果想要 attach bash 的话,那么容器就一定要在运行的状态才行

bind mounts util container

之前在 [docker] 数据的持久化 - Volume & bind mounts 提到可以把 docker 容器中的路径和本机的路径进行挂载,这样双向都能够被更新

这个思路也可以应用到 util container 上,这样就可以在本机修改代码,然后在 container 中即时更新。或者容器中修改了一些内容,本机上也获取同步更新

下面就实现一个 node 的 util container 的 bind mounts:

# 使用 slim 或者 alpine 会比完整的版本小很多docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
node-util    latest    d006cdcdfc7d   7 seconds ago       132MB
node         latest    b6d2a1484e51   About an hour ago   1.1GB
# 然后进行 bind mountdocker run -it -v "$(pwd):/app" node-util npm init -y
Wrote to /app/package.json:{"name": "app","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","license": "ISC"
}

在这里插入图片描述

可以看到本机上也出现了对应的 package.json 文件

使用 Dockerfile

这里多提一下 ENTRYPOINT,这是一个添加了之后 docker 永远会多执行的一个指令:

FROM node:20-slimWORKDIR /appENTRYPOINT [ "npm" ]

这样就可以不用反复输入 npm,因为每次执行的时候,npm 都会执行:

docker run -it -v "$(pwd):/app" node-util init -y
Wrote to /app/package.json:{"name": "app","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","license": "ISC"
}# 下载 node_module,注意这里是启动了一个新的 containerdocker run -it -v "$(pwd):/app" node-util installup to date, audited 1 package in 300msfound 0 vulnerabilities# 安装 express,注意这里启动了第三个 containerdocker run -it -v "$(pwd):/app" node-util install expressadded 64 packages, and audited 65 packages in 4s12 packages are looking for fundingrun `npm fund` for detailsfound 0 vulnerabilities
npm notice
npm notice New patch version of npm available! 10.5.0 -> 10.5.2
npm notice Changelog: https://github.com/npm/cli/releases/tag/v10.5.2
npm notice Run npm install -g npm@10.5.2 to update!
npm notice

完成之后,node_modules 也会被同步到本机上:

在这里插入图片描述

使用 docker compose

想要继续简化步骤,则是可以使用 docker compose:

version: "3.8"
services:npm:build: ./stdin_open: truetty: truevolumes:- ./:/app

这样可以少打一些字:

# can use --rm to remove the container after executing the commanddocker compose run npm init -y
WARN[0000] /Users/luhan/study/docker/section07/docker-compose.yaml: `version` is obsolete
[+] Creating 1/0✔ Network section07_default  Created                                                                                                                 0.0s
[+] Building 0.6s (6/6) FINISHED                                                                                                      docker:desktop-linux=> [npm internal] load build definition from Dockerfile                                                                                              0.0s=> => transferring dockerfile: 90B                                                                                                                   0.0s=> [npm internal] load metadata for docker.io/library/node:20-slim                                                                                   0.5s=> [npm internal] load .dockerignore                                                                                                                 0.0s=> => transferring context: 2B                                                                                                                       0.0s=> [npm 1/2] FROM docker.io/library/node:20-slim@sha256:7c5c3f250db850d159c5f5554a3a608a72eb721dd15451d294e3fe74f944a4fc                             0.0s=> CACHED [npm 2/2] WORKDIR /app                                                                                                                     0.0s=> [npm] exporting to image                                                                                                                          0.0s=> => exporting layers                                                                                                                               0.0s=> => writing image sha256:2d02c95f22951c1aea74c6c4d1cf6703115cbacbfeaccec867d55993b17894d3                                                          0.0s=> => naming to docker.io/library/section07-npm                                                                                                      0.0s
Wrote to /app/package.json:{"name": "app","version": "1.0.0","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","license": "ISC","dependencies": {"express": "^4.19.2"},"devDependencies": {},"description": ""
}

保持 node 项目运行

这个是只针对 node 的优化:

docker run -d node:20-alpine tail -f /dev/null
Unable to find image 'node:20-alpine' locally
20-alpine: Pulling from library/node
4abcf2066143: Already exists
3bce96456554: Already exists
2bde47b9f7c3: Already exists
db3e2f2b6054: Already exists
Digest: sha256:7a91aa397f2e2dfbfcdad2e2d72599f374e0b0172be1d86eeb73f1d33f36a4b2
Status: Downloaded newer image for node:20-alpine
1ab1731f8bdc929e6274ebc4f3e7b95596a5d0d33be1b41c4eb2726ab3c8f1ae
❯ docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS         PORTS     NAMES
1ab1731f8bdc   node:20-alpine   "docker-entrypoint.s…"   3 seconds ago   Up 2 seconds             sleepy_wright# 使用 exec 执行 shdocker exec -it sleepy_wright sh
/ # echo "bash is not present"
bash is not present

这样就可以进入到容器内执行命令,而不是反复重新起一个新的容器

⚠️:alpine 模式下 bash 不存在,所以可以使用 sh

这篇关于[docker] utility container的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/932561

相关文章

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

关于Docker Desktop的WSL报错问题解决办法

《关于DockerDesktop的WSL报错问题解决办法》:本文主要介绍关于DockerDesktop的WSL报错问题解决办法的相关资料,排查发现是因清理%temp%文件夹误删关键WSL文件,... 目录发现问题排查过程:解决方法其实很简单:重装之后再看就能够查到了:最后分享几个排查这类问题的小www.cp

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件

《如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件》本文介绍了如何使用Docker部署FTP服务器和Nginx,并通过HTTP访问FTP中的文件,通过将FTP数据目录挂载到N... 目录docker部署FTP和Nginx并通过HTTP访问FTP里的文件1. 部署 FTP 服务器 (

解读docker运行时-itd参数是什么意思

《解读docker运行时-itd参数是什么意思》在Docker中,-itd参数组合用于在后台运行一个交互式容器,同时保持标准输入和分配伪终端,这种方式适合需要在后台运行容器并保持交互能力的场景... 目录docker运行时-itd参数是什么意思1. -i(或 --interactive)2. -t(或 --

Docker部署Jenkins持续集成(CI)工具的实现

《Docker部署Jenkins持续集成(CI)工具的实现》Jenkins是一个流行的开源自动化工具,广泛应用于持续集成(CI)和持续交付(CD)的环境中,本文介绍了使用Docker部署Jenkins... 目录前言一、准备工作二、设置变量和目录结构三、配置 docker 权限和网络四、启动 Jenkins

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

docker如何删除悬空镜像

《docker如何删除悬空镜像》文章介绍了如何使用Docker命令删除悬空镜像,以提高服务器空间利用率,通过使用dockerimage命令结合filter和awk工具,可以过滤出没有Tag的镜像,并将... 目录docChina编程ker删除悬空镜像前言悬空镜像docker官方提供的方式自定义方式总结docker

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁