Docker 快速上手学习入门教程

news2024/11/16 6:41:02

目录

1、docker 的基础概念

2、怎样打包和运行一个应用程序?

3、如何对 docker 中的应用程序进行修改?

4、如何对创建的镜像进行共享?

5、如何使用 volumes 名称对容器中的数据进行存储?// 数据挂载

6、另一种挂载方式:目录挂载

7、实现容器之间的相互通信

8、使用 Docker Compose 简化多个容器之间的共享操作


1、docker 的基础概念

什么是容器?

        官方解释是,docker 容器是机器上的沙盒进程,它与主机上的所有其他进程隔离。所以容器只是操作系统中被隔离开来的一个进程,所谓的容器化,其实也只是对操作系统进行欺骗的一种语法糖。

什么是容器镜像?

        容器运行的依赖文件就是镜像,通过镜像可以创建多个容器。

2、怎样打包和运行一个应用程序?

(1)获取程序源文件

        准备:需要安装 git,使用 git 拉取远程代码到本地。 下边程序是一个 docker 官方的示例:

git clone https://github.com/docker/getting-started.git

(2)创建容器镜像

        创建容器镜像,需要用到 Dockerfile 文件。Dockerfile 只是一个基于文本的文件,没有文件扩展名。Dockerfile 中包含 Docker 用来创建容器映像的指令脚本。

        创建 Dockerfile 文件:在下载的 getting-started 项目中创建空的 Dockerfile 文件(注意该文件没有任何文件格式)

        填充 Dockerfile 文件内容如下(关于 Dockerfile 文件的编写后续会有专门的介绍,这里只需要知道创建容器镜像需要使用到 Dockerfile 文件即可):

# syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000

        在 Dockerfile 文件的当前目录下(app 目录下),通过 docker build 命令创建容器镜像:

docker build -t getting-started .
  •  -t 表示镜像的 tags,这里的标签名称为 getting-started
  • . 表示 docker build 命令从当前文件夹下寻找 Dockerfile 文件

(3)启动运行容器        

        创建镜像成功后,使用 docker images 命令就可以在系统中查看到创建的镜像了。查看镜像后使用 docker run 命令运行创建的镜像文件:

docker run -dp 3000:3000 getting-started

        -d 表示在后台运行容器,-p 表示创建容器和本机的端口映射,端口映射是必须的,不然无法对容器中的程序进行访问。// 有人也说容器是一个虚拟机,这样想似乎能更好的解释端口映射

        访问 http://localhost:3000/ 出现以下界面,说明容器启动成功:

3、如何对 docker 中的应用程序进行修改?

        如果我们修改了应用程序,要使修改生效,就需要重新创建镜像文件(重复文章第二节中的过程)。需要注意的是,为避免端口冲突,应该先停止正在运行的容器。以下是操作容器的一些命令:

docker ps 可以获取到容器的id
docker stop <the-container-id>  通过id停止一个容器
docker rm <the-container-id>    容器停止后,删除一个容器
docker rm -f <the-container-id> -f 即force,表示强制删除

4、如何对创建的镜像进行共享?

(1)创建一个远程仓库

        如果没有 Docker ID,可以在 Docker Hub 上注册用户,然后使用 Docker Hub 创建远程仓库。创建远程仓库的步骤在官方文档中有详细介绍(文档链接地址在文章最后),大致与 git 创建远程仓库,然后推送代码的过程相似。 

(2)把镜像推送到远程仓库

        把镜像推送到远程仓库后,其他人就可以下载到你的镜像了,常用的命令如下:

docker push YOUR-USER-NAME/getting-started:tagname // 推送镜像
docker tag getting-started YOUR-USER-NAME/getting-started  //给镜像打标签
docker push YOUR-USER-NAME/getting-started // 拉取镜像

