0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通过Desktop学Docker也太简单了

dyquk4xk2p3d 来源:良许Linux 2023-06-09 16:55 次阅读

后端系统会部署很多服务,包括我们自己开发的服务,还有 mysql、redis 等中间件的服务,部署它们需要一系列依赖的安装、环境变量的设置等等。

如果你要部署多台机器的话,同样的操作要重复多次,万一哪一步漏掉了,服务就跑不起来了。

就很麻烦。

而 Docker 就能完美解决这个问题:

它把系统的所有文件封装成一个镜像,镜像跑起来作为容器,它可以在一台机器上跑多个容器,每个容器都有独立的操作系统环境,比如文件系统、网络端口等,在容器内跑各种服务。

这样整个环境都保存在这个镜像里,部署多个实例只要通过这个镜像跑多个容器就行。

490099bc-0692-11ee-962d-dac502259ad0.png

这也是为什么它的 logo 是这样的:

4922b33a-0692-11ee-962d-dac502259ad0.png

Docker 提供了 Docker Hub 镜像仓库,可以把本地镜像 push 到仓库或者从仓库 pull 镜像到本地。

4942a8b6-0692-11ee-962d-dac502259ad0.png

我们 pull 个镜像下来试试看:

首先需要安装 Docker,直接从官网下载 docker desktop 就行:

4995314e-0692-11ee-962d-dac502259ad0.png

它内置了 docker 命令。

把它安装到系统之后,可以在命令行看下 docker 命令是否可用:

49a77908-0692-11ee-962d-dac502259ad0.png

49c78e1e-0692-11ee-962d-dac502259ad0.png

如果不可用,那要设置下这个:

49f3de42-0692-11ee-962d-dac502259ad0.png

点击 Settings > Advanced,里面有两种安装路径,如果是 /user/local/bin,那 docker 命令就是直接可用的,因为这个路径在 PATH 变量里。

如果是第二种,那就需要手动把 $HOME/.docker/bin 加到 PATH 环境变量里。

然后我们来看看 docker desktop 的界面:

4a277d88-0692-11ee-962d-dac502259ad0.png

4a329c22-0692-11ee-962d-dac502259ad0.png

images 是本地的所有镜像,containers 是镜像跑起来的容器。

docker desktop 可以可视化的管理它们,很方便。

我们 pull 一个镜像试试看。

4a89b818-0692-11ee-962d-dac502259ad0.png

搜索 nginx 镜像,点击 pull(搜索这步需要科学上网,不然搜不到)。

pull 下来之后,就可以在本地 images 看到了:

4ac8564a-0692-11ee-962d-dac502259ad0.png

点击 run 会让你填一些参数

4ae5070e-0692-11ee-962d-dac502259ad0.png

首先是名字,如果不填,docker desktop 会给你生成随机的容器名字。

就是这种:

4aefc914-0692-11ee-962d-dac502259ad0.png

然后是端口,容器内跑的 nginx 服务是在 80 端口,你要把宿主机的某个端口映射到容器的 80 端口才可以访问。

接下来是数据卷 volume,这个是把宿主机某个目录挂到容器内。

因为容器是镜像跑起来的,下次再用这个镜像跑的还是同样的容器,那你在容器内保存的数据就会消失。

所以我们都是把某个宿主机目录,挂载到容器内的某个保存数据的目录,这样数据是保存在宿主机的,下次再用镜像跑一个新容器,只要把这个目录挂载上去就行。

至于环境变量,这个就很容易理解了。

我们分别设置一下:

4b10cd12-0692-11ee-962d-dac502259ad0.png

挂载本地的 /tmp/aaa 到容器内的 /user/share/nginx/html 目录。

点击 run:

4b386dcc-0692-11ee-962d-dac502259ad0.png

可以看到容器内的 nginx 服务跑起来了。

我们在 /tmp/aaa 目录下添加一个 index.html:

