Docker 学习日志

学习Docker 已经一周了,大致的学会了怎么创建镜像、创建容器、运行容器等,做个总结。

容器

什么是镜像?

在知道什么是容器前,先理解下什么是镜像。

下面这段是使用翻译工具从官方文档翻译过来的内容


映像是一个只读模板,其中包含创建 Docker 容器的说明。通常,一个图像基于另一个图像,并带有一些额外的自定义。例如,您可以基于该映像构建一个映像ubuntu ,但安装 Apache Web 服务器和您的应用程序,以及使您的应用程序运行所需的配置详细信息。

您可以创建自己的图像,也可以只使用其他人创建并在注册表中发布的图像。要构建您自己的镜像,您需要使用简单的语法创建一个Dockerfile ,用于定义创建和运行镜像所需的步骤。Dockerfile 中的每条指令都会在映像中创建一个层。当您更改 Dockerfile 并重建映像时,仅重建那些已更改的层。与其他虚拟化技术相比,这是使映像如此轻量、小巧和快速的部分原因。


这里面有一段话要记住 “一个图像基于另一个图像,并带有一些额外的自定义。”, 在后面创建镜像时,编写Dockerfile 文件的第一句话 FROM xxx 就是这个的解释。
因为创建镜像时是要基于另外一个镜像来创建的,这里的 xxx 可以是 centos:7 或者其他的自己本机/docker hub 上存在的镜像。
如果你本机生没有这个镜像他会去docker hub 上下载的。

除了官网的文档,还查阅了其他博客或者技术论坛的解释,有的解释的比较深入讲到了底层实现,有的解释的比较深奥吧,作为初学者的我,有些词汇不太理解。下面是我目前对镜像的一个大致的理解,如果有误差可以评论提出来,因为这只是我个人的理解。

我理解的镜像按现实当中的比喻,将镜像比作一个“模板”。拿简历模板来做比喻,我们从网上下载一个简历模板(从docker hub 上拉去了一个镜像) ,模板的样式、要填写的选项(姓名、联系方式、学校、项目经验...)是固定的,然后我们基于这个模板可以增加自己的一些选项比如 “个人简介” 或者修改模板的样式 ,然后作为新的模板再发布到网上给别人去下载(这个相当于创建了新的镜像并发布到Docker hub 上)。这个过程就是镜像的制作和发布

容器是什么?

好了,理解镜像的概念后可以开始了解容器时什么了?

下面这段也是使用翻译工具从官方文档翻译过来的内容


容器是图像的可运行实例。您可以使用 Docker API 或 CLI 创建、启动、停止、移动或删除容器。您可以将容器连接到一个或多个网络,将存储附加到它,甚至可以根据其当前状态创建新映像。

默认情况下,一个容器与其他容器及其主机的隔离相对较好。您可以控制容器的网络、存储或其他底层子系统与其他容器或主机的隔离程度。

容器由其映像以及您在创建或启动它时提供给它的任何配置选项定义。当容器被移除时,任何未存储在持久存储中的状态更改都会消失。


在我刚开始学习容器时看着上面的解释感觉头大,我还不理解镜像是什么,就直接试图理解什么是容器,翻阅资料总感觉理解的不到位。大多数的解释是下面几种:

  • 容器是一个进程
  • 容器和虚拟机类似
  • 容器是沙箱子

这对于一个没有接触过容器的小白来说理解起来很痛苦。所以我还是先把这些概念简单化的理解下(因为是个人理解,可能get不到其他人的点):

举两个例子:

  1. 还是拿简历模板来说,模板比作镜像,那么使用这个镜像的容器 比作是一个人在做某一件事(相当与一个进程)。当然不同的模板针对不同的行业,填写的内容选项也就不同(不同的镜像,执行的内容不同)。当人拿到这个模板后,里面的内容选项(姓名、联系方式、学校、项目经验...)位置是固定的(相当于通过挂载目录来给这些内容留填写框),但是这这些位置上的内容任你填写,填写完成后你再将简历发布到网上(指定好参数,运行容器),当你要修改时重新再发布一次就行了(修改挂载目录下的内容重启容器),然后简历就制作完成了,之后只需要留意电话或者邮件等待消息(这个进程一直再后台运行)。
  2. 拿平常的后端部署来说,Java 部署先是打包成jar 包,然后上传到服务器上运行命令启动服务。但是运行服务需要JDK,同时运行这个服务还需要mysql 、redis 等一些工具。这时你制作了一个镜像,这里面将mysql、redis、jdk 等都集成了,你只需要把jar 放到指定的挂载目录下,然后运行容器时指定你制作好的镜像,项目就部署成功了。同时因为容器的隔离特性,当你运行第二个项目时,JDK、Mysql、Redis 版本都不同,只需要制作一个符合第二个项目运行的镜像,两个项目也能同时运行互不冲突。

