跳至主要內容

Docker

HeChuangJun约 6851 字大约 23 分钟

docker

Docker概述?场景?优点?

开源的应用容器引擎,基于 Go 语言
通过容器实现快速打包,测试和部署程序、管理基础架构(快速交付)
容器安全、轻量、可移植、松耦合、可扩展直接在内核运行(同一硬件上可运行多个容器)

Web应用的自动化打包和发布。√
自动化测试和持续集成、发布。√
在服务型环境中部署和调整数据库或其他的后台应用。

快速,一致地交付您的应用程序
响应式部署和扩展
在同一硬件上运行更多工作负载

Docker架构?组件?

1.png
1.png

工作流程
构建镜像:使用 Dockerfile 创建镜像。
推送镜像到注册表:将镜像上传到 Docker Hub 或私有注册表中。
拉取镜像:通过 docker pull 从注册表中拉取镜像。
运行容器:使用镜像创建并启动容器。
管理容器:使用 Docker 客户端命令管理正在运行的容器(例如查看日志、停止容器、查看资源使用情况等)。
网络与存储:容器之间通过 Docker 网络连接,数据通过 Docker 卷或绑定挂载进行持久化。

  • Docker客户端(Docker Client):用户与Docker守护进程交互的命令行界面(CLI)。用户通过Docker CLI发送命令到Docker守护进程执行相应的操作。
    功能:允许用户使用命令与 Docker 守护进程通信,如创建容器、构建镜像、查看容器状态等。
    交互方式:Docker客户端与Docker守护进程通过REST API或Unix套接字通信
    常用命令:
    docker run:运行容器。
    docker ps:列出正在运行的容器。
    docker build:构建 Docker 镜像。
    docker exec:在容器中执行命令。
  • Docker 守护进程(Docker Daemon):负责管理容器生命周期、构建镜像、分发镜像等任务。监听来自Docker客户端的请求,并且通过Docker API执行请求
    启动和停止容器。
    构建、拉取和推送镜像。
    管理容器的网络和存储。
    启动、停止、查看容器日志等。
    与 Docker 注册表进行通信,管理镜像的存储与分发。
    启动 Docker 守护进程(通常是自动启动的):sudo systemctl start docker
  • Docker 引擎 API(Docker Engine API):Docker提供的RESTful接口,允许客户端与Docker守护进程通信。通过这个API,用户可以执行各种操作,支持跨平台调用。
    功能:向 Docker 守护进程发送 HTTP 请求,实现容器、镜像的管理。
    提供 RESTful 接口,允许通过编程与 Docker 进行交互。
    通过 curl 或其他 HTTP 客户端访问 Docker 引擎 API
    查询当前 Docker 守护进程的版本:curl --unix-socket /var/run/docker.sock http://localhost/versionopen in new window
  • Docker 容器(Docker Containers)
    执行环境,轻量级、独立且可执行的软件包。容器是从Docker镜像启动的,包含了运行某个应用程序所需的一切——从操作系统库到应用程序代码。容器在运行时与其他容器和宿主机共享操作系统内核,但容器之间的文件系统和进程是隔离的。
    功能:
    提供独立的运行环境,确保应用程序在不同的环境中具有一致的行为。
    容器是临时的,通常在任务完成后被销毁。
    容器的生命周期是由 Docker 守护进程管理的。容器可以在任何地方运行,因为它们不依赖于底层操作系统的配置,所有的运行时依赖已经封装在镜像中。
    启动容器:docker run -d ubuntu
  • Docker 镜像(Docker Images):容器的只读模板。包含了应用程序运行所需的操作系统、运行时、库、环境变量和应用代码等。镜像是静态的,用户可以根据镜像启动容器。
    功能:
    构建容器
    镜像是只读的,不同容器使用同一个镜像时,容器中的文件系统层是独立的。
    Docker 镜像可以通过 docker pull 从 Docker Hub 或私有注册表拉取,也可以通过 docker build 从 Dockerfile 构建。
    拉取 Ubuntu 镜像:docker pull ubuntu
  • Docker 仓库(Docker Registries):存储 Docker 镜像,公共仓库Docker Hub。Docker Hub下载上传镜像也可以部署自己的私有 Docker 仓库来管理企业内部的镜像。
    功能:
    存储 Docker 镜像。
    提供镜像的上传和下载功能。
    Docker Hub 提供了大量官方和社区维护的镜像,如 Ubuntu、Nginx、MySQL 等。
    推送镜像到 Docker Hub:docker push username/image_name
  • Docker Compose:定义和运行多容器Docker应用的工具。用一个 docker-compose.yml 配置文件定义多个容器(服务),并可以通过一个命令启动这些容器。用于开发、测试和部署多容器的应用。
    功能:
    定义和运行多个容器组成的应用。
    通过 YAML 文件来配置应用的服务、网络和卷等。
  • Docker Swarm:集群管理和调度工具。将多个 Docker 主机(节点)组织成集群,并通过Swarm 集群管理工具来调度和管理容器。可以实现容器的负载均衡、高可用性和自动扩展等功能。
    功能:
    管理多节点 Docker 集群。
    通过调度器管理容器的部署和扩展。
  • Docker 网络(Docker Networks):并与外部世界进行连接
    功能:
    管理容器间的网络通信。
    支持不同的网络模式,以适应不同场景下的需求。
    创建一个自定义网络并将容器连接到该网络:
  • Docker 卷(Docker Volumes):数据持久化机制,适用于数据库等需要持久存储的应用。
    功能:
    允许容器间共享数据。
    保证数据持久化,独立于容器的生命周期。与容器文件系统不同,卷的内容不会随着容器销毁而丢失

