Docker getting started

news/2024/4/30 2:26:30/文章来源:https://blog.csdn.net/surfaceyan/article/details/128997982

系列文章目录

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
  1. 建立Dockerfile
    用于指示Docker如何创建镜像

Dockerfile

# syntax=docker/dockerfile:1FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
  1. 建立容器镜像
docker build -t getting-started .

docker build命令通过通过 Dockerfile 建立容器镜像。在此过程中Docker下载了许多“layer”。因为是从node:18-alpine开始的,又因本地中没有此镜像,需要先下载。

下载完成后,指令从Docker中拷贝到应用中,并通过yarn安装依赖。CMD指令指定从此镜像启动容器时要运行的默认命令。

最后-t表示给镜像打个标签,如getting-started

最后的.表示从当前目录找查Dockerfile文件
在这里插入图片描述

  1. 启动一个应用容器
docker run -dp 3000:3000 getting-started

-d detached模式
-p在主机端口3000与容器端口3000之间创建端口映射,没有端口映射将无法访问应用

  1. 访问应用
http://localhost:3000
  1. 通过Docker Dashboard可查看运行中的容器

三、更新应用

上章容器化了一个todo应用。本章将更新应用和容器镜像。stop and remove容器。

  1. 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>...
  1. docker build
docker build -t getting-started .
  1. 停止,移除容器
# 查看运行中的容器
docker ps
# 停止容器
docker stop <the-container-id>
# 移除容器
docker rm <the-container-id>
# 停止并移除容器
docker rm -f <the-container-id>
  1. 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 volumesBind mounts
共享文件存放在主机的位置由Docker选择用户决定
mount示例 (using --mount)type=volume,src=my-volume,target=/usr/local/datatype=bind,src=/path/to/data,target=/usr/local/data
用容器内容填充新卷YN
支持卷驱动程序YN

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放在另一个容器中
在这里插入图片描述
默认情况下容器与其它容器、进程是隔离的。多个容器之间可通过网络进行通讯,同一个网络下的容器才可进行通讯。

  1. 创建网络
docker network create <app name todo-app>
  1. 启动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
  1. 验证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

  1. 启动一个新的容器,连接到同一个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 的容器即可实现容器间通讯。

  1. 将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

总结

build
run
start, stop, rm
registry
image
容器
本地电脑
volume, bind
容器
容器
容器
network
容器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_258397.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯刷题024——天干地支

2020国赛 题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个&#xff0c;分别为&#xff1a;甲&#xff08;jiǎ&#xff09;、乙&#xff08;yǐ&#xff09;、丙&#xff08;bǐng&#xff09;、丁&#xff08;dīng&#xff09;、戊&#xff08;w&#xff09…

2月第2周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

飞瓜轻数发布2023年2月6日-2月12日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B站…

【C语言技能树】浮点数在内存中的存储

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

企业降本增效的催化剂:敏捷迭代

伴随着开源技术的大爆发&#xff0c;新一代的软件技术如雨后春笋般层出不穷。每家企业在硬件及软件开发上都有许多开源技术可选&#xff0c;目的还是在于提高效率&#xff0c;降低开发成本。 本篇文章&#xff0c;带大家了解下促进企业降本增效的重要理念&#xff1a;敏捷迭代…

信息安全工程

信息安全工程信息安全工程信息安全工程概述信息安全工程理论基础支撑信息安全工程的理论基础质量管理基本概念信息安全工程原理ISSE活动中支持认证和认可的活动信息安全工程监理模型信息安全工程能力评估SSE-CMM&#xff08;系统安全工程能力成熟度模型&#xff09;SSE-CMM 的安…

Spring入门学习

Spring入门学习 文章目录Spring入门学习Spring概述Spring FrameworkIOCIOC容器DIIOC容器的实现类①FileSystemXmlApplicationContext②ClassPathXmlApplicationContext基于XML管理bean入门案例创建类创建xml在Spring配置文件中配置bean测试Spring概述 Spring 是最受欢迎的企业级…

TortoiseSVN的使用

基本概念 版本库 SVN保持数据的地方&#xff0c;所有的文件都保存在这个库中&#xff0c;Tortoise访问的就是远程服务器上的Subversion版本库。 工作拷贝 就是工作副本&#xff0c;可将版本库的文件拷贝到本地中&#xff0c;可以任意修改&#xff0c; 不会影响版本库。在你…

AcWing语法基础课笔记 第二章 printf语句与C++中的判断结构

第二章 printf语句与C中的判断结构 学习语言最好的方式就是实践&#xff0c;每当掌握一个新功能时&#xff0c;就要立即将这个功能应用到实践中。 ——闫学灿 一、printf输出格式 注意&#xff1a;使用printf 时最好添加头文件 #include <cstdio>。 Int、float、double、…

不愧是GitHub点赞飙升的Java10W字面经,面面俱到,太全了!