最后总结一下,我理解的容器和镜像的关系一个是模板提供者,一个是模板使用这。

制作第一个镜像

好了,知道容器和镜像的概念后 开始制作第一个镜像。

首相我们要知道,制作镜像的文件叫做 Dockerfile, 这个文件的编写就是执行 Linux 的命令

以下拿一个JDK环境的镜像做例子。

# 指定该镜像基于 centos7制作
FROM centos:7
# 作者
MAINTAINER kafeim "373431485@qq.com"
# RUN Linux命令
RUN mkdir /java
#  同RUN一样作用大致一样,区别在于不会创建 image 新增
CMD echo "创建Java目录"
# 复制命令
COPY openjdk-11_28_linux-x64_bin.tar.gz /java
CMD echo "复制JDK"
RUN cd /java && tar -zxvf openjdk-11_28_linux-x64_bin.tar.gz
CMD echo "解压jdk"
RUN rm -rf openjdk-11_28_linux-x64_bin.tar.gz
CMD echo "删除jdk压缩包"
# ENV 用于设置环境变量
ENV JAVA_HOME=/java/jdk-11
ENV CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/
ENV PATH=$PATH:$JAVA_HOME/bin
CMD echo "设置jdk环境变量"
CMD /bin/bash

写好这个文件后,运行命令制作镜像

docker build -f dockerfile_11 -t java:11 .

-f 指定要运行的Dockerfile文件
-t 镜像的名称 这里面 : 冒号后面跟着的时标签

最后面的 "." 表示工作目录。 比如你当前所在的目录是 /home 这个命令 COPY openjdk-11_28_linux-x64_bin.tar.gz /java 表示将当前目录也就是 /home 这个目录下的openjdk-11_28_linux-x64_bin.tar.gz 复制到容器里面的 /java 目录下。 如果将 “.” 改成 “/” 的话 那么里面的命令也要修改 COPY home/openjdk-11_28_linux-x64_bin.tar.gz /java

好了运行命令成功后镜像也就制作完成了,这个时候运行 docker images 查看当前的镜像

image.png

可以看到,centos:7 的镜像 docker 帮我们下载到本地 ,java:11 是我们自己制作的镜像。

Dockerfile命令参考
可以使用Google翻译来协助阅读

image-1652632367013.png

运行第一个容器

这里是我运行的一个博客网站做例子。

Dockerfile 文件

FROM java:11
ADD *.jar /root/.halo/
CMD /java/jdk-11/bin/java -server -Xms256m -Xmx256m -jar /root/.halo/application.jar

基于创建的 java:11 的镜像创建一个新的镜像 并且把jar 放到容器里面 /root/.halo/ 目录下,然后再启动服务

创建镜像:
docker build -f dockerfile_halo -t halo:1 .

运行容器:

docker run -it -d  --name halo -p 8090:8090 -v $(pwd):/root/.halo --restart=unless-stopped   halo:1 /bin/bash 

-d 表示以隔离模式启动容器
--name halo 指定容器的名称
-p 8090:8090 这个表示将宿主机的8090端口映射到容器的8090端口
-v $(pwd):/root/.halo (pwd) 表示当前目录 ,比如你在 /home 下运行启动容器的命令,那么(pwd) 表示的就是 /home 。 这一段的意思是把 当前目录挂在到容器里面的 /root/.halo 目录下
--restart=unless-stopped 重启策略这里指定,在容器非正常退出时(退出状态非0),才会重启容器
halo:1 最后的这一段表示指定启动容器的镜像
/bin/bash 容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell。有时候容器一启动就变成了重启状态,查资料说是因为容器必须要运行一个进程,避免陷入重启状态这个还是有必要加的。

当容器启动成功后,后面的部署只需要将挂在目录下的 application.jar 替换掉 再运行重启容器命令就行了。

需要注意的时,dockerfile 文件里面的ADD *.jar /root/.halo/命令 ,如果运行启动命令时挂载了容器里面 “/root/.halo/”目录,那么需要你自己将 jar 上传到挂载的目录里面。如果没有挂载该目录,则会将镜像中添加的jar 放到容器里面 “/root/.halo/”目录下

下面时常用的命令

查看运行的容器:
docker ps

查看所有的容器:
docker ps -a

进入容器:
docker exec -it halo /bin/bash

停止容器:
docker stop halo

重启容器:
docker restart halo

查看日志:
docker logs --tail 200 -f halo

删除容器(删除容器前要先停止容器):
docker rm halo

查看镜像:
docker images

删除镜像(删除镜像前先删除使用该镜像的容器):
docker image rm 镜像的ID(通过查看镜像命令查找)

写文章对于目前的我来说只是知识梳理,留下进步的脚印,让自己能记得更加深刻一点。
同时也希望对其他人有一些帮助,如果里面有什么不对的欢迎指出来大家可以一起讨论。

博客地址:http://kafeim.cn/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容