当前位置:首页 » 《随便一记》 » 正文

Docker

2 人参与  2024年10月10日 12:01  分类 : 《随便一记》  评论

点击全文阅读


一、AtomHub可信镜像中心
配置:

cat /etc/docker/daemon.json{  "registry-mirrors": [    "https://atomhub.openatom.cn/",  ]}

二、Docker简介
<1>Docker运行时与编排引擎
多数技术人员在谈到 Docker 时,主要是指 Docker 引擎
Docker 引擎是用于运行和编排容器的基础设施工具, Docker 引擎是运行容器的核心容器运行时
Docker 引擎主要有两个版本:企业版(EE)和社区版(CE)
从 2017 年第一季度开始,Docker 版本号遵循 YY.MM-xx 格式,例如,2018 年 6 月第一次发布的社区版本为 18.06.0-ce

<2>Docker开源项目(Moby)
该项目在 2017 年于 Austin 举办的 DockerCon 上正式命名为 Moby 项目
由于这次改名,GitHub 上的 docker/docker 库也被转移到了 moby/moby,并且拥有了项目自己的 Logo
Moby 项目的目标是基于开源的方式,发展成为 Docker 上游,并将 Docker 拆分为更多的模块化组件

<3>容器生态
Docker 公司的一个核心哲学通常被称为“含电池,但可拆卸”(Batteries included but removable)
意思是许多 Docker 内置的组件都可以替换为第三方的组件

<4>开放容器计划
开放容器计划(The Open Container Initiative, OCI)
OCI 是一个旨在对容器基础架构中的基础组件(如镜像格式与容器运行时)进行标准化的管理委员会

Docker对外宣称的作用是"Build,Ship and Run"。
它通过将运行环境和应用程序打包到一起,来解决部署的环境依赖问题,真正做到跨平台的分发和使用。这一点和DevOps不谋而合,通过Docker可以大大提升开发、测试和运维的效率。
2013年3月,Docker正式以开源软件的形式被发布了。Docker其实是容器化技术其中的一种实现。

三、Docker的优势
Docker容器启动很快,启动和停止都可以秒级实现,而传统虚拟机则需要数分钟。
Docker容器对系统资源需求很少,一台主机上可以同时运行数百个,甚至上千个Docker容器 。
Docker通过类似于Git设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新。
Docker通过Dockerfile支持灵活的自动化部署机制,提高工作效率,使流程标准化。

四、Docker核心概念
镜像:是一个只读的模板,类似于安装系统时用到的ISO文件,通过镜像来完成各种应用的部署。
容器:可以被启动、开始、停止、删除,每个容器间都是相互隔离的。
仓库:是一个存放镜像的场所,仓库分为公共仓库和私有仓库,最大的公共库是Docker hub,国内公共仓库是dockerpool.com。

五、Docker引擎(engine)
Docker 引擎是用来运行和管理容器的核心软件。通常人们会简单地将其代指为 Docker 或 Docker 平台。
Docker 引擎由如下主要的组件构成:Docker 客户端(Docker Client)、Docker 守护进程(Docker daemon)、containerd 以及 runc。它们共同负责容器的创建和运行。

六、Docker引擎的升级
升级 Docker 引擎的关键步骤如下。
需要重视升级操作的每个前置条件,包括确保容器配置了正确的重启策略;在 Swarm Mode 模式下使用服务时,需要确保正确配置了 draining node
当完成了上述前置条件的检查之后,可以通过如下步骤完成升级操作:

停止 Docker 守护程序移除旧版本 Docker安装新版本 Docker配置新版本的 Docker 为开机自启动确保容器重启成功

七、docker存储库安装

yum remove docker \                  docker-client \                  docker-client-latest \                  docker-common \                  docker-latest \                  docker-latest-logrotate \                  docker-logrotate \                  docker-engineyum install -y yum-utilsyum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repoyum list docker-ce --showduplicates | sort -ryum install -y docker-ce-18.09.1 docker-ce-cli-18.09.1 containerd.iosystemctl enable --now docker