5、如何使用 volumes 名称对容器中的数据进行存储?// 数据挂载

        每次启动容器时,之前容器更新的数据都会被清除。这是因为每个容器都有自己“独立的空间”来创建/更新/删除文件。这些更改都不会在另一个容器中看到,即使它们使用的是相同的镜像。// 容器是相互隔离的

        解决上述问题的思路:使用 volumes 对数据进行存储。

        通过 volumes 可以将容器中的具体文件系统路径挂载到主机。如果容器中的一个目录被挂载,那么在主机上也会看到该目录中的更改。如果我们在容器重新启动时挂载同一个目录,我们将看到相同的文件。// docker 提供了两种挂载方式:数据挂载和目录挂载

(1)使用 docker volume create 命令创建 volume,todo-db 为 volume 的名称

docker volume create todo-db

(2)使用 volume 名称进行挂载,/etc/todos 路径下的所有更改都会同步到 volume 中,使用同一个 volume 的其他容器也能够看到相同的信息

// 默认情况下,todo 应用程序将其数据存储在 SQLite 数据库中的 /etc/todos/todo.db 文件中,

docker run -dp 3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started

        那么,当我们创建容器卷(volume)后,容器中的文件具体保存在物理机的哪个地方呢?使用 docker volume inspect 命令,查看容器卷的详细信息

$ docker volume inspect todo-db
[
    {
        "CreatedAt": "2023-02-07T01:34:40Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
        "Name": "todo-db",
        "Options": {},
        "Scope": "local"
    }
]

        Mountpoint 就是文件在磁盘上的具体存储路径(自动生成的),但是,在大多数计算机上,这个路径需要具有根访问权限才能从主机访问此目录。// windows 系统也是这个路径,这个路径在 win 系统上不能直接访问,因此会比较麻烦

6、另一种挂载方式:目录挂载

        目录挂载:允许将主机文件系统中的一个目录共享到容器中。以下是目录挂载和容器卷挂载的区别:

