Docker getting started
系列文章目录
Docker 概述
Docker getting started
文章目录
- 系列文章目录
- 前言
- 一、容器及镜像的概念
- 二、容器化一个应用
- 三、更新应用
- 四、分享应用
- 五、持久化数据存储
- volume mount 和 bind mount比较
- Container volumes
- bind mounts
- 六、跨多容器的应用
- 七、Docker 其它
- 八、Docker 图形化界面显示
- 总结
前言
本文主要包含以下内容:
- 将一个应用放在容器中运行
- 介绍持久化数据存储方式
- Docker图形化界面显示方法
一、容器及镜像的概念
容器:
- 镜像的可运行实例。通过Docker API or CLI可以创建、启动、停止、移动或删除容器。
- 可在本地、虚拟机、云上运行。
- 便捷(可在任意OS上运行)。
- 与其他容器隔离,运行独立的软件、二进制文件、配置。
镜像:
提供隔离的、定制化的文件系统,也包含配置信息、环境变量等。
二、容器化一个应用
git clone https://github.com/docker/getting-started.git
- 建立Dockerfile
用于指示Docker如何创建镜像
Dockerfile
# syntax=docker/dockerfile:1FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
- 建立容器镜像
docker build -t getting-started .
docker build
命令通过通过 Dockerfile 建立容器镜像。在此过程中Docker下载了许多“layer”。因为是从node:18-alpine
开始的,又因本地中没有此镜像,需要先下载。
下载完成后,指令从Docker中拷贝到应用中,并通过yarn
安装依赖。CMD
指令指定从此镜像启动容器时要运行的默认命令。
最后-t
表示给镜像打个标签,如getting-started
最后的.
表示从当前目录找查Dockerfile文件
- 启动一个应用容器
docker run -dp 3000:3000 getting-started
-d
detached模式
-p
在主机端口3000与容器端口3000之间创建端口映射,没有端口映射将无法访问应用
- 访问应用
http://localhost:3000
- 通过Docker Dashboard可查看运行中的容器
三、更新应用
上章容器化了一个todo应用。本章将更新应用和容器镜像。stop and remove容器。
- src/static/js/app.js 修改
...- <p className="text-center">No items yet! Add one above!</p>+ <p className="text-center">You have no todo items yet! Add one above!</p>...
- docker build
docker build -t getting-started .
- 停止,移除容器
# 查看运行中的容器
docker ps
# 停止容器
docker stop <the-container-id>
# 移除容器
docker rm <the-container-id>
# 停止并移除容器
docker rm -f <the-container-id>
- start the updated app container
docker run -dp 3000:3000 getting-started
四、分享应用
# 登陆Docker Hub
docker login -u YOUR-USER-NAME
# 添加tag
docker tag getting-started YOUR-USER-NAME/getting-started
# push
docker push YOUR-USER-NAME/getting-started
五、持久化数据存储
容器从镜像的“层”中获取该容器的文件系统,即便是从统一镜像实例的两个容器也是隔离的,两个容器之间的更改不互通。
# 运行容器,并执行命令 bash ......
docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"
# 查看运行中的容器 -a 查看所有容器
docker ps
# 在容器中执行命令
docker exec <container-id> cat /data.txt
# 然后再run另一个容器,次容器中则无data.txt文件
volume mount 和 bind mount比较
Named volumes | Bind mounts | |
---|---|---|
共享文件存放在主机的位置 | 由Docker选择 | 用户决定 |
mount示例 (using --mount ) | type=volume,src=my-volume,target=/usr/local/data | type=bind,src=/path/to/data,target=/usr/local/data |
用容器内容填充新卷 | Y | N |
支持卷驱动程序 | Y | N |
Container volumes
Volumes可将容器中的某一文件系统路经连接至本地主机上。如果在容器总挂载了该目录,其变更也在宿主机上可见。如果我们跨容器重新启动装载相同的目录,我们将看到相同的文件。
# create volume
docker volume create <filename>
# 在run一个镜像时加上volume,volume文件所在的目录就成了volume目录
docker run -dp 3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started
# rm上面的容器后再用相同的命令即可实现在多个容器中共享数据# docker volume <filename> 的存放位置
docker volume inspect todo-db
[{"CreatedAt": "2022-09-26T02:18:36Z","Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/todo-db/_data","Name": "todo-db","Options": {},"Scope": "local"}
]
bind mounts
docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash
src为host的目录,target为容器的目录
运行此条命令后 host的"$(pwd)"目录和 容器的/src目录实时同步
在容器中运行宿主机中正在开发的应用
docker run -dp 3000:3000 \-w /app --mount type=bind,src="$(pwd)",target=/app \node:18-alpine \sh -c "yarn install && yarn run dev"
dp 3000:3000
分离模式,指定host和容器的端口映射(用于访问app网页)-w /app
设置命令行的工作目录--mount type=bind, src="$(pwd)", target=/app
bind mount 宿主机目录(“$(pwd)”)和容器目录(/app)node:18-alpine
使用的镜像sh -c "yarn install && yarn run dev"
容器启动后运行的命令。使用sh(node:18-alpine没有bash) 运行 yarn install 安装包,然后运行 yarn run dev 启动 该软件。如果查看下 package.json,dev脚本启动了nodemon
docker logs -f <container-id>
nodemon src/index.js
[nodemon] 2.0.20
[nodemon] to restart at any time, enter `rs`
[nodemon] watching dir(s): *.*
[nodemon] starting `node src/index.js`
Using sqlite database at /etc/todos/todo.db
Listening on port 3000
六、跨多容器的应用
APP放在一个容器中,MySQL放在另一个容器中
默认情况下容器与其它容器、进程是隔离的。多个容器之间可通过网络进行通讯,同一个网络下的容器才可进行通讯。
- 创建网络
docker network create <app name todo-app>
- 启动MySQL容器,并将其附着在网络上
docker run -d \--network todo-app --network-alias mysql \-v todo-mysql-data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=secret \-e MYSQL_DATABASE=todos \mysql:8.0
- 验证2是否成功
docker exec -it <mysql-container-id> mysql -u root -p
mysql> SHOW DATABASES;
+--------------------+| Database |+--------------------+| information_schema || mysql || performance_schema || sys || todos |+--------------------+5 rows in set (0.00 sec)
mysql> exit
连接MySQL
- 启动一个新的容器,连接到同一个network
此处用到的image为 nicolaka/netshoot
docker run -it --netword <netword-file> <imagename>dP dP dP 88 88 88
88d888b. .d8888b. d8888P .d8888b. 88d888b. .d8888b. .d8888b. d8888P
88' `88 88ooood8 88 Y8ooooo. 88' `88 88' `88 88' `88 88
88 88 88. ... 88 88 88 88 88. .88 88. .88 88
dP dP `88888P' dP `88888P' dP dP `88888P' `88888P' dP Welcome to Netshoot! (github.com/nicolaka/netshoot)
找到 hostname为 mysql的IP
dig mysql; <<>> DiG 9.18.11 <<>> mysql
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38459
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0;; QUESTION SECTION:
;mysql. IN A;; ANSWER SECTION:
mysql. 600 IN A 172.18.0.2;; Query time: 3 msec
;; SERVER: 127.0.0.11#53(127.0.0.11) (UDP)
;; WHEN: Tue Feb 14 13:52:52 UTC 2023
;; MSG SIZE rcvd: 44
其中mysql不仅仅是一个有效的hostname,Docker还会把他解析成IP地址,即--network-alias mysql
与该IP有映射关系。
也就是说应用只需要连接到hostname为 mysql 的容器即可实现容器间通讯。
- 将APP连接到MySQL
在/app目录下
docker run -dp 3000:3000 \-w /app -v "$(pwd):/app" \--network todo-app \-e MYSQL_HOST=mysql \-e MYSQL_USER=root \-e MYSQL_PASSWORD=secret \-e MYSQL_DB=todos \node:18-alpine \sh -c "yarn install && yarn run dev"
查看进度
docker logs -f <container-id>
查看数据库
docker exec -it <mysql-container-id> mysql -p todosmysql> select * from todo_items;
+--------------------------------------+------+-----------+
| id | name | completed |
+--------------------------------------+------+-----------+
| f207cb07-c947-4d37-aef0-4b0dc50044d5 | abc | 0 |
| d1e7dc53-fb06-4001-96a5-a5dc142e90ba | dev | 1 |
| 8279b8a3-383b-4be4-bd4b-002a1111b44e | sdf | 0 |
+--------------------------------------+------+-----------+
3 rows in set (0.01 sec)
七、Docker 其它
检查是否安装了Docker 组件
docker compose version
Docker 组件可帮助快速构建跨容器的应用,配置好后只需一条命令即可其多多容器应用。
其它:
# 扫描docker 镜像的漏洞
docker scan <image-name># 查看镜像的layers
docker image history <image-name># 通过Layer caching加速镜像的构建等
八、Docker 图形化界面显示
把docker镜像看做一台没配显示器的电脑,程序可以运行,但是没地方显示。
而linux目前的主流图像界面服务X11又支持客户端/服务端(Client/Server)的工作模式。
只要在容器启动的时候,将『unix:端口』或『主机名:端口』共享给docker,docker就可以通过端口找到显示输出的地方,和linux系统共用显示。
# 安装x11界面服务
apt-get install x11-xserver-utils
# 为所有用户开放权限
xhost +# 在启动容器
docker run -it \-v /tmp/.x11-unix:/tmp/.x11-unix \-e DISPLAY=unix$DISPLAY -e GDK_SCALE \-e GDK_DPI_SCALE --net=host ubuntu /bin/bash
然后安装个小程序测试是否成功
# apt-get update
apt-get install xarclock
xarclock
总结
相关文章:
Docker getting started
系列文章目录 Docker 概述 Docker getting started 文章目录系列文章目录前言一、容器及镜像的概念二、容器化一个应用三、更新应用四、分享应用五、持久化数据存储volume mount 和 bind mount比较Container volumesbind mounts六、跨多容器的应用七、Docker 其它八、Docker 图…...
【Uniapp使用遇到问题合集】
Uniapp使用遇到问题合集问题一跳转页面后无法进行滑动/滚动的操作描述解决方法问题一 跳转页面后无法进行滑动/滚动的操作 描述 如题,实际操作是我在uniapp自带的组件uni-popup弹出层中加入了一个点击事件,点击后可跳转到指定的页面 但实际运行中出现了跳转过后页面过长时无…...
宝塔面板破解最新教程
宝塔,让运维简单高效。面板支持Linux与Windows系统。一键配置:LAMP/LNMP、网站、数据库、FTP、SSL,通过Web端轻松管理服务器。今天考高分网就简单说一下BT宝塔面板专业版最新破解教程。 网地址:https://www.bt.cn/ 网上的破解版一般分为两种,一种是直接…...
基于zookeeper的Hadoop集群搭建详细步骤
目录 一、一些基本概念 二、集群配置图 三、Hadoop高可用集群配置步骤 1.在第一台虚拟机解压hadoop-3.1.3.tar.gz到/opt/soft/目录 2.修改文件名、属主和属组 3.配置windows四台虚拟机的ip映射 4.修改hadoop配置文件 (1)hadoop-env.sh (2)workers (3)crore-site.xml …...
职称有哪些意义?如何提升职称?
每年我们会看到很多人都会努力地提升自己的职称,那么为什么大家都想要晋升职称?在这里余老师说说他的作用,您可以参考一下。 一、个人金钱方面的提升 工资。职称直接关联的就是涨工资了。正常情况下,职称和工资是一一对应的了,…...
mulesoft MCIA 破釜沉舟备考 2023.02.15.09
mulesoft MCIA 破釜沉舟备考 2023.02.15.09 1. According to MuleSoft, which deployment characteristic applies to a microservices application architecture?2. Refer to the exhibit.3. Mule application A receives a request Anypoint MQ message REQU with a payload…...
【项目实战】@ConditionalOnProperty注解让我少写了一些if判断
一、需求说明 本机启动含有XXL-job的工程,发现每次都会进行XXL-job的init的动作。这会导致本机每次启动都会把自己注册到XXL-job的服务端。但是我明明本地调试的功能不想要是编写定时任务,于是想了下,是否可以设计一个开关,让本机…...
SQL中的游标、异常处理、存储函数及总结
目录 一.游标 格式 操作 演示 二.异常处理—handler句柄 格式 演示 三.存储函数 格式 参数说明 演示 四.存储过程总结 一.游标 游标(cursor)是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、OPEN、…...
Splashtop:支持M1/M2芯片 Mac 电脑的远程控制软件
M1和M1芯片的Mac电脑现在越来越多了。M1和M2的强大性能,让使用者们办公、娱乐如虎添翼。 M1 芯片于2020年11月11日推出,是Apple 首款专为Mac打造的芯片,拥有格外出色的性能、众多的功能,以及令人惊叹的能效表现。M1 也是Apple 首款…...
实验十三、阻容耦合共射放大电路的频率响应
一、题目 利用 Multism 从以下几个方面研究图1所示的阻容耦合共射放大电路的频率响应。图1阻容耦合共射放大电路图1\,\,阻容耦合共射放大电路图1阻容耦合共射放大电路(1)设 C1C210μFC_1C_210\,\textrm{μF}C1C210μF,分别测试它们所确定…...
【每天进步一点点】函数表达式和函数声明
函数声明 function 函数名(){} 函数声明会被率先读取。 函数声明后不会立即执行,会在我们需要的时候调用到。 由于函数声明不是一个可执行语句,所以不以分号结束。 函数表达式 表达式赋值给了一个变量 const 变量名 functi…...
JavaScript void
文章目录JavaScript voidjavascript:void(0) 含义href"#"与href"javascript:void(0)"的区别JavaScript void javascript:void(0) 含义 我们经常会使用到 javascript:void(0) 这样的代码,那么在 JavaScript 中 javascript:void(0) 代表的是什么…...
笔记本电脑怎么连接无线网wifi?不同电脑系统的使用教程(2023最新)
现在越多人使用笔记本电脑,在我们的日常生活和工作中是很难离开它的。想要更快速地上网,我们都会选择连接无线网的wifi。有时笔记本电脑无法连接网络,你知道这是什么原因吗?笔记本电脑怎么连接无线网wifi?方法很简单&a…...
从lettcue插件看skywalking
lettcue 的写操作是异步的。io.lettuce.core.RedisChannelWriter.write进行写入,io.lettuce.core.protocol.RedisCommand进行异步读取数据 skywalking 插件大体逻辑 在方法执行前,通过ContextManager创建span创建span的同时,判断trace上下文…...
explain 每个列的含义
官网传送门:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html 实例表 DROP TABLE IF EXISTS actor;CREATE TABLE actor (id int(11) NOT NULL,name varchar(45) DEFAULT NULL,update_time datetime DEFAULT NULL,PRIMARY KEY (id)) ENGINEInnoDB DEFA…...
网络通信编程基础
1.IP地址 概念 IP地址主要用于标识网络主机、其他网络设备(如路由器)的网络地址。简单说,IP地址用于定位主机的网络地址。 就像我们发送快递一样,需要知道对方的收货地址,快递员才能将包裹送到目的地。 格式 IP地址…...
Linux网络编程
一、网络结构模式 1、C/S 结构 1)、简介 服务器 - 客户机,即 Client - Server(C/S)结构。C/S 结构通常采取两层结构。服务器负责数据的管理,客户机负责完成与用户的交互任务。客户机是因特网上访问别人信息的机器&a…...
***httpGet,httpPost,postman_http,httpClientSocket,httpSocketServer***
1:状态码_http 2:java访问(http):国家气象局 免费接口 3:httpClientSocket ~~~ httpSocketServer 4:httpGet ~ httpPost 1:状态码_http http请求的响应码一般分为五类 1xx 2xx 3xx 4xx 5xx 1xx 临时性的消息 101:当客户端问服务端支不支持http2.0的时候,如果支持服…...
Downie4.6.7
Downie是Mac下一个简单的下载管理器,可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们,文章末尾附下载地址。主要特点支持许多网站目前支持超过1,000个不同的网站(包括YouTube,Vim…...
重构是什么
重构 重构的主要目的是解决技术债务问题。它将混乱的代码转化为清晰的代码和简单的设计。 不错!但是“清晰的代码”具体是什么呢?以下是它的一些特征: 清晰的代码对其他程序员来说应该是一目了然的。 我不是在谈论超级复杂的算法。糟糕的…...
(考研湖科大教书匠计算机网络)第四章网络层-第六节1:路由选择协议概述
获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:路由选择概述二:因特网采用的路由选择协议(1)特点(2)常见的路由选择协议三:…...
vue2源码之生命周期篇
vue2源码之生命周期篇vue2源码之生命周期篇生命周期流程图初始化阶段(new Vue)vue2源码之生命周期篇 生命周期流程图 从图中可以看到,Vue实例的生命周期大致可分为4个阶段: 初始化阶段:为Vue实例上初始化一些属性&am…...
从零实现WebRTC(三):WebRTC中重要的API
文章目录一、createOffer二、createAnswer三、SetLocalDescription四、SetRemoteDescription五、addTrack六、addCandidate七、RTCPeerConnection重要事件一、createOffer aPromise myPeerConnection.createOffer(option) opeion { Audio True, Video True, iceReStart:f…...
shell脚本的编写以及shell中语句(嵌入式学习)
shell学习shell脚本编写步骤shell变量功能性语句1.read2.expr3.let4.test逻辑运算符的书写格式结构性语句1.if…then…fi2、case...esac3、for..do..done4、while..do..doneshell脚本 将shell命令按照一定的逻辑顺序实现指定功能,放到一个文件中。文件叫脚本文件&a…...
2023年高新技术企业怎么申报认定
成为高新技术企业可以获得国家和本地区的众多优惠政策,相信很多企业都想申请高企认定,国家高新技术企业又称国家高新技术企业,根据《高新技术企业认定管理办法》规定,国家高新技术企业是指在《国家重点支持的高新技术领域》内&…...
GIS状态检测新技术——振动分析法
提示:唐老师好,我之前因为“阳”了,所以就没有参与汇报,给老师带来不便,请老师见谅。以此篇文章代替课堂汇报。 文章目录前言一、不同故障对应的振动频谱和故障特征量二、GIS设备振动特征估计1.GIS设备状态空间2.粒子滤…...
Python进阶篇(一)-- Django快速上手
1 Django概述 Web框架,就是用于开发Web服务器端应用的基础设施,说得通俗一点就是一系列封装好的模块和工具。事实上,即便没有Web框架,我们仍然可以通过socket或CGI来开发Web服务器端应用,但是这样做的成本和代价在商业…...
读书笔记//来自公众号(1)
——【9大数据分析方法】—— 总结1:多部分方法用于定位问题,相关分析法与指标拆解法可以解释问题。 总结2:抓住两个关键因素:维度(类别)、指标 一、周期性分析 1.常见的周期包括2种:自然周期…...
10款让程序员用了会上瘾的工具
程序员必定会爱上的10款工具,相信肯定有不少是你的心头好,尤其是第4款。 第一款:TrueCryptTrueCrypt 可能很多人没用过,它是一个加密软件,能够对磁盘进行加密。还在担心自己电脑中的重要文件、私密档案被人查看&…...
类和对象(下)(一)
类和对象(下)(一)1.再谈构造函数1.1构造函数体赋值1.2初始化列表1.3explicit关键字2.static成员2.1概念2.2特性3.匿名对象🌟🌟hello,各位读者大大们你们好呀🌟🌟 &#x…...
wordpress 父级 模板/百度推广业务电话
scala :::在过去的一年左右的时间里,Scala编程语言取得了空前的增长,成功地从专业的JVM语言转变为可行的Java替代方案,企业至少应该关注一下。 尽管在Twitter,The Guardian和LinkedIn的生产环境中,它尚未进入主流。 但…...
网站制作切图/拼多多seo是什么意思
在最近项目开发中遇到一个问题,情况是这样的,第一天数据库操作完全正常的,第二天早上来,就报错invalid connection。明明第一天都是正常的,第二天来就报错了,这个问题比较尴尬。于是上网搜索后,…...
专业的seo网站优化公司/江苏seo网络
【单选题】以下程序的输出结果是: def hub(ss, x 2.0,y 4.0): ss x * y ss 10 print(ss, hub(ss, 3…...
怎么看个人做的付费视频网站/深圳seo云哥
目录 正则表达式语法规则 字符 预定义字符集 数量词 贪婪和非贪婪 边界匹配(不消耗匹配字符串中的字符) 逻辑、分组 Python re模块介绍 引入模块 正则检索 正则分割字符串 字符串替换 分组引用 匹配中文 正则表达式语法规则 百度百科简介:…...
在柬埔寨做网站彩票推广/google play服务
让两个对象间建立weak关系 这是为了给两个对象间建立weak关系,当一个对象被释放时,另外一个对象再获取这个值时就是nil,也就是不持有这个对象:) 源码: WeakRelatedDictionary.h 与 WeakRelatedDictionary.m // // WeakRelatedDic…...
公司网站做的好的/百度指数查询入口
一、选择题1. 在一个C 源程序文件中所定义的全局变量,其作用域为( )。A. 所在文件的全部范围 B. 所在程序的全部范围 C. 所在函数的全部范围D. 由具体定义位置和extern 说明来决定范围 答:D【解析】全局变量是在函数外部任意位置上定义的变量,…...