八、Docker镜像加速
或使用一中‘AtomHub可信镜像中心’进行镜像加速

mkdir -p /etc/dockertee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://s23x1mw2.mirror.aliyuncs.com"]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker

九、Docker底层原理
#Linux底层的Cgroup隔离机制

[root@docker ~]# ls -l /sys/fs/cgroup/总用量 0drwxr-xr-x 5 root root  0 4月  28 10:43 blkiolrwxrwxrwx 1 root root 11 4月  28 10:43 cpu -> cpu,cpuacctlrwxrwxrwx 1 root root 11 4月  28 10:43 cpuacct -> cpu,cpuacctdrwxr-xr-x 5 root root  0 4月  28 10:43 cpu,cpuacctdrwxr-xr-x 3 root root  0 4月  28 10:43 cpusetdrwxr-xr-x 5 root root  0 4月  28 10:43 devicesdrwxr-xr-x 3 root root  0 4月  28 10:43 freezerdrwxr-xr-x 3 root root  0 4月  28 10:43 hugetlbdrwxr-xr-x 5 root root  0 4月  28 10:43 memorylrwxrwxrwx 1 root root 16 4月  28 10:43 net_cls -> net_cls,net_priodrwxr-xr-x 3 root root  0 4月  28 10:43 net_cls,net_priolrwxrwxrwx 1 root root 16 4月  28 10:43 net_prio -> net_cls,net_priodrwxr-xr-x 3 root root  0 4月  28 10:43 perf_eventdrwxr-xr-x 5 root root  0 4月  28 10:43 pidsdrwxr-xr-x 5 root root  0 4月  28 10:43 systemd

#在docker中限制内存

[root@docker docker]# docker container ls -aCONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                   NAMESca30e775490a   jartto-test3:latest   "/docker-entrypoint.…"   26 minutes ago   Up 26 minutes   0.0.0.0:8888->80/tcp, :::8888->80/tcp   jartto-test3[root@docker docker]# cd /sys/fs/cgroup/memory/docker/ca30e775490a98e58e81186535e3ab508c9fb28b12b74dce89ce860d883230b3/[root@docker ca30e775490a98e58e81186535e3ab508c9fb28b12b74dce89ce860d883230b3]# cat memory.limit_in_bytes9223372036854771712

十、Docker基本命令
镜像操作:docker image …
容器操作:docker container …

docker help查看Docker所有的子命令docker help [子命令]查看某个子命令如何使用docker version查看Docker版本信息docker -D info或docker info查看Docker的基本信息docker images或docker image ls查看本地都有哪些镜像docker search搜索镜像docker tag以给镜像打标签docker create创建容器,创建的容器默认不会启动docker start启动容器docker stop软停止容器,先发送SIGTERM然后发送SIGKILLdocker kill强制停止容器,直接发送SIGKILLdocker restart重启容器docker run 相当于先创建再启动docker run -d使容器在后台运行docker run -name给容器自定义名字docker commit通过容器创建镜像docker inspect查看容器的详细信息

##挂起容器

[root@docker ~]# docker pause jartto-test3

##解除挂起状态

[root@docker ~]# docker unpause jartto-test3

##容器时间和宿主机时间保持一致

[root@docker ~]# docker run -d -it -v /etc/localtime:/etc/localtime:ro centos:6.9 bash -c "sleep 30"

##容器自动重新启动

docker container run --name neversaydie -it --restart always alpine sh

##查看指定时间后的日志,只显示最后200行:

docker logs -f -t --since="2023-08-08" --tail=200 CONTAINER_ID

##查看最近20分钟的日志:

docker logs --since 20m CONTAINER_ID

##查看实时日志

docker logs -f CONTAINER_ID

##删除一个容器以及容器之间的底层的连接及网络通信,连接名称为web

[root@docker ~]# docker container rm -l web

##获取容器root权限

docker exec -it -u root [容器名称] bash