Docker安装

  • 手动安装

# 更改centos源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum -y remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 更新yum。防止找不到docker
yum update -y
# yum clean all
# yum makecache
#安装一些必备工具 java-11-openjdk-headless java-11-openjdk java-11-openjdk-devel
yum -y install lrzsz net-tools wget vim python3 keyutils unzip lvm2 yum-utils
# 安装docker
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

systemctl start docker
systemctl enable docker
---------------------centos7 安装docker-compose---------
#curl -L "https://github.com/docker/compose/releases/download/2.17.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

如果docker-compose的出现异常
dockercomposeerror.png
直接在release中下载对应的linux发行版【docker-compose-linux-x86_64】
https://github.com/docker/compose/releases/tag/v2.18.1open in new window
dockercomposeerrorsolve.png
下载完后将软件上传至 Linux的【/usr/local/bin】目录下
重命名:sudo mv docker-compose-linux-x86_64 docker-compose
将可执行权限应用于二进制文件:sudo chmod +x /usr/local/bin/docker-compose
创建软链:sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

  • (推荐)官方源安装(带docker-compose-plugin、从20.10.0版本开始将Compose功能内置为插件,通过docker compose使用(注意空格))
# centos 9+
curl https://get.docker.com -o install-docker.sh
sudo sh install-docker.sh

systemctl start docker
systemctl enable docker

代理

  • (一定要开,尽管linux能连外网)
  • 宿主机开通192.168.0.0/24的子网防火墙
mkdir -p /etc/systemd/system/docker.service.d
cat > /etc/systemd/system/docker.service.d/http-proxy.conf <<"EOF"
[Service]
Environment="HTTP_PROXY=http://192.168.1.141:7890/"
Environment="HTTPS_PROXY=http://192.168.1.141:7890/"
Environment="ALL_PROXY=http://192.168.1.141:7890/"
Environment="NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,169.254.0.0/16"
EOF

systemctl daemon-reload
systemctl restart docker
docker search mysql
  • 虚拟机开启共享网络
    network.png

镜像源/仓库

  • 仓库(Repository)是集中存放镜像的地方,官方维护公共仓库Docker Hub

  • 查找官方仓库中的镜像docker search REPOSITORY

  • 将官方镜像下载到本地docker pull REPOSITORY

  • 提交到远程仓库docker hub

    • https://hub.docker.comopen in new window 免费注册一个 Docker 账号docker id
    • 登录docker login(- 退出docker logout)
    • 将镜像指定为要提交到的dockerID/REGISTRYHOST(名字必须一样):docker tag IMAGE:TAG dockerID/REGISTRYHOST[:TAG]
    • 将指定REGISTRYHOST提交到远程仓库:docker push dockerID/REGISTRYHOST[:TAG]
  • 配置

