一、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存储库安装
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指定工作目录