命名卷(volume绑定挂载(目录挂载)
主机存储位置Docker 选择自定义
绑定示例

type=volume,

src=my-volume,target=/usr/local/data

type=bind,

src=/path/to/data,target=/usr/local/data

用容器内容填充新卷
支持volume驱动程序

        示例:在目录 getting-started/app 输入如下命令(win),注意,使用的是 PowerShell 而不是 cmd 命令启用的黑窗口,如果仍然报错可以使用编辑工具把以下命令编辑成一行

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 端口映射
  • -w /app 设置工作目录或命令运行的当前目录
  • --mount type=bind,src="$(pwd)",target=/app 把主机的当前目录绑定到容器中的 /app 目录
  • node:18-alpine 程序运行需要依赖的基础镜像(在上文 DockerFile 中也有写)
  • sh -c "yarn install && yarn run dev" 使用 sh 运行 shell,使用 yarn install 安装依赖包,使用 yarn run dev 启动一个服务(dev 脚本定义在 getting-started\app\package.json 文件中,它会启动 nodemon)

        nodemon 是一个工具,当程序有改动时,nodemon 程序用来自动重启容器。当然,我们也可以用第二节提到的步骤对程序进行打包然后重新启动。

        容器启动后,使用如下命令查看 docker 的运行日志:

docker logs -f <container-id>

7、实现容器之间的相互通信

        默认情况下,docker 之间是相互独立的,彼此之间相互隔离,那么怎么样让相互隔离的两个容器进行通信呢?// 比如部署应用程序的 docker 和部署数据库的 docker 之间进行通信

        答案是:在 docker 之间建立通信网络,在同一个通信网络的不同容器之间可以进行相互通信。一般将容器放到一个网络中有两种方法:1、在启动容器时进行分配,2、连接到已有的容器的网络。下边将分别使用到这两种方式。// 每一节的案例都需要关闭之前启动的容器,避免端口冲突

(1)创建一个通信网络

docker network create todo-app

(2)启动一个 mysql 容器,并连接到 todo-app 网络(win PowerShell 版)

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
  • --network-alias 指定运行容器的别名,使用别名替换掉具体的 ip,更方便在网络中查找容器
  • -v todo-mysql-data:/var/lib/mysql 该命令会自动创建容器卷 todo-mysql-data,然后存储mysql中的数据库数据(/var/lib/mysql 为数据库存储数据的路径)

        为了查看数据库容器是否已经启动,可以尝试进入容器进行查看:// 密码是 secret,脚本中有指定

docker ps // 查看正在运行中的容器
docker exec -it <mysql-container-id> mysql -u root -p

        如果输入密码可进行登录,说明数据库已经启动了,尝试以下命令,验证 mysql 正常

mysql> SHOW DATABASES;
mysql> exit;

        那么当 mysql 启动后,怎样找到这个容器呢?答案是,使用一个  nicolaka/netshoot 的网络工具。首先我们通过 docker 来安装这个工具

docker run -it --network todo-app nicolaka/netshoot

        安装完后,就可以使用这个 DNS 工具了。//下边的 mysql 就是启动容器时指定的别名

dig mysql/容器id

        然后就能看到 mysql 容器的相关网络信息 :

        我们看到 mysql 容器的 ip 为 172.19.0.2(todo-app 网络中的地址),一般来说,我们仅仅通过 mysql 别名就可以定位到这个地址了,而不需要显示去指定它。

(3)启动应用程序容器,并连接到 mysql 容器

        todo 应用程序支持设置一些环境变量来指定 MySQL 连接设置

  • MYSQL_HOST - MySQL server 主机名称
  • MYSQL_USER - 数据库连接用户
  • MYSQL_PASSWORD - 数据库连接密码
  • MYSQL_DB - 连接的 mysql 的具体数据库

        在 getting-started\app 目录下运行以下命令(win PowerShell 版)

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 的启动日志了

        此时,我们再打开程序http://localhost:3000/往项目中添加 items,然后进入到数据库容器就可以查看到刚才添加的数据了

docker exec -it <mysql-container-id> mysql -p todos  //进入数据库容器
select * from todo_items; // 查看表中数据

        至此,我们就实现了两个容器之间的相互通信。

8、使用 Docker Compose 简化多个容器之间的共享操作

        Docker Compose 用于帮助定义和共享多容器中的应用程序。通过 Compose,我们可以创建一个 YAML 文件来定义服务,并通过一个命令,就可以启动或停止所有服务。

(1)安装  Docker Compose

        如果在 win 环境安装了 Docker Desktop,那么默认情况下就已经安装了 Docker Compose,如果是 linux 环境那么需要单独进行安装,安装教程点击这里。安装完后可以查看该工具的版本:

docker compose version

(2)编写 Compose file 文件

        在 getting-started\app 目录下创建一个 docker-compose.yml 文件

        然后在 docker-compose.yml 文件中填充以下内容:// 文档的具体编写参照文末的文档,这里只介绍大致步骤

services:
  app:
    image: node:18-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos

  mysql:
    image: mysql:8.0
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:

 (3)批量启动容器

        在 getting-started\app 目录下执行以下命令,-d 表示后台启动

docker compose up -d

        然后你会看到如下输出信息:

         信息中显示容器卷和通信网络都被创建了,默认情况下,Docker Compose 会自动为应用程序堆栈创建一个网络(这就是为什么我们不需要在 Compose 文件中定义一个网络的原因)。

        至此,所有的容器就都成功启动了,如果你安装了 Docker Desktop,你将看到以下界面:

(4)批量关闭和移除容器

        使用以下命令可以批量关闭和移除容器

docker compose down

        需要注意的是,以上命令并不会删除创建的容器卷,删除容器卷需要使用单独的命令来操作。

参考文档:Overview | Docker Documentation

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

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

相关文章

Mongodb WT_PANIC: WiredTiger library panic

文章目录故障现象排查过程1.查看Log2.同步恢复数据故障现象 周五突然收到Mongo实例莫名奇妙挂了告警&#xff0c;一般都是RS复制集架构模式&#xff08;5节点&#xff09;&#xff0c;查看此实例角色为SECONDAR&#xff0c;挂了暂时不影响线上业务&#xff0c;但还是需要尽快修…

前端智能化在淘宝的2022实践总结

过去十年是智能化蓬勃发展的十年&#xff0c;但未来十年会是智能化渗入各领域彻底改变我们生活和工作的十年。阿里前端智能化方向小组历经 4 年的实践和演变&#xff0c;在前端融入业务技术团队和终端融合的背景之下&#xff0c;前端智能化小组在2022年更多以优化拓展基础业务工…

【计算机网络】因特网概述

文章目录因特网概述网络、互联网和因特网互联网历史与ISP标准化与RFC因特网的组成三种交换方式电路交换分组交换和报文交换三种交换方式的对比与总结计算机网络的定义和分类计算机网络的定义计算机网络的分类计算机网络的性能指标速率带宽吞吐量时延时延带宽积往返时间利用率丢…

球员分析-前锋

1、球员位置 1.1柱式中锋 球员&#xff1a;吉鲁、奥斯梅恩、米特罗维奇 1.2防守型前锋 球员&#xff1a;劳塔罗、瓦尔迪、维尔纳 1.3抢点前锋 球员&#xff1a;伊卡尔迪、曼联c罗、因扎吉 1.4组织型前锋 球员&#xff1a;凯恩、本泽马、迪巴拉 2、战术职责 2.1柱式中锋&#xf…

设计模式-状态机模式

参考 什么是状态机&#xff1f; 设计模式-状态机模式 什么是状态机(有限状态自动机) 可以把状态机比作方程式, 你输入当前信息, 就能得到下一个信息 举个例子, 按钮门有两个状态, 关闭状态和打开状态, 如果按下开门按钮, 门的状态就从关闭到打开 状态机就是接受门当前状态…

极兔一面:10亿级ES海量搜索狂飙10倍,该怎么办?

背景说明&#xff1a; ES高性能全文索引&#xff0c;如果不会用&#xff0c;或者没有用过&#xff0c;在面试中&#xff0c;会非常吃亏。 所以ES的实操和底层原理&#xff0c;大家要好好准备。 另外&#xff0c;ES调优是一个非常、非常核心的面试知识点&#xff0c;大家要非…

就业大山之下的网络安全:安逸的安服仔

从去年开始&#xff0c;各个互联网大厂就接二连三的放出了裁员消息&#xff0c;整个互联网行业好像都处于寒冬状态。微博、小米、滴滴、知乎、拼多多等在内的一大批互联网知名企业&#xff0c;也相继传出“人员优化”的消息。 除了国内市场的萧条&#xff0c;国外市场也是不容…

kubernetes教程 --Pod调度

Pod调度 在默认情况下&#xff0c;一个Pod在哪个Node节点上运行&#xff0c;是由Scheduler组件采用相应的算法计算出来的&#xff0c;这个过程是不受人工控制的。但是在实际使用中&#xff0c;这并不满足的需求&#xff0c;因为很多情况下&#xff0c;我们想控制某些Pod到达某…

springboot simple (13) springboot Elasticsearch(Elasticsearch8.5.1)

这里首先简单的介绍了Elasticsearch&#xff0c;然后实现了springboot集成Elasticsearch。 版本&#xff1a; Elasticsearch&#xff1a;v8.5.1 Kibana&#xff1a;v8.5.1 springboot集成elasticsearch有两种方式。 1&#xff09;rest客户端RestHingLevelClient&#xff1b; …

2.2 BeautifulSoup 装载HTML文档

HTML文档结点的查找工具很多&#xff0c;其中 BeautifulSoup 是功能强大且十分流行的查找工具之一。1. BeautifulSoup 的安装安装&#xff1a;pip install bs4导包&#xff1a;from bs4 import BeautifulSoup2. BeautifulSoup 装载HTML文档如果 doc 是一个 HTML 文档&#xff0…

fast planner总结

一、前端 kinodynamic A*算法动力学路径搜索 1.1 路径搜索的主要函数为kinodynamicAstar类的search函数 int KinodynamicAstar::search(Eigen::Vector3d start_pt, Eigen::Vector3d start_v, Eigen::Vector3d start_a,Eigen::Vector3d end_pt, Eigen::Vector3d end_v, bool ini…

DPDK — Userspace PMD 源码分析

目录 文章目录目录PMD driver 通过 IGB_UIO 与 UIO 进行交互注册一个 UIO 设备PMD 的应用层实现PMD 同样支持中断处理方式PMD driver 通过 IGB_UIO 与 UIO 进行交互 IGB_UIO 内核模块的另一个主要功能就是让用于态的 PMD 网卡驱动程序得以与 UIO 进行交互。对于 PMD 的实现来说…

松下PLC通过fpwin上传写入MRTC模块方法

目录 PLC程序上传方法 加密模块使用 PLC程序上传方法 手动将PLC模式设置为prog模式查看PLC是否设置为禁止上传查询指示灯是否变蓝&#xff0c;变蓝则需要将PLC禁止上传功能取消。 3.当上述动作操作完成后&#xff0c;将PLC程序导入到PLC中。为了配合加密程序使用&#xff0c;…

进程通信方式

无名管道( pipe )&#xff1a; 管道是一种半双工的通信方式&#xff0c;数据只能单向流动&#xff0c;而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。高级管道&#xff08;popen&#xff09;&#xff1a; 将另一个程序当做一个新的进程在当前程序进…

主成分分析(PCA)原理详解

1. 相关背景 在许多领域的研究与应用中&#xff0c;通常需要对含有多个变量的数据进行观测&#xff0c;收集大量数据后进行分析寻找规律。多变量大数据集无疑会为研究和应用提供丰富的信息&#xff0c;但是也在一定程度上增加了数据采集的工作量。更重要的是在很多情形下&…

Windows server——部署web服务

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 本章重点 一.web讲解 1.WWW概述 &#xff08;1&#xff09;WWW服务概述 &…

Linux应用编程下连接本地数据库进行增删改查系列操作

文章目录前言一、常用SQL操作语句二、相关函数解析三、连接本地数据库四、编译运行五、程序源码前言 本篇为C语言应用编程下连接Linux本地数据库进行增删改查系列操作。 在此之前&#xff0c;首先当然是你需要具备一定的数据库基础&#xff0c;所以下面我先列出部分常用的SQL…

如何利用文件上传漏洞-以及如何修复它们

目录什么是文件上传漏洞&#xff1f;文件上传请求如何工作为什么文件上传漏洞是个问题&#xff1f;漏洞 #1&#xff1a;通过文件内容远程代码执行&#xff08;Web Shell 上传&#xff09;绕过黑名单保护案例 1&#xff1a;案例 2&#xff1a;案例 3&#xff1a;案例 4&#xff…

【Spark分布式内存计算框架——Spark SQL】10. External DataSource(上)数据源与格式

第六章 External DataSource 在SparkSQL模块&#xff0c;提供一套完成API接口&#xff0c;用于方便读写外部数据源的的数据&#xff08;从Spark 1.4版本提供&#xff09;&#xff0c;框架本身内置外部数据源&#xff1a; 在Spark 2.4版本中添加支持Image Source&#xff08;图…

音频信号处理笔记(一)

相关课程&#xff1a;【音频信号处理及深度学习教程】 文章目录01 信号的时域分析1.1 分帧1.1.1 幅值包络1.1.2 均方根能量0 信号的叠加&#xff1a;https://teropa.info/harmonics-explorer/ 一个复杂信号分解成若干简单信号分量之和。不同个频率信号的叠加: 由于和差化积&a…