Docker从入门到干事,看这一篇就够了

总之docker就是集装箱原理。

docker与虚拟机的对比

=============

物理机:别墅

虚拟机:楼房

docker:酒店式公寓

docker三大概念

==========

库:一个总的仓库,包含所有的镜像,使用时可以从库拉取镜像到本地。

镜像:从库中拉取下来的应用,比如mysql。

容器:镜像运行之后就是容器,容器和镜像可以互相转换。

docker工作流程

==========

docker命令

========

docker指令基本用法:

docker 命令关键字 -参数

基本操作


查看docker信息

docker info

docker版本

docker version

查找镜像

docker search nginx

#拉取镜像

docker pull nginx

入门案例


快速搭建wordpress博客

查找镜像

docker search name

wordpress

mariadb

拉取镜像

docker pull wordpress

mariadb就是mysql

docker pull mariadb

运行镜像

docker run --name db -p 3306:3306 --env MYSQL_ROOT_PASSWORD=root -d mariadb

docker run --name mywordpress --link db:mysql -p 8080:80 -d wordpress

运行成功,访问wordpress

http://libiao:8080

根据提示配置数据库信息,一个个人博客网站就搭建好了

查看端口映射


docker ps

docker port CONTAINER_ID

举例:xxjob的8080端口映射到宿主机的8089端口

linux设置docker开机自启


systemctl enable docker

查看镜像


docker images

#因为docker是分层,所以显示的文件大小要大于实际占用磁盘的大小

运行镜像


docker run --name db -p 3306:3306 --env MYSQL_ROOT_PASSWORD=root -d mariadb

–name 别名

–env 环境变量

#-d 后台执行

docker run --name mywordpress --link db:mysql -p 8080:80 -d wordpress

–link ip映射

-p 端口映射

docker logs -f 7a38a1ad55c6

像tail -f一样查看容器内日志

docker top name

#查看容器内的进程

删除镜像


docker rmi hello-world:latest

docker rmi id

4位即可

复合命令


docker rm -f $(docker ps -a -q)

#删除全部容器

查看运行的容器


docker ps

docker compose


一个方便维护多个容器的yaml文件,docker认为一个容器对应一个进程,但一个应用会有多个进程,例如上面的mysql和wordpress。

个人觉得docker compose类似于shell脚本,但他实际都python实现,访问的是docker的一些api。

Docker compose一般随docker一起安装,所以要求版本对应

docker version

docker-compose --version

在yaml文件制定镜像的名字,版本,端口映射后用 up -d 启动

docker-compose.yaml up -d

查看日志

docker-compose logs

容器管理

====

进入容器

docker exec -it name /bin/sh

查看容器详细信息

容器的详细信息会以json的形式返回。

docker inspect name

[root@lib mysh]# docker inspect mywordpress