十一、Docker四种网络模式
host模式:执行docker run命令时用–net=host选项指定,该模式下Docker使用的网络和宿主机使用的网络是一样的,在容器内看到的网卡IP就是宿主机的IP

container模式:用选项–net=container:container_id/container_name指定,该模式是多个容器共同使用网络,看到的IP都是一样的

none模式:用–net=none选项指定,该模式下不会设置任何网络

bridge模式:用–net=bridge指定,是Docker默认的网络模式.该模式会为每个容器分配一个独立的Network Namespace,类似于VMWare的NAT网络模式,
同一个宿主机上的所有容器会在同一个网段下,相互之间可以通信

十二、Docker存储驱动
每个 Docker 容器都有一个本地存储空间,用于保存层叠的镜像层(Image Layer)以及挂载的容器文件系统
在 Linux 上,Docker可选择的一些存储驱动包括 AUFS(最原始也是最老的)、Overlay2(可能是未来的最佳选择)、Device Mapper、Btrfs 和 ZFS
在 Linux 上,可以通过修改 /etc/docker/daemon.json 文件来修改存储引擎配置,修改完成之后需要重启 Docker 才能够生效
下面的代码片段展示了如何将存储驱动设置为 overlay2
{ “storage-driver”: “overlay2” }

#查看使用的存储引擎信息

[root@docker ~]# docker infoServer: Storage Driver: overlay2  Backing Filesystem: xfs  Native Overlay Diff: true

十三、Device Mapper存储引擎
实际上,默认方式的性能很差,并不支持生产环境
为了达到 Device Mapper 在生产环境中的最佳性能,需要将底层实现修改为 direct-lvm 模式

#配置Device Mapper存储引擎的依赖包

[root@docker docker]# yum install -y lvm2

#docker配置devicemapper
devicemapper分为2种配置模式:loop-lvm、direct-lvm
docker主机如果使用loop-lvm模式来运行devicemapper,该模式使用系统文件来创建thin池

#docker配置devicemapper(direct-lvm模式)

[root@docker ~]# yum install -y lvm2[root@docker ~]# systemctl stop docker.service

#新增加一块磁盘,并创建成物理卷

[root@docker ~]# pvcreate /dev/sdb[root@docker ~]# vgcreate docker /dev/sdb[root@docker ~]# vgdisplay

#创建逻辑卷thinpool和thinpoolmeta,-l为用于指定可用空间量,以在空间不足时允许自动扩展数据或元数据

[root@docker ~]# lvcreate --wipesignatures y -n thinpool docker -l 95%VG[root@docker ~]# lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG

#将卷转换为“精简池和精简池元数据的存储位置”

[root@docker ~]# lvconvert -y --zero n -c 512k --thinpool docker/thinpool --poolmetadata docker/thinpoolmeta

#通过lvm配置文件配置精简池的自动扩展

[root@docker ~]# cd /etc/lvm/profile/[root@docker ~]# vim docker-thinpool.profileactivation{ thin_pool_autoextend_threshold=80 thin_pool_autoextend_percent=20}thin_pool_autoextend_threshold:在lvm尝试自动扩展可用空间之前使用的空间百分比(100表示禁止,不推荐)thin_pool_autoextend_percent:在逻辑卷自动扩展时要添加到设备的空间量(0表示禁用)当磁盘使用率达到80%时,以上示例将容量增加20%

#应用lvm配置文件

[root@docker ~]# lvchange --metadataprofile docker-thinpool docker/thinpool

#确保已启用对逻辑卷的监视

[root@docker ~]# lvs -o+seg_monitor  LV       VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Monitor  thinpool docker twi-a-t--- <19.00g             0.10   0.03                             monitored

#将之前运行的dokcer残留先移走备份