mkdir -p /etc/docker
cat >/etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "https://hub.geekery.cn",
    "https://hub.littlediary.cn",
    "https://docker.rainbond.cc",
    "https://docker.unsee.tech",
    "https://docker.m.daocloud.io",
    "https://hub.crdz.gq",
    "https://docker.nastool.de",
    "https://hub.firefly.store",
    "https://registry.dockermirror.com",
    "https://docker.1panelproxy.com",
    "https://hub.rat.dev",
    "https://docker.udayun.com",
    "https://docker.kejilion.pro",
    "https://dhub.kubesre.xyz",
    "https://docker.1panel.live",
    "https://dockerpull.org",
    "https://docker.hlmirror.com",
    "https://docker.imgdb.de",
    "https://docker.m.daocloud.io", 
    "https://noohub.ru", 
    "https://huecker.io",
    "https://dockerhub.timeweb.cloud",
    "https://0c105db5188026850f80c001def654a0.mirror.swr.myhuaweicloud.com",
    "https://5tqw56kt.mirror.aliyuncs.com",
    "https://docker.1panel.live",
    "http://mirrors.ustc.edu.cn/",
    "http://mirror.azure.cn/",
    "https://hub.rat.dev/",
    "https://docker.ckyl.me/",
    "https://docker.chenby.cn",
    "https://docker.hpcloud.cloud",
    "https://docker.m.daocloud.io",
    "https://hub-mirror.c.163.com",
    "https://registry.aliyuncs.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}
EOF
systemctl daemon-reload
systemctl restart docker

Docker镜像

  • 从私有REPOSITORY/docker hub载入镜像:docker pull 镜像名(仓库源:TAG)
  • 查询本地镜像列表:docker images
    REPOSITORY:镜像的仓库源、TAG:标签、IMAGE ID:ID、CREATED:创建时间、SIZE:大小。同一仓库源可以有多个TAG,代表仓库源不同个版本
  • 在docker hub查询docker镜像:docker search 镜像名(仓库源:TAG)
  • 创建镜像
    从已经创建的容器中更新镜像,并且提交这个镜像docker commit -m="update message" -a="jun" CONTAINERID/NAME 镜像名[:TAG](-m: 提交的描述信息、-a: 指定镜像作者、e218edb10161:容器ID、runoob/ubuntu:v2: 要创建的镜像名)
    用Dockerfile指令来创建一个新的镜像 docker build [OPTIONS] PATH | URL | .
    --build-arg=[] :设置镜像创建时的变量
    --cpu-shares:cpu使用权重
    --cpu-period:限制CPU CFS周期
    --cpu-quota:限制CPU CFS配额
    --cpuset-cpus:指定使用的CPU id
    --cpuset-mems:指定使用的内存 id
    --disable-content-trust:忽略校验,默认开启
    -f:指定Dockerfile路径
    --force-rm:设置镜像过程中删除中间容器
    --isolation:使用容器隔离技术
    --label=[]:设置镜像使用的元数据
    -m:设置内存最大值
    --memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap
    --no-cache :创建镜像的过程不使用缓存
    --pull :尝试去更新镜像的新版本;
    --quiet, -q :安静模式,成功后只输出镜像 ID;
    --rm :设置镜像成功后删除中间容器;
    --shm-size :设置/dev/shm的大小,默认值是64M;
    --ulimit :Ulimit配置。
    --squash :将 Dockerfile 中所有的操作压缩为一层。
    --tag, -t: 镜像的名字及标签,通常name:tag或者name格式;可以一次构建设置多个标签√
    --network: 默认 default。在构建期间设置RUN指令的网络模式√
    .:构建镜像时的应用上下文路径,要被打包到镜像中的宿主机路径,必须包括Dockerfile文件,"."表示打包当前目录下的docker file和其他文件作为应用上下文√
runoob@runoob:~$ cat Dockerfile 
FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
FROM指定使用哪个镜像源
RUN在镜像内执行命令,安装了什么。。。

  • 删除镜像docker rmi 镜像名(仓库源:TAG)
  • 设置镜像标签docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