[

{

“Id”: “6253e66959047c6f8de891abe1c661f7766fdef7407f00e07d1788310e0ea6a9”,

“Created”: “2021-08-04T20:11:43.649001354Z”,

“Path”: “docker-entrypoint.sh”,

“Args”: [

“apache2-foreground”

],

“State”: {

“Status”: “running”,

“Running”: true,

“Paused”: false,

“Restarting”: false,

“OOMKilled”: false,

“Dead”: false,

“Pid”: 28041,

“ExitCode”: 0,

“Error”: “”,

“StartedAt”: “2021-08-04T20:11:43.947511209Z”,

“FinishedAt”: “0001-01-01T00:00:00Z”

}

“Name”: “/mywordpress”,

容器启停

docker start name

docker stop name

docker restart name

删除容器

删除时容器需要处于停止状态

docker rm name

查看日志

docker ps -a

docker logs container_Id

占用资源

docker stats name

镜像特性

====

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,他包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。将所有的应用和环境直接打包为docker镜像,就可以直接运行。

镜像名和版本号共同组成唯一标识,默认是最新版——lastest

分层原理


Docker的镜像通过联合文件系统将将各层文件系统叠加在一起。

引导方式

  • bootfs:传统操作系统,用于系统引导的文件系统,包括BootLoader和kernel,容器启动完成后会被卸载以节省内存资源。

  • rootfs:位于bootfs之上,表现为docker容器的根文件系统

  • 传统模式中,系统启动时,内核首先挂载为”只读“模式,完成全部自检后挂载为”读写“模式。

  • docker中,rootfs由内核挂载为”只读“模式,而后通过UFS技术挂载一个”可写“层。

⚠️注意:已有的分层只能读不能写,上层镜像优先级大于底层镜像

当我们使用pull命令时,我们可以看到docker的镜像是一层一层的在下载。这样做最大的好处就是资源共享了。

比如多个镜像都从Base镜像构建而来,那么宿主机只需要在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。查看镜像分层的方式可以通过docker image inspect命令。

所有的Docker镜像都起始于一个基础镜像,当进行修改或者增加新的内容时,就会在当前的镜像层之上,创建新的镜像层。在添加额外的镜像层的同时,镜像始终保持当前所有镜像的组合, Docker通过存储引擎的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。

UFS(联合文件系统)


UFS时一种分层、轻量级并且高性能的文件系统。

它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。

UnionFS是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件,系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

加载原理


Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层时bootfs。

当boot加载完成后整个内核就在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。rootfs在bootfs之上,rootfs包含的就是典型Linux系统中的/dev、/proc、/bin、/etc等目录和文件。rootfs就是各种不同的操作系统发行版。

Docker File

===========

仓库没有的镜像怎么办?

可以自己创建镜像吗?

容器->镜像


docker commit CID -t xx.xx.xx

⚠️⚠️⚠️⚠️ 工作在前台的守护进程至少一个

网易蜂巢:开源镜像仓库

编写docker file


Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

指令讲解

FROM

指定基础镜像,必须为第一个命令,有且只有一个

FROM

FROM :

FROM @

FROM mysql:5.6

MAINTAINER

创建者信息

MAINTAINER

MAINTAINER yitiao

RUN

用于在镜像容器中执行命令,其有以下两种命令执行方式:

#shell执行

RUN

#exec执行

RUN [“executable”, “param1”, “param2”]

RUN apk update

RUN [“/etc/execfile”, “arg1”, “arg1”]

ADD

将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget

ADD …

ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:“home.txt”

COPY

功能类似ADD,但是是不会自动解压文件,也不能访问网络资源

CMD

构建容器后调用,也就是在容器启动时才进行调用。

CMD command param1 param2 (执行shell内部命令)

CMD echo “This is a test.” | wc -

#CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令

ENTRYPOINT

配置容器,使其可执行化。配合CMD可省去"application",只使用参数。

ENTRYPOINT [“executable”, “param1”, “param2”] (可执行文件, 优先)

ENTRYPOINT command param1 param2 (shell内部命令)FROM ubuntu

ENTRYPOINT [“top”, “-b”]

CMD [“-c”]

LABEL

用于为镜像添加元数据

LABEL = = = …

LABEL version=“1.0” description=“一条coding” by=“一条”

ENV

设置环境变量

ENV

之后的所有内容均会被视为其的组成部分,因此,一次只能设置一个变量

ENV = …

可以设置多个变量,每个变量为一个"="的键值对

ENV myName John Doe

ENV myDog Rex The Dog

ENV myCat=fluffy

EXPOSE

指定于外界交互的端口

格式:

EXPOSE […]

示例:

EXPOSE 80 443

EXPOSE 8080

EXPOSE 11211/tcp 11211/udp

注:

EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口

VOLUME

用于指定持久化目录

格式:

VOLUME [“/path/to/dir”]

示例:

VOLUME [“/data”]

VOLUME [“/var/www”, “/var/log/apache2”, “/etc/apache2”

注:

一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:

1 卷可以容器间共享和重用

2 容器并不一定要和其它容器共享卷

3 修改卷后会立即生效

4 对卷的修改不会对镜像产生影响

5 卷会一直存在,直到没有任何容器在使用它

WORKDIR

工作目录,类似于cd命令

WORKDIR /path/to/workdir

WORKDIR /a #(这时工作目录为/a)

WORKDIR b #(这时工作目录为/a/b)

WORKDIR c #(这时工作目录为/a/b/c)

#通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在#该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

USER

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户。

使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。

USER user

最后

光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性

Java面试宝典2021版

最常见Java面试题解析(2021最新版)

2021企业Java面试题精选

于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:

1 卷可以容器间共享和重用

2 容器并不一定要和其它容器共享卷

3 修改卷后会立即生效

4 对卷的修改不会对镜像产生影响

5 卷会一直存在,直到没有任何容器在使用它

WORKDIR

工作目录,类似于cd命令

WORKDIR /path/to/workdir

WORKDIR /a #(这时工作目录为/a)

WORKDIR b #(这时工作目录为/a/b)

WORKDIR c #(这时工作目录为/a/b/c)

#通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在#该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

USER

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户。

使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。

USER user

最后

光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性

Java面试宝典2021版

[外链图片转存中…(img-FtbxbLi3-1714286299161)]

[外链图片转存中…(img-n6V2yZMF-1714286299161)]

最常见Java面试题解析(2021最新版)

[外链图片转存中…(img-6Ygelpr9-1714286299161)]

[外链图片转存中…(img-luLZVe0V-1714286299162)]

2021企业Java面试题精选

[外链图片转存中…(img-EALLuhFI-1714286299162)]

[外链图片转存中…(img-cTEd3vhS-1714286299162)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值