Docker

一、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
当完成了上述前置条件的检查之后,可以通过如下步骤完成升级操作:

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

七、docker存储库安装

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates | sort -r
yum install -y docker-ce-18.09.1 docker-ce-cli-18.09.1 containerd.io
systemctl enable --now docker

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

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

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

[root@docker ~]# ls -l /sys/fs/cgroup/
总用量 0
drwxr-xr-x 5 root root  0 428 10:43 blkio
lrwxrwxrwx 1 root root 11 428 10:43 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 428 10:43 cpuacct -> cpu,cpuacct
drwxr-xr-x 5 root root  0 428 10:43 cpu,cpuacct
drwxr-xr-x 3 root root  0 428 10:43 cpuset
drwxr-xr-x 5 root root  0 428 10:43 devices
drwxr-xr-x 3 root root  0 428 10:43 freezer
drwxr-xr-x 3 root root  0 428 10:43 hugetlb
drwxr-xr-x 5 root root  0 428 10:43 memory
lrwxrwxrwx 1 root root 16 428 10:43 net_cls -> net_cls,net_prio
drwxr-xr-x 3 root root  0 428 10:43 net_cls,net_prio
lrwxrwxrwx 1 root root 16 428 10:43 net_prio -> net_cls,net_prio
drwxr-xr-x 3 root root  0 428 10:43 perf_event
drwxr-xr-x 5 root root  0 428 10:43 pids
drwxr-xr-x 5 root root  0 428 10:43 systemd

#在docker中限制内存

[root@docker docker]# docker container ls -a
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                   NAMES
ca30e775490a   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_bytes
9223372036854771712

十、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然后发送SIGKILL
docker kill							强制停止容器,直接发送SIGKILL
docker 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 info
Server:
 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.profile
activation{
 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 info
Server:
 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指定工作目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值