Docker容器

  • 基于镜像创建/启动容器:docker run [OPTIONS] REPOSITORY[:TAG] [COMMAND] [ARG...]
    • [OPTIONS]
      • --name指定名称,用于引用容器
      • -t 在新容器内指定一个伪终端或终端。与i同时使用,exit或CTRL+D退出
      • -i 给容器输入命令。与t同时用,exit或CTRL+D退出
      • -d detach 后台运行容器(没有则前台)
      • -p publish指定容器端口绑定到主机端口、网络地址(如127.0.0.1)、或udp
      • -P 容器端口随机映射主机端口
      • --network NETNAME容器连接网络
        -- docker连接系统将多个容器连接在一起,共享连接信息。创建一个父子关系,其中父容器可以看到子容器的信息
        • 查看网络列表docker network ls
        • 新建网络:docker network create -d bridge NETNAME(d:指定网络类型,有bridge、overlay(用于Swarm mode))
        • 有多个容器之间需要互相连接,推荐使用 Docker Compose
      • --rm 容器退出时自动清理容器内部的文件系统。不能与-d同时使用,自动清理foreground容器,匿名data volumes,但不能自动清理detached容器
      • -h或者--hostname 设定容器的主机名,它会被写到容器内的/etc/hostname和/etc/hosts。
      • dns=xxx 添加DNS服务器到容器的/etc/resolv.conf(容器dns配置)中,让容器用这个服务器来解析所有不在/etc/hosts中的主机名
      • dns-search=xxx 设定容器的搜索域,当设定搜索域为.example.com时,在搜索一个名为host的主机时,DNS不仅搜索 host,还会搜索host.example.comopen in new window
      • 如果在容器启动时没有指定dns和dns-search,Docker会默认用宿主主机上的 /etc/resolv.conf 来配置容器的
    • REPOSITORY[:TAG] 指定运行的镜像,如果本地主机不存在,Docker就会从镜像仓库Docker Hub下载公共镜像
    • [COMMAND] [ARG...] 镜像名后的命令,在启动的容器里执行的命令
      • 如/bin/sh -c "while true; do echo hello world; sleep 1; done"
      • 如/bin/echo "Hello world"
  • 启动容器,参数为以命令行模式进入该容器:docker run -itd ubuntu /bin/bash
  • docker attach CONTAINERID/NAME 进入容器终端:exit停止容器
  • docker exec -it CONTAINERID/NAME 进入容器终端:exit不停止容器√
  • [强行]删除正在运行的容器docker rm [--force] CONTAINERID/NAME
  • 列出正在运行[所有]容器:docker ps [--all]
  • 查看最后一次创建的容器docker ps -l
  • 停止/重启/启动正在运行的容器docker stop/restart/start CONTAINERID/NAME
  • 查看容器内部的进程docker top CONTAINERID/NAME
  • [滚动]查看容器日志docker logs [-f] CONTAINERID/NAME
  • 查看容器在属主机的端口docker port CONTAINERID/NAME
  • 查看docker底层信息docker inspect CONTAINERID/NAME
  • 指定路径导出容器:docker export CONTAINERID/NAME > 相对/绝对路径文件名
  • 指定路径导入容器:docker import 相对/绝对路径文件名/URL [REPOSITORY][:TAG]
  • 配置全部容器的DNS:主机的/etc/docker/daemon.json文件并重启docker
{
    "dns" : [
    "114.114.114.114",
    "8.8.8.8"
    ]
}

Docker volume

列出出所有卷:docker volume ls

