Docker getting started

news2024/10/1 7:32:20

系列文章目录

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:1
   
FROM 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 todos

mysql> 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.coloradmin.cn/o/348408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习 Linux 内核书籍推荐

原文链接&#xff0c;欢迎关注&#xff1a; 你为什么学习 Linux 内核&#xff1f; - CodeAllen的回答 - 知乎 https://www.zhihu.com/question/31369673/answer/2894981254 主要是工作需要&#xff0c;其实对于我自己的工作来说&#xff0c;在Linux开发的具体业务和算法才是重…

2023年PMP考试难不难?

整个考试的考察方向转向还是比较大的&#xff0c;基本上以“价值传递”和“以人为本”这两个出发点来考察项目经理所需要的能力。 1}新版提纲题目数量的变化 总题量从200道减少到180道&#xff0c;所以答题时间上相对变的宽裕一些。考试时间230分钟&#xff0c;中间有十分钟休…

前端状态管理:Vuex、Flux、Redux、MobX概念篇

概念准备 【状态管理模式】 可以借鉴 Vuex 官方文档的解释&#xff1a;什么是“状态管理模式” 状态管理的目标&#xff08;意义&#xff09; 各组件通过数据响应机制对共享状态进行高效的状态更新&#xff0c;说白了就是不同组件对需要共享的数据的变更和同步。 1. Vuex …

学网络运维与安全前景怎么样?

近几年&#xff0c;网络安全问题频频爆发&#xff0c;多数人看不到背后的隐患&#xff0c;但是&#xff0c;企业却因此损失惨重。比如&#xff1a;FaceBook数据泄露2018年上半年&#xff0c;FaceBook 5000万用户数据泄露&#xff0c;导致其市值蒸发360亿美元,品牌遭遇声誉危机。…

markdown和latex常用部分参考@注脚@链接跳转@csdn

文章目录refmarkdown和latex常用部分参考typora文档基础语法扩展语法链接内联链接的方式将链接提取出来链接示例typora的支持LinksInline LinksInternal Links&#x1f388;Reference LinksURLs文章内部跳转(Heading IDs)&#x1f388;My Great Heading注脚(Footnotes)&#x1…

攻防世界1.新手练习区

4.攻防世界1.新手练习区 1.view_source 访问url&#xff1a; http://111.200.241.244:48855/ 鼠标点击右键不起作用&#xff0c;F12审查元素 得到flag为cyberpeace{0f3a3e4ab8c8664f3cf40d4240ec7b53} 2.robots 访问url&#xff1a; http://111.200.241.244:34362/ rob…

VMware vSphere 8.0b 发布下载 - 企业级工作负载平台

ESXi 8.0.0b & vCenter Server 8.0.0b GA (General Availability) 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vsphere-8/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 2023-02-14&#xff0c;vSphe…

机器学习笔记之生成模型综述(五)重参数化技巧(随机反向传播)

机器学习笔记之生成模型综述——重参数化技巧[随机反向传播]引言回顾神经网络的执行过程变分推断——重参数化技巧重参数化技巧(随机反向传播)介绍示例描述——联合概率分布示例描述——条件概率分布总结引言 本节将系统介绍重参数化技巧。 回顾 神经网络的执行过程 上一节…

机器视觉----易灵思FPGA

一、机器视觉概述 机器视觉无处不在&#xff0c;产品上如果有了机器视觉&#xff0c;那么这个产品在很大的意义上已经赋予了机器智能。例如机器人、无人机、工业检测&#xff0c;这些都需要机器视觉&#xff0c;但是他们的传感器和算法都不同。我们今天重点讨论工业相机行业的应…

大模型相关技术综述

中文大模型、多模态大模型&大模型训练语料持续迭代大模型演进历史预训练模型word2vecword2vec属于NLP领域无监督学习和比较学习的先祖。精髓在于可以用不带标签的文本语料输入神经网络模型&#xff0c;就可以学习到每个词的带语的词向量表示。它背后原理其实就是人类讲出来…