4b74fc2e-0692-11ee-962d-dac502259ad0.png

浏览器访问 http://localhost 就可以访问到:

4b7a1a10-0692-11ee-962d-dac502259ad0.png

这就说明数据卷挂载成功了。

点击 files 标签就可以看到容器内的文件。

可以看到 /usr/share/nginx/html 被标识为 mounted,就是挂载目录的意思:

4b92f6ac-0692-11ee-962d-dac502259ad0.png

我们再在本地添加一个文件:

4bc9aa9e-0692-11ee-962d-dac502259ad0.png

你会发现容器内这个目录内容也变了:

4be1ec4e-0692-11ee-962d-dac502259ad0.png

这就是 volume 挂载的作用。

如果你挂载某些目录报错,是因为 docker desktop 挂载的目录是需要配置的,在 Settings > Resources > File Sharing 里加一下就行:

4be85232-0692-11ee-962d-dac502259ad0.png

至于挂载到的目录,在镜像搜索结果页有写:

4c161f78-0692-11ee-962d-dac502259ad0.png

通过命令行 docker run 来跑镜像, -v 是指定挂载的数据卷,后面的 :ro 代表 readonly,也就是容器内这个目录只读,:rw 表示容器内可以读写这个目录。

这就是数据卷的作用。

此外,你还可以进入到容器内执行各种命令:

4c4576d8-0692-11ee-962d-dac502259ad0.png

是不是感觉 docker 学起来还挺简单的?

docker 常用的就是这些东西。

当然,在服务器上没有 Docker Desktop 这种东西,还是要敲命令的。

比如我们点击 pull 按钮,就相当于执行了 docker pull:

dockerpullnginx:latest

latest 是标签,也就是这个:

4c8cbf52-0692-11ee-962d-dac502259ad0.gif

然后我们点击 run 按钮,填了个表单,就相当于执行了 docker run:

dockerrun--namenginx-test2-p80:80-v/tmp/aaa:/usr/share/nginx/html-eKEY1=VALUE1-dnginx:latest

-p 是端口映射

-v 是指定数据卷挂载目录

-e 是指定环境变量

-d 是后台运行

对照下前面可视化界面,是不是瞬间就懂了:

4c9b630e-0692-11ee-962d-dac502259ad0.png

docker run 会返回一个容器的 hash:

4cd11ae4-0692-11ee-962d-dac502259ad0.png

就是这里的 id:

4cf14d50-0692-11ee-962d-dac502259ad0.png

这个界面可以用 docker ps 来获取:

4d0c981c-0692-11ee-962d-dac502259ad0.png

它是显示容器列表的,默认是运行中的。

想显示全部的,可以加个 -a

4d1a80d0-0692-11ee-962d-dac502259ad0.png

除了 container 列表,image 镜像列表也可以通过 docker images 命令获取:

4d4d7c6a-0692-11ee-962d-dac502259ad0.png

我们在容器的 terminal 里执行命令,对应的是 docker exec 命令:

4d7a59d8-0692-11ee-962d-dac502259ad0.png

4da835ec-0692-11ee-962d-dac502259ad0.png

-i 是 terminal 交互的方式运行

-t 是 tty 终端类型

然后指定容器 id 和 shell 类型,就可以交互的方式在容器内执行命令了。

查看日志,对应 docker logs 命令:

4db1a596-0692-11ee-962d-dac502259ad0.png

4ded5d5c-0692-11ee-962d-dac502259ad0.png

输入 exit 退出:

4e229346-0692-11ee-962d-dac502259ad0.png

docker inspect 可以查看容器的详情

4e4379e4-0692-11ee-962d-dac502259ad0.png

对应 desktop 里的 inspect 的 tab:

4e509e6c-0692-11ee-962d-dac502259ad0.png

docker volume 可以管理数据卷:

4e751ea4-0692-11ee-962d-dac502259ad0.png

对应 desktop 的这部分:

4e98bf30-0692-11ee-962d-dac502259ad0.png

此外,还有这些常用命令:

docker start:启动一个已经停止的容器

docker rm:删除一个容器

docker stop:停止一个容器

都可以通过 docker desktop 很方便的操作。

那如果我们要自己制作一个这样的镜像,怎么做呢?

docker 容器内就是一个独立的系统环境,想想如果在这样一个系统上,要安装 nginx 服务,怎么做呢?

需要执行一些命令、复制一些文件进来,然后启动服务。

制作镜像自然也要进行这样的过程,不过可以自动化。

只要在 dockerfile 里声明要做哪些事情,docker build 的时候就会根据这个 dockerfile 来自动化构建出一个镜像来。

比如这样:

FROMnode:latest WORKDIR/app COPY.. RUNnpminstall-ghttp-server EXPOSE8080 CMD["http-server","-p","8080"]

这些指令的含义如下:

FROM:基于一个基础镜像来修改

WORKDIR:指定当前工作目录

COPY:把容器外的内容复制到容器内

EXPOSE:声明当前容器要访问的网络端口,比如这里起服务会用到 8080

RUN:在容器内执行命令

CMD:容器启动的时候执行的命令

我们先通过 FROM 继承了 node 基础镜像,里面就有 npm、node 这些命令了。

通过 WORKDIR 指定当前目录。

然后通过 COPY 把 Dockerfile 同级目录下的内容复制到容器内,这里的 . 也就是 /app 目录

之后通过 RUN 执行 npm install,全局安装 http-server

通过 EXPOSE 指定要暴露的端口

CMD 指定容器跑起来之后执行的命令,这里就是执行 http-server 把服务跑起来。

把这个文件保存为 Dockerfile,然后在同级添加一个 index.html

4edca452-0692-11ee-962d-dac502259ad0.png

然后通过 docker build 就可以根据这个 dockerfile 来生成镜像。

dockerbuild-taaa:ccc.

aaa 是镜像名,ccc 是镜像的标签

4ee36f80-0692-11ee-962d-dac502259ad0.png

FROM 是继承一个基础镜像,看输出也可以看出来,前面都是 node 镜像的内容,会一层层下载下来。

最后才是本地的我们添加的那些。

这时你在 desktop 的 images 列表里就可以看到这个镜像了:

4f2a1804-0692-11ee-962d-dac502259ad0.png

然后执行 docker run 把这个镜像跑起来,用 desktop 我们就直接点击 run 按钮了:

4f4d82c6-0692-11ee-962d-dac502259ad0.png

会让你输入这些内容:

4f6cbed4-0692-11ee-962d-dac502259ad0.png

是不是前面用 nginx 镜像的感觉回来了?这次是我们自己 build 的镜像。

指定容器名、映射的端口、点击 run:

4f7afd8c-0692-11ee-962d-dac502259ad0.png

然后可以看到容器内的日志,服务启动成功了:

4fb506da-0692-11ee-962d-dac502259ad0.png

当然,容器内打印的是 8080 端口,但在容器外要用映射的 8888 端口访问:

访问 http://localhost:8888 就可以看到我们在 html 写的内容了:

4fd7cf08-0692-11ee-962d-dac502259ad0.png

在容器内页打印了一条访问日志:

4ff2a594-0692-11ee-962d-dac502259ad0.png

至此,我们写的第一个 dockerfile 和 build 出的第一个镜像就跑成功了!

我们在 files 里看看 /app 下是啥内容:

4ffe2a5e-0692-11ee-962d-dac502259ad0.png

双击 index.html,可以看到这就是我们 build 镜像的时候 COPY 进去的文件。

但是我们想修改静态文件怎么办呢?

进入容器内改太麻烦,不如把这个 /app 目录设置为挂载点吧。

这样改下 Dockerfile:

50269c96-0692-11ee-962d-dac502259ad0.png

然后重新 build 出一个镜像来:

docker build -t aaa:ddd -f 2.Dockerfile

因为现在不是默认的 Dockerfile 了,需要用 -f 指定下 dockefile 的文件名。

50573482-0692-11ee-962d-dac502259ad0.png

构建完之后再 run 一下这个新镜像:

50928046-0692-11ee-962d-dac502259ad0.png

这次把桌面目录作为数据卷挂载到 /app 目录了:

509ea948-0692-11ee-962d-dac502259ad0.png

50cd1df0-0692-11ee-962d-dac502259ad0.png

容器跑起来后可以看到确实挂载上去了,也标识为了 mount:

50eed828-0692-11ee-962d-dac502259ad0.png

浏览器访问下:

512caa40-0692-11ee-962d-dac502259ad0.png

在 inspect 这里也可以看到挂载的目录:

513d4530-0692-11ee-962d-dac502259ad0.png

有同学说,就算不在 dockerfile 里指定 VOLUME,还是可以 docker run 的时候通过 -v 挂载数据卷呀。

那为啥还要指定 VOLUME?

在 dockerfile 里指定 VOLUME 之后,如果你 docker run 的时候没有带 -v,那会放在一个临时的目录里。

比如直接点击 run,不设置参数:

515c9e12-0692-11ee-962d-dac502259ad0.png

docker 会随机给他生成一个名字。

还会随机生成一个目录作为数据卷挂载上去:

517dfda0-0692-11ee-962d-dac502259ad0.png

inspect 可以看到这时候的路径是一个临时的目录:

51b52bea-0692-11ee-962d-dac502259ad0.png

这样就算你删了容器,数据也可以在这里找回。

设想下,如果你跑了个 mysql 容器,存了很多数据,但是跑容器的时候没指定数据卷。有一天,你把容器删了,所有数据都没了,可不可怕?

为了避免这种情况,mysql 的 dockerfile 里是必须声明 volume 的,这样就算你没通过 -v 指定数据卷,将来也可以找回数据。

在镜像详情可以看到 mysql 的 dockerfile,确实声明了 volume

51bffb06-0692-11ee-962d-dac502259ad0.png

这样就能保证数据不丢失。

总结

Docker 可以把环境封装成镜像,镜像跑起来是一个独立的容器。通过这种方式可以快速部署多个相同的实例。

docker 提供了一个 desktop 工具,可以可视化的操作 docker,包括容器、镜像、volume 等

我们 pull 了一个 nginx 镜像下来,指定端口映射、挂载的数据卷,并把它跑起来了。

这就是 docker 的基本用法。

当然,这些可视化的操作都有对应的命令,当服务器上没有桌面的时候,就需要用命令行操作了。

docker 镜像是通过 dockerfile 构建出来的。

我们写了第一个 dockerfile,通过 FROM、WORKDIR、COPY、RUN、EXPOSE、CMD 等指令声明了一个 http-server 提供静态服务的镜像。

docker run 这个镜像就可以生成容器,指定映射的端口、挂载的数据卷、环境变量等。

VOLUME 指令看起来没啥用,但能保证你容器内某个目录下的数据一定会被持久化,能保证没挂载数据卷的时候,数据不丢失。

写完这个 dockerfile,相信你会对 docker 镜像、容器有更具体的理解了。

不得不说,用 desktop 来学 docker 真是太简单了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 变量
    +关注

    关注

    0

    文章

    599

    浏览量

    28179
  • 镜像
    +关注

    关注

    0

    文章

    156

    浏览量

    10618
  • Docker
    +关注

    关注

    0

    文章

    443

    浏览量

    11672