[root@docker ~]#mv /var/lib/docker /tmp[root@docker ~]#vim /etc/docker/daemon.json{  "storage-driver": "devicemapper",  "storage-opts": [    "dm.thinpooldev=/dev/mapper/docker-thinpool",    "dm.use_deferred_removal=true",    "dm.use_deferred_deletion=true"  ]}[root@docker ~]# systemctl start docker[root@docker ~]# docker infoServer: Storage Driver: devicemapper  Pool Name: docker-thinpool  Pool Blocksize: 524.3kB  Base Device Size: 10.74GB  Backing Filesystem: xfs  Udev Sync Supported: true  Data Space Used: 19.92MB  Data Space Total: 20.4GB  Data Space Available: 20.38GB  Metadata Space Used: 61.44kB  Metadata Space Total: 213.9MB  Metadata Space Available: 213.8MB  Thin Pool Minimum Free Space: 2.039GB  Deferred Removal Enabled: true  Deferred Deletion Enabled: true  Deferred Deleted Device Count: 0  Library Version: 1.02.170-RHEL7 (2020-03-24)

十四、Dockerfile语法

FROM用于指定基于哪个镜像,格式是FROM 或FROM :

FROM centos FROM centos:latest

MAINTAINER用于指定作者信息,格式是MAINTAIN

MAINTAINER Mr.Xu admin@Mr.Xu.com

RUN是镜像操作指令,格式是RUN 或RUN

RUN ["executable","param1","param2"]RUN yum install httpd RUN ["/bin/bash","-c","echo hello"]

CMD用于执行一些命令,它有3种语法格式,与RUN的语法格式类似,CMD指定容器启动时用到的命令只能有1条

CMD ["executable","paraml","param2"] CMD command paraml param2 CMD ["param1","param2"] CMD ["/bin/bash","/usr/local/nginx/sbin/nginx","-c","/usr/local/nginx/conf/nginx.conf"]

EXPOSE是用来暴露端口的命令,比如把22端口、80端口、8443端口暴露出来并赋值,用于记录应用所使用的网络端口

EXPOSE 22 80 8443

在启动容器时,可以加上-P(大写)选项让系统自动分配端口,如果想指定具体的端口,可使用-p(小写)选项来指定

ENV用来定义环境变量,格式是

ENV PATH /usr/local/mysql/bin:$PATH

ENV主要为后续的RUN指令提供一个环境变量,也可以自定义一些环境变量,如ENV MYSQL_version5.7

ADD命令是将本地的文件或目录复制到容器的某个目录下,其中,源为DockerFile所在目录的相对路径,也可以是URL,注意:可自动解压压缩包

ADD <conf/vhosts> </usr/local/nginx/conf>

COPY命令和ADD命令类似,语法格式也一致,不同的是COPY命令不支持URL远程下载,通常使用 COPY 指令将应用代码赋值到镜像中

ENTRYPOINT命令的格式类似于CMD命令的格式,容器启动时要执行的命令也类似于CMD命令,只有1条生效,如果写多条语句,则只有
最后一条语句会生效
不同的是,CMD可以被docker run命令指定覆盖,而ENTRYPOINT不能被覆盖
比如,容器名是nginx,在dockerfile指定CMD格式是CMD [“/bin/echo”,“test”],启动容器命令是docker run nginx
这样会输出test
如果启动容器的命令是docker run -it nginx /bin/bash,则什么都不会输出
ENTRYPOINT不会被覆盖,而且CMD或docker run指定的命令要靠前执行,在dockerfile中指定ENTRYPOINT[“echo”,“test”],执行
docker run -it nginx 123命令会先输出test,再输出123,这相当于执行命令echo test 123

VOLUME是用来指定挂载点的,可以创建一个从本地或其他容器挂载的挂载点,格式是VOLUME [“/data”]
USER指定运行容器的用户,恪式是USE daemon
WORKDIR用于指定一个目录,指定目录后,在目录下进行一些操作,如运行一些命令时,先进入到路径下,或者在启动容器时,使用
CMD、ENTRYPOINT指定工作目录


点击全文阅读


本文链接:http://zhangshiyu.com/post/169950.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1