真实3D地形生成器【免费在线】

Terrain3D是一个免费的在线3D地形生成器&#xff0c;只需指定地球上的坐标&#xff0c;就可以自动生成附近区域的3D地形同时叠加卫星影像&#xff0c;并且可以导出GLTF格式的3D地形模型。 推荐&#xff1a;使用 NSDT场景设计器 快速搭建 3D场景。 使用Terrain3D生成真实世界的3…

字节青训营——秒杀系统设计学习笔记(三)

限流算法 限流顾名思义&#xff0c;就是对请求或并发数进行限制&#xff1b;通过对一个时间窗口内的请求量进行限制来保障系统的正常运行。如果我们的服务资源有限、处理能力有限&#xff0c;就需要对调用我们服务的上游请求进行限制&#xff0c;以防止自身服务由于资源耗尽而…

JavaSE学习day7_02 封装和构造方法

4. 封装 面向对象的三大特征&#xff1a; 封装、继承、多态 封装&#xff1a;对象代表什么&#xff0c;就得封装对应的数据&#xff0c;并提供数据对应的行为。 比如人画圆&#xff1a;”画“这个行为应该封装在圆这个类&#xff0c;为什么&#xff1f;因为”画“圆要知道圆…

Pandas基础与实例——人工智能基础

本文目录一、 Series1. 将列表强转为Series2. 将字典强转为Series3. 访问Series中的数据3.1 第一套检索方法3.2 第二套检索方法4. Series常用属性二、Pandas日期类型数据处理1. 将字符串转为datetime类型2. 与1等价的方式3. 单独取出年月日4. 日期运算5. 生成一组日期6. 生成工…

AJAX笔记(二)Fetch和axios

1、Fetch 1.1、XMLHttpRequest的缺陷 1.2、fetch的get写法 1.3、fetch的post写法 1.4、fetch的put写法 1.5、fetch的patch写法 1.6、fetch的delete写法 2、axios 2.1、axios的介绍 2.2、axios的get写法 2.3、axios的post写法&#xff08;图一json写法和图二三form写法&#x…

Django项目部署-uWSGI

Django项目部署-uWSGIDjango运维部署框架整体部署架构web服务器与web应用服务器的区别部署环境准备安装python3安装mariadb安装Django和相关模块Django托管服务器uWSGI使用uWSGI配置使用Django运维部署框架 整体部署架构 操作系统: Linux 。优势&#xff1a;生态系统丰富&…

NC113 验证IP地址

验证IP地址_牛客题霸_牛客网 描述 编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址 IPv4 地址由十进制数和点来表示&#xff0c;每个地址包含4个十进制数&#xff0c;其范围为 0 - 255&#xff0c; 用(".")分割。比如&#xff0c;172.16.254.1&#…

苹果手机怎么下载手机铃声?图文教程,快速学会

很多小伙伴喜欢使用苹果手机&#xff0c;可是苹果手机里的铃声自己并不是很喜欢听&#xff0c;想要下载一些好听的歌曲更换自己的手机铃声。苹果手机怎么下载手机铃声&#xff1f;别着急&#xff0c;今天小编以图文的方式&#xff0c;教教大家如何使用苹果手机下载手机铃声。 苹…

验证码绕过与识别

目录 验证码绕过 前言 删除cookie绕过 未销毁复用验证码 验证码识别 工具 使用流程 验证码绕过 前言 之前pikachu靶场有两道验证码绕过的题目&#xff0c;分别是(on client 前端验证验证码)和(on server 未销毁复用验证码)&#xff0c;具体见下面的文章 Pikachu靶场…

IDEA热部署JRebel 插件

JRebel 是什么? 在我们的日常开发工作中,一般是都是 IDEA + Tomcat 部署运行 web 项目。项目运行之后,如果你修改了 Java 代码,想要生效就必须得重启 Tomcat 服务器才行。改一次代码就要重启一次,真的是太麻烦了,这会严重影响我们的开发效率。 那么有没有什么办法让我们不…