最新的喜报啊&#xff0c;话不多说&#xff0c;先看图&#xff01;&#xff08;为了保护朋友的隐私&#xff0c;同时还有我自己的隐私&#xff0c;楼主就都打码了~&#xff01;&#xff09; 朋友说到这儿时候我就跟他说&#xff0c;不要只看眼前&#xff0c;要看长远一些&#…

【python】基于Socket的聊天室Python开发

基于Socket的聊天室Python开发一、Socket简述二、创建服务端Server2.1 创建服务端初始化2.2 监听客户端连接2.3 处理客户端消息三、创建客户端Client3.1 创建服务端初始化3.2 发送消息3.3 接收消息3.3 线程工作3.4 线程工作是不是挺好玩的呢&#xff1f;也可以作为课程设计哦&a…

chatgpt系列文章-23.2.15(主要还在发现chatgpt的不足,偏探索,像报告)

Will ChatGPT get you caught? Rethinking of Plagiarism Detection 推荐指数&#xff1a;2 主要内容 文章主要是研究chatgpt出现后&#xff0c;在学术界中可能出现的学术抄袭和剽窃现象。 这篇文章就比较了几种剽窃抄袭软件&#xff0c;来测试是否能够识别chatgpt编写的内…

电子科技大学操作系统期末复习笔记(三):存储器管理

目录 前言 存储器管理 概述 存储管理 存储系统的结构 程序的诞生 空间分类 地址映射 程序链接的方式 静态链接 装入时动态链接 运行时动态链接 程序装入的方式 程序装入的两类三种方法 绝对装入 静态重定位 动态重定位√ 关键点 存储器管理&#xff1a;连续…

人与人之间赚钱的差距在哪里呢?体现在这几个因素中

同样生而为人&#xff0c;同样接受九年制义务教育的熏陶&#xff0c;但最终赚钱能力却千差万别&#xff0c;因此也就形成了我们所谓的圈层&#xff0c;阶层&#xff0c;穷人和富人。 一个人的赚钱能力跟什么有关&#xff1f;资源技能、学历、认知&#xff0c;这些都会决定一个人…

75V的TVS二极管有哪些型号?常用的

瞬态抑制TVS二极管工作峰值反向电压最低3.3V&#xff0c;最高可达513V&#xff0c;甚至更高。很多电子工程师都知道&#xff0c;TVS二极管在实际应用选型过程中&#xff0c;第一步要确认的就是其工作峰值反向电压。2023年春节已过&#xff0c;东沃电子正月初八就开工了&#xf…

招聘链接怎么做_分享招聘小程序制作步骤

招聘小程序的主要用户就是企业招聘端和找工作人员的用户端,下面从这两个端来对招聘小程序开发的功能进行介绍。 企业端功能 1、岗位发布:企业根据自身岗位需求,在招聘app上发布招聘岗位及所需技能。 2.简历筛选:根据求职者提交的简历选择合适的简历,并对公开发布的简历进行筛…

【Python从入门到进阶】7、运算符

接上篇《6、变量规范及类型转换》 上一篇我们学习了Python变量的命名规范以及类型转换。本篇我们来学习Python的运算符部分&#xff0c;包括算数运算符、赋值运算符、比较运算符、逻辑运算符等。 一、运算符含义 运算符用于执行程序代码运算&#xff0c;会针对一个以上操作数…

指 针

1.指针指针的作用: 可以通过指针间接访问内存&#xff08;可以通过指针的保存一个地址&#xff08;指针--地址&#xff09;&#xff09;内存编号是从0开始记录的&#xff0c;一般用十六进制数字表示。可以利用指针变量保存地址指针变量的定义和使用指针变是定义语法: 数据类型 …

【项目精选】基于Javaee的影视创作论坛的设计与实现(视频+论文+源码)

点击下载源码 基于Javaee的影视创作论坛的设计与实现主要用功能包括&#xff1a; 首页推荐、用户管理、影片管理、评论管理、 预告片管理、海报管理、公告管理、数据检索、用户注册与登录等等功能、统结构如下 &#xff08;1&#xff09;后台管理: 管理模块&#xff1a;管理员…

碰撞检测算法分类

包围形法粗糙检测, 包含以下两种类检测外接圆法轴对齐包围矩形&#xff0c; AABB 碰撞检测算法之包围形法分离轴精细检测 BOX vs PolygonOBBseparating Axis Theorem碰撞检测算法之分离轴定理GJKGJK&#xff08;Gilbert–Johnson–Keerthi&#xff09;, 相比 SAT 算法&#xff…

jvisualvm工具使用

jdk自带的工具jvisualvm&#xff0c;可以分析java内存使用情况&#xff0c;jvm相关的信息。 1、设置jvm启动参数 设置jvm参数**-Xms20m -Xmx20m -XX:PrintGCDetails** 最小和最大堆内存&#xff0c;打印gc详情 2、测试代码 TestScheduleClassGc package com.core.schedule;…