原文标题:通过 Desktop 学 Docker 也太简单了

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    arm,c# 软件做 c#网站

    arm,c# 软件做 c#网站玩 是不是 感觉每一个都会点 但是都不敢说精!
    发表于 02-17 20:53

    单片机的运用真的是广泛,设计很方便。

    单片机的运用真的是广泛,设计很方便。
    发表于 06-10 19:35

    docker编译遇到的坑

    前言:首先感谢一下乔帮主和群里面的李隆两位大佬的无私帮助,让我这个完全没有接触docker的小白能够使用docker来编译鸿蒙的代码!!!正片:由于我电脑实在是垃圾,所以之前代码一
    发表于 11-04 13:51

    理解Docker容器并畅玩docker

    容器,好了,这个容器已经完蛋。现在只能通过命令删掉这个a1_rm容器。docker rm a1_rm命令解析:删掉a1_rm这个容器---------假如我们现在又想以alpine镜像为模板,重新
    发表于 11-05 09:54

    如何使用Docker去搭建一种嵌入式Linux环境

    Desktop”图标运行,如果一切正常,可以在任务栏看到以下图标:如果上图中的鲸鱼图标一直在喷水,表示它还在启动中。启动完毕后,鲸鱼图标就不再喷水,你就可以使用Docker。2.3.3.2 设置
    发表于 11-02 07:31

    如何在RDKx3部署docker镜像?

    一种在RDKx3部署docker镜像跑tros历程的方法 为了保持主系统环境干净整洁,有在docker中部署代码的习惯。 docker pull ningcong/rdkx3:v0.1 在资源中心
    发表于 08-02 11:02

    docker基础知识和使用bmnnsdk时的docker常用命令

    的物理机上运行一样。有 Docker,就不用担心环境问题。 1.2 image文件与容器container Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过
    发表于 09-18 07:59

    Docker监控实战分析

    Docker 优势 那为什么 Docker 越来越火呢?一谈起 Docker 总是会跟着让人联想到轻量这个词,甚至会有一种通过 Docker
    发表于 10-13 17:05 2次下载
    <b class='flag-5'>Docker</b>监控实战分析

    Docker开发预览版即将支持苹果Mac M1芯片

    的 “Docker Desktop 支持 Apple Silicon”话题下回复,团队已经取得了重大进展。Docker 将很快发布 Docker
    的头像 发表于 12-11 09:52 2074次阅读

    Docker Desktop 的 3.0.0 版本提供了对 Apple Silicon 的支持

    本周四,我们迎来了 Docker Desktop 的 3.0.0 版本。其最大的变化,就是提供了对 Apple Silicon 的支持。如果你想要在 13 英寸的 M1 MacBook Air
    的头像 发表于 12-11 16:09 2233次阅读

    Docker使用手册 嵌入式Linux环境搭建

    2.3.3 使用Docker使用Docker之前,请一定先看看前面的《概念介绍》,了解Docker的镜像、容器的概念。2.3.3.1 运行“Docker
    发表于 11-01 16:32 9次下载
    <b class='flag-5'>Docker</b>使用手册 嵌入式Linux环境搭建

    Budgie Desktop开源桌面

    budgie-desktop.zip
    发表于 04-18 11:34 1次下载
    Budgie <b class='flag-5'>Desktop</b>开源桌面

    使用docker完成编译环境创建

    作者环境:主机MacBook Pro 2015(16G),Docker Desktop for Mac(官方)
    的头像 发表于 04-21 07:49 2914次阅读

    这么简单!G2L开发板安装Docker

    Docker是什么?Docker有什么用?我们不再赘述。RZ/G2L开发板支持ubuntu系统,下面快速演示一下如何在G2L开发板上安装支持Docker
    的头像 发表于 04-15 16:18 515次阅读
    这么<b class='flag-5'>简单</b>!G2L开发板安装<b class='flag-5'>Docker</b>

    如何解决Docker Desktop 慢的问题

    DesktopDocker Desktop 都在使用这个框架,但这二者都比较重。 macOS 上的 Docker Desktop
    的头像 发表于 06-29 10:29 3484次阅读
    如何解决<b class='flag-5'>Docker</b> <b class='flag-5'>Desktop</b> 慢的问题