Dockerfile

  • 用来构建镜像的文本文件,包含构建镜像所需的指令和说明。
  • 指令每次执行都会新建一层。过多无意义的层会造成镜像膨胀过大。使用&&符号连接命令执行后只会创建1层镜像(推荐RUN yum -y install wget
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gzopen in new window" \)
  • dockerfile指令
    • FROM:定制的镜像基于FROM的镜像
    • RUN:用于执行命令行命令,在docker build时运行
      • RUN <命令行命令> #shell格式 等同于在终端操作的shell命令
      • RUN ["可执行文件", "参数1", "参数2"] #exec 格式 RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
    • CMD:用于运行程序(可以被覆盖),在docker run时运行
      • CMD ["<可执行文件或命令>","<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
      • 为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。可被docker run命令行参数中指定要运行的程序所覆盖
      • 如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效
    • ENTRYPOINT:类似CMD,设置容器创建时的主要命令。不会被docker run的命令行参数指定的指令所覆盖.而且这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序.如果docker run时用--entrypoint选项参数可当作要运行的程序覆盖ENTRYPOINT指令指定的程序
      • ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
      • 如果存在多个ENTRYPOINT指令,仅最后一个生效
    • LABEL:添加镜像的元数据,使用键值对的形式。LABEL <key>=<value> <key>=<value> <key>=<value> ...
    • COPY:从上下文目录中复制文件或者目录到容器里指定路径
      • COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
      • COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
      • [--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。
      • <源路径>:源文件或者源目录,可以是通配符表达式(规则要满足Go的filepath.Match规则)
      • <目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建
    • ADD:和COPY的使用格式一致(官方推荐用COPY)
      • 优点:在执行<源文件>为tar压缩文件,格式为gzip, bzip2以及xz情况下,会自动复制并解压到 <目标路径>
      • 缺点:在不解压的前提下无法复制tar压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
    • ENV
      • 设置环境变量,指令可通过$key使用
      • ENV <key> <value>
      • ENV <key1>=<value1> <key2>=<value2>...
    • ARG
      • 设置环境变量,只有docker build过程中有效,构建好的镜像内不存在此环境变量
      • docker build可以用--build-arg <参数名>=<值>覆盖
      • ARG <参数名>[=<默认值>]
    • VOLUME
      • 定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷
      • 避免重要的数据,因容器重启而丢失。避免容器不断变大
      • VOLUME ["<路径1>", "<路径2>"...]
      • VOLUME <路径>
    • EXPOSE 配置映射端口
      • docker run -P时会随机映射EXPOSE端口
      • EXPOSE <端口1> [<端口2>...]
    • WORKDIR
      • 指定工作目录。在构建镜像的每一层中都存在。WORKDIR自动创建
      • docker build构建镜像过程中的,每一个RUN命令都是新建的一层。只有通过WORKDIR创建的目录才会一直存在
      • WORKDIR <工作目录路径>
    • USER
      • 用于指定执行后续命令的用户和用户组,切换后续命令执行的用户(用户和用户组必须存在)
      • USER <用户名>[:<用户组>]
    • HEALTHCHECK
      • 指定某个程序或者指令来监控 docker 容器服务的运行状态。
      • HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
      • HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
      • HEALTHCHECK [选项] CMD <命令> : CMD后面跟随的命令使用,参考CMD
    • ONBUILD
      • 当该镜像被用作另一个构建过程的基础时,添加触发器。
      • ONBUILD <其它指令>
    • STOPSIGNAL 设置发送给容器以退出的系统调用信号。
    • HEALTHCHECK 定义周期性检查容器健康状态的命令。
    • SHELL 覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。

docker Compose

  • 用于定义和运行多容器Docker应用程序的工具。用命令从YML文件配置中创建并启动所有服务
  • Compose使用:
    • 使用 Dockerfile 定义应用程序的环境
    • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
    • 执行 docker-compose up [-d]命令来启动并[后台]运行整个应用程序
    • 停止并删除由docker-compose启动的容器、网络等:docker-compose down
  • yml配置
    • version 指定本 yml 依从的 compose 哪个版本制定的。
    • service
      • webapp webapp服务
        • build 指定为构建镜像上下文路径
          • context:构建镜像时的应用上下文路径,需要被打包到Docker镜像中的宿主机路径
          • dockerfile:构建镜像的Dockerfile文件名。
          • args:添加构建参数,只能在构建过程中访问的环境变量。
          • labels:构建镜像的标签。
          • target:多层构建,可以指定构建哪一层
    • cap_add,cap_drop添加或删除容器拥有的宿主机的内核功能ALL全部权限 SYS_PTRACE:ptrace权限
    • cgroup_parent 为容器指定父 cgroup 组,限制继承该组的资源
    • command 覆盖容器启动的默认命令
    • container_name 指定自定义容器名称,而不是生成的默认名称
    • depends_on 设置依赖关系。
      • docker-compose up :以依赖性顺序启动服务。先启动depends_on指定的service再启动该service
      • docker-compose up SERVICE :自动包含 SERVICE 的依赖项。
      • docker-compose stop :按依赖关系顺序停止服务。
    • deploy 指定与服务的部署和运行有关的配置。只在 swarm 模式下才有用。
      • endpoint_mode: vip # Docker集群服务一个对外的虚拟ip。所有的请求都会通过这个虚拟ip到达集群服务内部的机器
      • endpoint_mode: dnsrr # DNS 轮询(DNSRR)。所有的请求会自动轮询获取到集群ip列表中的一个ip地址
    • labels:在服务上设置标签。可以用容器上的labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。
    • mode:指定服务提供的模式。
      • replicated:复制服务,复制指定服务到集群的机器上。
      • global:全局服务,服务将部署至集群的每个节点。
    • replicas:mode 为 replicated 时配置具体运行的节点数量。
    • resources:配置限制使用服务器资源
    • restart_policy:配置如何在退出容器时重新启动容器。
      • condition:可选 none,on-failure 或者 any(默认)
      • delay:设置多久之后重启(默认0)。
      • max_attempts:尝试重新启动容器的次数,超出次数则不再尝试(默认一直重试)。
      • window:设置容器重启超时时间(默认0)
    • rollback_config:配置在更新失败的情况下应如何回滚服务。
      • parallelism:一次要回滚的容器数。如果设置为0,则所有容器将同时回滚。
      • delay:每个容器组回滚之间等待的时间(默认为0s)。
      • failure_action:如果回滚失败,该怎么办。其中一个 continue 或者 pause(默认pause)。
      • monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
      • max_failure_ratio:在回滚期间可以容忍的故障率(默认为0)。
      • order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认 stop-first )。
    • update_config:配置应如何更新服务,对于配置滚动更新很有用。
      • parallelism:一次更新的容器数。
      • delay:在更新一组容器之间等待的时间。
      • failure_action:如果更新失败,该怎么办。其中一个 continue,rollback 或者pause (默认:pause)。
      • monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
      • max_failure_ratio:在更新过程中可以容忍的故障率。
      • order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认stop-first)。
    • devices 指定设备映射列表。
    • dns自定义 DNS 服务器,可以是单个值或列表的多个值。
    • dns_search自定义 DNS 搜索域。可以是单个值或列表。
    • entrypoint覆盖容器默认的 entrypoint。
    • env_file从文件添加环境变量。可以是单个值或列表的多个值。
    • environment添加环境变量。可用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
    • expose暴露端口,但不映射到宿主机,只被连接的服务访问。
    • extra_hosts添加主机名映射。类似 docker client --add-host。会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系
    • healthcheck用于检测 docker 服务是否健康运行。
    • image指定容器运行的镜像。
    • logging服务的日志记录配置。driver:指定服务容器的日志记录驱动程序,默认值为json-file。
      • driver: "json-file"
      • driver: "syslog"
      • driver: "none"
    • network_mode设置网络模式。
      • networks配置容器连接的网络
      • aliases :同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。
      • restart
        • no:是默认的重启策略,在任何情况下都不会重启容器。
        • always:容器总是重新启动。
        • on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
        • unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
        • swarm 集群模式,请改用 restart_policy。
    • secrets存储敏感数据,例如密码:
    • security_opt修改容器默认的 schema 标签。
    • stop_grace_period指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器。默认的等待时间是 10 秒。
    • stop_signal设置停止容器的替代信号。默认情况下使用 SIGTERM 。
    • sysctls设置容器中的内核参数,可以使用数组或字典格式。
    • tmpfs在容器内安装一个临时文件系统。可以是单个值或列表的多个值。
    • ulimits覆盖容器默认的 ulimit。
    • volumes将主机的数据卷或着文件挂载到容器里。
  • https://docs.docker.com/compose/compose-file/open in new window

Docker 其他

  • 查看docker客户端的所有命令COMMAND选项:docker
  • 查看docker指定命令的使用方法:docker COMMAND --help
  • 检查docker的版本:docker -v
  • 关闭docker:systemctl stop docker
  • 查看docker状态:systemctl status docker
  • 强制重启并修复状态:systemctl reset-failed docker.service
  • 显示 Docker 系统的详细信息 docker info

Docker Swarm(被k8s代替)

Docker 的集群管理工具。将主机池转变为单个虚拟主机。所有任何与Docker守护程序通信的工具都轻松地扩展到多个主机
swarm集群构成。
swarm mananger节点:负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。
work node节点:负责运行相应的服务来执行任务(task)。

# 管理节点初始化swarm集群并得到加入命令
docker swarm init --advertise-addr $swarm_ip
# 工作节点执行加入命令加入集群
docker swarm join --token SWMTKN-1-4oogo9qziq768dma0uh3j0z0m5twlm10iynvz7ixza96k6jh9p-ajkb6w7qd06y1e33yrgko64sk 192.168.99.107:2377
# 查看当前集群的信息:swarm:active,Managers:1,Nodes:1
docker info

Docker问题

  • the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'
  • windows cmd权限不足,以管理员运行即可

docker部署带有docker的容器

# 创建Dockerfile
cat >Dockerfile<<-'EOF'
FROM centos:8

# 替换为阿里云源,并安装必要的软件
RUN sed -i 's|mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-* && \
    sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://mirrors.aliyun.com|g' /etc/yum.repos.d/CentOS-* && \
    yum install -y yum-utils openssh-server passwd wget tar vim && \
    yum clean all && \
    rm -rf /var/cache/yum && \
    mkdir /var/run/sshd && \
    ssh-keygen -A

# 设置 root 密码为 "root"
RUN echo "root:root" | chpasswd

# 下载并安装 JDK,删除临时文件以减少镜像大小
RUN wget --no-check-certificate https://manongbiji.oss-cn-beijing.aliyuncs.com/ittailkshow/devops/download/jdk-8u341-linux-x64.tar.gz && \
    tar -zxvf jdk-8u341-linux-x64.tar.gz -C /usr/local && \
    mv /usr/local/jdk1.8.0_341 /usr/local/jdk && \
    rm -f jdk-8u341-linux-x64.tar.gz

# 配置 JDK 环境变量并写入 /etc/profile
RUN echo "export JAVA_HOME=/usr/local/jdk" >> /etc/profile && \
    echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> /etc/profile

# 安装 Docker 并删除临时文件
RUN yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo && \
    yum install -y docker-ce docker-ce-cli containerd.io && \
    yum clean all && \
    rm -rf /var/cache/yum

# 配置 JDK 环境变量并写入 /etc/profile
RUN echo "export DOCKER_TLS_CERTDIR=""" >> /etc/profile && \
    echo "export HTTP_PROXY=http://192.168.1.141:7890/" >> /etc/profile && \
    echo "export HTTPS_PROXY=http://192.168.1.141:7890/" >> /etc/profile && \
    echo "export NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,169.254.0.0/16" >> /etc/profile && \
    mkdir /var/lib/docker && \
    mkdir -p /etc/systemd/system/docker.service.d && \
    touch /etc/systemd/system/docker.service.d/http-proxy.conf && \
    echo "[Service]" >> /etc/systemd/system/docker.service.d/http-proxy.conf && \
    echo "Environment=\"HTTP_PROXY=http://192.168.1.141:7890/\"" >> /etc/systemd/system/docker.service.d/http-proxy.conf && \
    echo "Environment=\"HTTPS_PROXY=http://192.168.1.141:7890/\"" >> /etc/systemd/system/docker.service.d/http-proxy.conf && \
    echo "Environment=\"NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,169.254.0.0/16\"" >> /etc/systemd/system/docker.service.d/http-proxy.conf && \
    mkdir -p /etc/docker && \
    touch /etc/docker/daemon.json && \
    echo "{\"registry-mirrors\": [],\"insecure-registries\": [\"192.168.1.5:8080\"]}" >> /etc/docker/daemon.json

# 暴露 Docker 和 SSH 的端口
EXPOSE 22 2375

# 设置启动命令,确保容器前台运行
CMD ["/bin/bash", "-c", "\
    /usr/sbin/sshd && \
    HTTP_PROXY=http://192.168.1.141:7890 \
    HTTPS_PROXY=http://192.168.1.141:7890 \
    NO_PROXY=localhost,127.0.0.1 \
    dockerd --host=unix:///var/run/docker.sock --host=tcp://0.0.0.0:2375 & \
    sleep 5 && \
    tail -f /dev/null"]
EOF

# 构建镜像
docker build -t centos7-root-ssh .

# 创建容器
docker stop centos7-macvlan
docker rm centos7-macvlan
docker run -dit --privileged --name centos7-macvlan --network macvlan31 --ip=192.168.1.4 centos7-root-ssh

# 查看centos的ip
docker network inspect macvlan31
"ee7669e51c31926b7d91f0ce8809a7d7f7a3a0300d7e711549ed4ff9efb2d149": {
    "Name": "centos7-macvlan",
    "EndpointID": "94c356d7ba81b0a7afbc95b2d636e4c04c166cf66079a0cd8ecaba3482beabf3",
    "MacAddress": "02:42:c0:a8:01:04",
    "IPv4Address": "192.168.1.4/24",
    "IPv6Address": ""
}

# docker里面启动docker
dockerd &
# 关闭docker
pkill dockerd