烟台网站建设方案推广,北京网站建设管庄,做网站西美花街,动态表情包制作软件app系列文章目录
Docker 概述 Docker getting started 文章目录系列文章目录前言一、容器及镜像的概念二、容器化一个应用三、更新应用四、分享应用五、持久化数据存储volume mount 和 bind mount比较Container volumesbind mounts六、跨多容器的应用七、Docker 其它八、Docker 图…系列文章目录
Docker 概述 Docker getting started 文章目录系列文章目录前言一、容器及镜像的概念二、容器化一个应用三、更新应用四、分享应用五、持久化数据存储volume mount 和 bind mount比较Container volumesbind mounts六、跨多容器的应用七、Docker 其它八、Docker 图形化界面显示总结前言
本文主要包含以下内容
将一个应用放在容器中运行介绍持久化数据存储方式Docker图形化界面显示方法 一、容器及镜像的概念
容器
镜像的可运行实例。通过Docker API or CLI可以创建、启动、停止、移动或删除容器。可在本地、虚拟机、云上运行。便捷(可在任意OS上运行)。与其他容器隔离运行独立的软件、二进制文件、配置。
镜像 提供隔离的、定制化的文件系统也包含配置信息、环境变量等。
二、容器化一个应用
git clone https://github.com/docker/getting-started.git建立Dockerfile 用于指示Docker如何创建镜像
Dockerfile
# syntaxdocker/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 classNametext-centerNo items yet! Add one above!/p p classNametext-centerYou 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-idstart 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 volumesBind mounts共享文件存放在主机的位置由Docker选择用户决定mount示例 (using --mount)typevolume,srcmy-volume,target/usr/local/datatypebind,src/path/to/data,target/usr/local/data用容器内容填充新卷YN支持卷驱动程序YN
Container volumes
Volumes可将容器中的某一文件系统路经连接至本地主机上。如果在容器总挂载了该目录其变更也在宿主机上可见。如果我们跨容器重新启动装载相同的目录我们将看到相同的文件。
# create volume
docker volume create filename
# 在run一个镜像时加上volumevolume文件所在的目录就成了volume目录
docker run -dp 3000:3000 --mount typevolume,srctodo-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 typebind,src$(pwd),target/src ubuntu bashsrc为host的目录target为容器的目录 运行此条命令后 host的$(pwd)目录和 容器的/src目录实时同步
在容器中运行宿主机中正在开发的应用
docker run -dp 3000:3000 \-w /app --mount typebind,src$(pwd),target/app \node:18-alpine \sh -c yarn install yarn run devdp 3000:3000 分离模式指定host和容器的端口映射(用于访问app网页)-w /app 设置命令行的工作目录--mount typebind, 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.jsondev脚本启动了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_PASSWORDsecret \-e MYSQL_DATABASEtodos \mysql:8.0验证2是否成功
docker exec -it mysql-container-id mysql -u root -pmysql 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 imagenamedP 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不仅仅是一个有效的hostnameDocker还会把他解析成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_HOSTmysql \-e MYSQL_USERroot \-e MYSQL_PASSWORDsecret \-e MYSQL_DBtodos \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 versionDocker 组件可帮助快速构建跨容器的应用配置好后只需一条命令即可其多多容器应用。
其它
# 扫描docker 镜像的漏洞
docker scan image-name# 查看镜像的layers
docker image history image-name# 通过Layer caching加速镜像的构建等八、Docker 图形化界面显示
把docker镜像看做一台没配显示器的电脑程序可以运行但是没地方显示。
而linux目前的主流图像界面服务X11又支持客户端/服务端Client/Server的工作模式。
只要在容器启动的时候将『unix:端口』或『主机名:端口』共享给dockerdocker就可以通过端口找到显示输出的地方和linux系统共用显示。
# 安装x11界面服务
apt-get install x11-xserver-utils
# 为所有用户开放权限
xhost # 在启动容器
docker run -it \-v /tmp/.x11-unix:/tmp/.x11-unix \-e DISPLAYunix$DISPLAY -e GDK_SCALE \-e GDK_DPI_SCALE --nethost ubuntu /bin/bash然后安装个小程序测试是否成功
# apt-get update
apt-get install xarclock
xarclock总结
#mermaid-svg-sQUfy7FXVrz2Sh3G {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-sQUfy7FXVrz2Sh3G .error-icon{fill:#552222;}#mermaid-svg-sQUfy7FXVrz2Sh3G .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sQUfy7FXVrz2Sh3G .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-sQUfy7FXVrz2Sh3G .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sQUfy7FXVrz2Sh3G .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sQUfy7FXVrz2Sh3G .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sQUfy7FXVrz2Sh3G .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sQUfy7FXVrz2Sh3G .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sQUfy7FXVrz2Sh3G .marker.cross{stroke:#333333;}#mermaid-svg-sQUfy7FXVrz2Sh3G svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sQUfy7FXVrz2Sh3G .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-sQUfy7FXVrz2Sh3G .cluster-label text{fill:#333;}#mermaid-svg-sQUfy7FXVrz2Sh3G .cluster-label span{color:#333;}#mermaid-svg-sQUfy7FXVrz2Sh3G .label text,#mermaid-svg-sQUfy7FXVrz2Sh3G span{fill:#333;color:#333;}#mermaid-svg-sQUfy7FXVrz2Sh3G .node rect,#mermaid-svg-sQUfy7FXVrz2Sh3G .node circle,#mermaid-svg-sQUfy7FXVrz2Sh3G .node ellipse,#mermaid-svg-sQUfy7FXVrz2Sh3G .node polygon,#mermaid-svg-sQUfy7FXVrz2Sh3G .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sQUfy7FXVrz2Sh3G .node .label{text-align:center;}#mermaid-svg-sQUfy7FXVrz2Sh3G .node.clickable{cursor:pointer;}#mermaid-svg-sQUfy7FXVrz2Sh3G .arrowheadPath{fill:#333333;}#mermaid-svg-sQUfy7FXVrz2Sh3G .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sQUfy7FXVrz2Sh3G .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sQUfy7FXVrz2Sh3G .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-sQUfy7FXVrz2Sh3G .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-sQUfy7FXVrz2Sh3G .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sQUfy7FXVrz2Sh3G .cluster text{fill:#333;}#mermaid-svg-sQUfy7FXVrz2Sh3G .cluster span{color:#333;}#mermaid-svg-sQUfy7FXVrz2Sh3G div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-sQUfy7FXVrz2Sh3G :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}buildrunstart, stop, rmregistryimage容器#mermaid-svg-ASkBHMhtwt5ZxTZQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .error-icon{fill:#552222;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .marker.cross{stroke:#333333;}#mermaid-svg-ASkBHMhtwt5ZxTZQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .cluster-label text{fill:#333;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .cluster-label span{color:#333;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .label text,#mermaid-svg-ASkBHMhtwt5ZxTZQ span{fill:#333;color:#333;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .node rect,#mermaid-svg-ASkBHMhtwt5ZxTZQ .node circle,#mermaid-svg-ASkBHMhtwt5ZxTZQ .node ellipse,#mermaid-svg-ASkBHMhtwt5ZxTZQ .node polygon,#mermaid-svg-ASkBHMhtwt5ZxTZQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .node .label{text-align:center;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .node.clickable{cursor:pointer;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .arrowheadPath{fill:#333333;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .cluster text{fill:#333;}#mermaid-svg-ASkBHMhtwt5ZxTZQ .cluster span{color:#333;}#mermaid-svg-ASkBHMhtwt5ZxTZQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ASkBHMhtwt5ZxTZQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}本地电脑volume, bind容器容器容器network容器