Docker核心概念与使用

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Docker学习笔记和总结,涵盖了Docker的核心概念、基本操作和实战应用。

核心概念

什么是Docker

Docker(Moby)诞生于2013年,是一款基于 Linux LXC 容器化技术的开源的容器引擎。需要注意的是,2013版原始的开源版本 "Docker" 现在其实不叫 "Docker" 了,而是 "Moby"。这一改变发生在 2017 年的 Docker Con 大会上,因此我们现在常说的 "Docker" 实际上代表的是 Docker 公司,现在市面上所能看到的 Docker 版本通常为 Docker EE(企业版)和 Docker CE(社区版),也就是收费版和免费版本的区别,而现在的 Docker CE 实际上就可以理解为 "Moby"。
Docker拥有标准化与隔离性,就意味着我们可以轻松的为需要部署的应用构建一套独立的运行环境,且可以在任意支持容器运行的环境中快速部署我们的应用,提高应用的交付能力。

Docker与虚拟机

在这里插入图片描述

容器是应用程序的抽象,将应用程序代码与环境打包在一起构建一套独立的运行环境,多个容器可以在一台计算机上运行并且与其他容器共享OS内核。且每个容器之间利用用户空间来进行资源隔离,相对于操作系统来说是非常轻量的。
虚拟机
而虚拟机则完全是对于一台计算机的抽象,一个操作系统上可以运行多个虚拟机,但每个虚拟机都是一个独立运行的操作系统,且有着完整的一套基于硬件设备的虚拟设备进行资源的隔离,这样的抽象方式导致虚拟机无论是在运行时的资源损耗还是启动的效率都是非常重量级的操作。

Docker的结构

在这里插入图片描述
Docker是C/S架构,分为客户端和服务端,在安装时会默认全部安装。客户端负责向服务端发起操作请求,服务端接受请求响应处理结果。Docker服务端主要包含了容器引擎和镜像管理两部分,其中镜像管理可以连接镜像仓库和管理本地镜像,容器引擎负责执行任务,运行镜像的实例容器。

Docker操作

安装Docker

CentOS7(使用 yum 进行安装)

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# PS:如果出现如下错误信息
Loaded plugins: fastestmirror
adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
Could not fetch/save url https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to file /etc/yum.repos.d/docker-ce.repo: [Errno 14] curl#60 - "Peer's Certificate issuer is not recognized."
# 编辑 /etc/yum.conf 文件, 在 [main] 下面添加 sslverify=0 参数
vi /etc/yum.conf
# 配置如下----------------------
[main]
sslverify=0
# -----------------------------

# Step 3: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce

# Step 4: 开启Docker服务
sudo systemctl start docker

# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ee.repo
#   将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
#   Loading mirror speeds from cached hostfile
#   Loaded plugins: branch, fastestmirror, langpacks
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
#   Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]

Ubuntu 14.04/16.04(使用 apt-get 进行安装)

# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce

# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
#   docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
#   docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]

安装校验

[root@iZ2ze18rmx2avoq1z744lcZ ~]# docker version
Client: Docker Engine - Community
 Version:           26.1.4
 API version:       1.45
 Go version:        go1.21.11
 Git commit:        5650f9b
 Built:             Wed Jun  5 11:32:04 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          26.1.4
  API version:      1.45 (minimum version 1.24)
  Go version:       go1.21.11
  Git commit:       de5c9cf
  Built:            Wed Jun  5 11:31:02 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.33
  GitCommit:        d2d58213f83a351ca8f528a95fbd145f5654e957
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

Docker加速

Docker 默认下载镜像的仓库是在国外的, 可以配置国内一些大公司与学校搭建了一些国内的镜像仓库来加速,但近期国内的镜像也逐渐被封禁,具体的解决方案还要再观察等待。

CentOS 配置镜像加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["此处修改成你自己的加速 url"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

windows 配置镜像加速

在设置中添加配置

"registry-mirrors": [
    "此处修改成你自己的加速 url"
  ]

在这里插入图片描述

镜像操作

操作 命令 参数说明
查找镜像 docker search 镜像名称
拉取镜像 docker pull 镜像名称:标签(版本号)
查看本地镜像 docker images
删除镜像 docker rmi 镜像名称:版本号 -f :强制删除

容器操作

操作 命令 参数说明
创建并运行一个容器 docker run 参数... 镜像名称 -p(小写)主机端口:容器端口:将主机端口映射到容器中的某端口,
-P(大写):暴露容器中的所有端口到主机的随机端口
--name 容器名称:指定容器名称
--rm:当容器关闭时自动删除
--restart 策略:no(默认)表示不重启;on-failure,当失败时重启,还可以加上 :3 指定最多重启3次,如果3次都失败就不再重启了;always,只要已关闭就自动重启
-e 环境变量 或 --env 环境变量:环境变量使用 name=value 的方式,可以配置多个,使用逗号分割
查看容器 docker ps 参数... -a:查看所有容器,包括停止的
删除容器 docker rm 参数... 容器id或名称 -f :强制删除
停止容器 docker stop 容器id或名称
启动容器 docker start 容器id或名称
查看容器日志 docker logs 参数... 容器id或名称 -f:实时显示
-t:显示日志生成时的时间戳(默认中时区)
--tail:显示最后的条数
-since:从指定时间戳开始(默认中时区,即在北京东八区的时间戳上减去8小时)
在容器中执行指令(进入容器内部) docker exec 参数... 容器id或名称 进入后执行的命令 -t:分配一个虚拟的终端
-i :把交互界面保留

仅列举了这段时间常用的指令参数,所有指令均可以通过 --help 参数来查看指令说明和参数说明

数据卷 Volume

基本概念

数据卷相当于是容器的虚拟文件系统和主机的真实文件系统之间的一个桥梁,建立数据卷就相当于是打通了容器于主机之间的文件交互通道,可以让容器运行时所产生的数据变更被保存到主机中,能够更方便的对数据进行备份以及保护。
当我们在容器中运行一些关键的应用如MySQL、Redis等服务,其中都会存储着一些关键数据,这些数据是你希望即使删除容器也不应该被删除的,此时我们便需要用到数据卷了。
可以将数据卷理解为文件目录的映射,我们可以通过 Docker 提供的相关命令,来将主机中的某一个文件目录映射到容器中,此时当你在容器中操作该目录下的文件时,实际上操作的就是主机中的文件。

绑定方式

匿名绑定

在启动容器时直接使用 -v /container_dir 即可完成匿名绑定,匿名绑定的方式将在 Docker 的 volumes 目录下生成一个 sha256 的字符串作为目录名,且指定的 /container_dir 中的文件或目录会被保存在该处,匿名绑定的 volume 在容器被删除的时候,数据卷也会被删除。

docker run --rm -d -p 80:80 -v 容器目录 镜像名称或ID

匿名绑定方式由于不知道名称,因此如果需要查看数据卷在主机的哪个位置,需要使用 docker inspect container_id 来查看。

具名绑定

同样是启动容器时绑定一个数据卷,不同的是可以为该数据卷起个名字 -v volume-name:container_dir,通过名字你可以快速的定位并管理这些 volume

docker run --rm -d -p 80:80 -v 数据卷名称:容器目录 镜像名称或ID

Bind Mount

绑定并加载主机的某个文件目录到容器中,这种方式是平常最常用的。这种绑定方式与前面两种一样,也是在容器启动时使用 -v host_dir:container_dir 的格式来完成映射

docker run --rm -d -p 80:80 -v 宿主机目录1:容器目录1 -v 宿主机目录2:容器目录2 镜像名称或ID

网络 Network

基本概念

Network是 Docker 对容器网络隔离的一项技术,提供了多种不同的模式供用户使用,选择不同的网络模式来实现容器网络的互通以及彻底的隔离。

网络模式

bridge

容器拥有独属于自己的虚拟网卡和和虚拟IP等网络资源,在主机中创建一个 Docker0 的虚拟网桥,在 Ddocker0 创建一对虚拟网卡,有一半在主机上 vethxxx,还有一半在容器内 eth0,是默认模式。
bridge模式下,同一网段的主机,是不能直接访问宿主机内部容器的,必须通过端口映射。
在这里插入图片描述

host

容器没有自己的任何独立的网络资源(比如:容器的IP、网卡和端口),完全和宿主机共享网络空间。
Host模式下,其他同一网段的虚拟主机可以直接访问宿主机内部的容器,给人的感觉就是:“宿主机就是容器,容器就是宿主机”。然而除了网络资源,容器之间的其他资源依然是相互隔离的。
Host模式在docker run的时候,添加参数--net=host来指定
在这里插入图片描述

none

Docker 会拥有自己的网络空间,不与主机共享,在这个网络模式下的容器,不会被分配网卡、ip、路由等相关信息。特点是完全隔离,与外部任何机器都无网络访问,只有自己的 lo 本地网络 127.0.0.1。
none模式在docker run的时候,添加参数--net=none来指定
在这里插入图片描述

container

容器不创建自己的网络空间,而是与其他容器共享网络空间,直接使用指定容器的ip/端口等
container模式,通过--net=container后面直接跟冒号,冒号后面是它所依靠的指定容器,例如:--net=container:nginx_Num1
在这里插入图片描述

自定义

不用 Docker 自带的网络模式,而是自己去定制化自己特有的网络模式,通过docker netwok命令。
以下为创建自定义网络的例子:

docker network create -driver birdge --subnet 192.168.31.0/24 --gateway 192.168.31.1 testnet

自定义网络中所有主机除ip访问外,还可以直接用容器名(container-name)作为hostname相互访问。
默认是不能通过hostname来进行访问的,也可以通过 --link 容器名或ID的方式来实现,其原理是在容器内部的hosts文件注册对应容器的IP

两个使用不同网络的容器进行跨网络通信,需要将两个不同网络之间建立连接,通过以下命令:

docker network connect net1 net2

Dockerfile

基本概念

Docker 为我们提供的一个用于自定义构建镜像的一个配置文件Dockerfile,用于描述如何构建一个对象,利用 Docker 提供的 build 命令,指定 Dockerfile 文件,就可以按照配置的内容将镜像构建出来。

常用指令

指令 说明
FROM 指定以什么镜像作为基础镜像,在改进项的基础之上构建新的镜像。
如果不想以任何镜像作为基础:FROM scratch
语法:
FROM image
FROM image:tag
FROM image:version
以上为三种写法,后两者为指定具体版本,第一种则使用 latest 也就是最新版
MAINTAINER 指定该镜像的作者
语法:
MAINTAINER name
LABEL 为镜像设置标签,一个 Dockerfile 中可以配置多个 LABEL
语法:
LABEL key=value
如:
LABEL "example.label"="Example Label"
LABEL label-value="LABEL"br<>LABEL version="1.0.0"
LABEL description="可以写成多行,使用 \符号可以拼接多行的 value"
ENV 设置容器的环境变量,可以设置多个
语法:
ENV key value
ENV key=value key=value ...
两种语法的区别为第一种一次只能设置一个环境变量,第二种可以一次设置多个
RUN 构建镜像的过程中要执行的命令
语法:
RUN command
RUN ["executable", "param1", "param2"]
第一种写法就是直接写 Shell 脚本即可
第二种写法类似函数调用,第一个参数为可执行文件,后面的都是参数
ADD 复制命令,把 src 的文件复制到镜像的 dest 位置,可以自动解压缩
语法:
ADD src dest
ADD ["src", "dest"]
WORKDIR 设置工作目录,可以简单理解为 cd 到指定目录,如果该目录不存在会自动创建,对 RUN、CMD、ENTRYPOINT、COPY、ADD 生效,可以设置多次 WORKDIR
语法:
WORKDIR dir
表示在容器内创建了 dir 目录,并且当前目录已经是 dir 目录了
VOLUME 设置挂载目录,可以将主机中的指定目录挂载到容器中
语法:
VOLUME ["dir"]
VOLUME dir
VOLUME dir dir
EXPOSE 改镜像运行容器后,需要暴露给外部的端口,但仅仅表示该容器想要暴露某些端口,并不会与主机端口有映射关系,如果想将容器暴露的端口与主机映射则需要使用 -p 或 -P 参数来映射,可以暴露多个端口
语法:
EXPOSE port[/tcp/udp]
CMD 该镜像启动容器时默认执行的命令或参数
语法:
CMD ["executable", "param1", "param2"]
CMD ["param1", "param2"]
CMD command param1 param2
以上为该命令的三种写法,第三种与普通 Shell 命令类似,第一、二两种都是可执行文件 + 参数的形式,另外数组内的参数必须使用双引号。
案例:
第一种:CMD ["sh", "-c", "echo $HOME"] 等同于 sh -c "echo $ HOME"
第二种:CMD ["echo", "$HOME"] 等同于 echo $HOME
ENTRYPOINT 运行容器时的启动命令,感觉与 CMD 命令会很像,实际上还是有很大区别,简单对比一下:
相同点:
在整个 Dockerfile 中只能设置一次,如果写了多次则只有最后一次生效
不同点:
ENTRYPOINT 不会被运行容器时指定的命令所覆盖,而 CMD 会被覆盖
语法:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
ARG 设置变量,在镜像中定义一个变量,当使用 docker build 命令构建镜像时,带上 --build-arg name=value 来指定参数值,如果该变量名在 Dockerfile 中不存在则会抛出一个警告
语法:
ARG name[=default value]
COPY COPY 指令从 src 复制新文件、目录或远程文件 URL,并将它们添加到路径 dest
语法
COPY src dest

仓库 Registry

基本概念

镜像仓库是用于管理 Docker 的镜像,当应用开发完成后,直接打包为一个镜像,将镜像上传到仓库后,可以在任何装有 Docker 的机器上下载该镜像,并运行为一个容器。

常用仓库

  • Docker Hub:https://hub.docker.com,目前已被封禁
  • 阿里云:在容器镜像服务ACR中,个人用户可免费创建3个命名空间、300个仓库,其中每个仓库只能上传一个镜像
  • 自主搭建(私服仓库):常用的私服仓库有Nexus和Harbor

Nexus搭建过程:

# 创建持久化目录
mkdir -p /opt/docker/nexus
# 开放权限
chmod 777 -R /opt/docker

# 启动 nexus 容器
docker run -d --restart=always -p 8868:8081 -p 5000:5000 -p 5001:5001 --name nexus -v /opt/docker/nexus:/nexus-data sonatype/nexus3

查看默认密码
docker exec -it nexus /nexus-data/admin.password

仓库的使用

  1. 配置:docker默认使用https,要适配http可以在 /etc/docker/damon.json 文件中加入 inscure-repositries: ["仓库访问地址"]
  2. 认证:docker login -u用户名 仓库地址
  3. 推送镜像到仓库:
第一步:基于镜像打标签
阿里云:
docker tag <image id> registry.cn-hangzhou.aliyuncs.com/命名空间/仓库名称:版本

私服仓库:
docker tag <image id> 仓库路径/镜像名称:版本

第二步:推送
docker push <tagName>[:版本]
  1. 从仓库拉取镜像
登录:
docker login -u用户名 仓库地址

docker pull 仓库路径/镜像名称:版本

容器编排

基本概念

容器编排就是针对容器生命周期的管理,对容器的生命周期进行更快速方便的方式进行管理。

Docker Compose(单机)

有的时候我们会需要涉及到在一台机器部署多个容器,那么此时再手动的每次输入相关的一堆配置命令再来启动容器,还是产生了很多无意义的重复性劳动。针对单机的多容器部署的情况,Docker 为我们提供了一个单机版本的服务编排工具 docker-compose
Docker-Compose 可以高效便捷的管理单机上运行的所有容器,它通过 yaml 配置文件的方式完成之前执行 docker run 命令所设置的所有参数,你可以先针对单机上的所有容器进行相关配置,配置完成后即可使用 docker-compose 对单机多容器进行高效的管理

Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file
                              (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name
                              (default: directory name)
  --verbose                   Show more output
  --log-level LEVEL           Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
  --no-ansi                   Do not print ANSI control characters
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the
                              name specified in the client certificate
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the Compose file)
  --compatibility             If set, Compose will attempt to convert deploy
                              keys in v3 files to their non-Swarm equivalent

Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

yaml配置文件可参考文档:https://www.bookstack.cn/read/dockerdocs/Compose-yml.md

以下为一个简单例子:

version: "2.1"
services:
  # 其中一个service配置
  nginx-demo:
    container_name: "nginx_compose"
    image: "nginx"
    restart: "always"
    ports:
      - 80
    networks:
      - my_net
    environment:
      APP_ENV: dev
networks:
  my_net:
    ipam:
      driver: default
      config:
        - subnet: 188.18.0.0/16
          gateway: 188.18.0.1

Swarm(分布式)

核心概念

Swarm 是 Docker 公司推出的用来管理 docker 集群的平台,Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
在这里插入图片描述

关键概念
  • Swarm
    集群的管理和编排是使用嵌入 docker 引擎的 SwarmKit,可以在docker 初始化时启动 swarm 模式或者加入已存在的 swarm,从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具。
    swarm 集群节点的管理命令:docker swarm --help
    • 初始化集群节点
    • 加入节点
    • 退出节点
  • Node
    运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。
    节点分为管理 (manager) 节点和工作 (worker) 节点。
    管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。通常,第一个启用docker swarm的节点将成为leader,后来加入的都是follower。当前的leader如果挂掉,剩余的节点将重新选举出一个新的leader。每一个manager都有一个完整的当前集群状态的副本,可以保证manager的高可用。
    工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。worker节点之间,通过control plane进行通信,这种通信使用gossip协议,并且是异步的。
  • Task
    任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
  • Service
    服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:
    • replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
    • global services 每个工作节点上运行一个任务
      两种模式通过 docker service create 的 --mode 参数指定

实际应用

集群搭建
初始化集群
登录管理节点,并执行如下命令
docker swarm init --advertise-addr 192.168.113.120

使用 docker info 可以查看 swarm 集群状态

docker node ls 可以查看集群节点信息
增加工作节点
分别在两个工作节点上执行加入节点命令

docker swarm join \
-- token 集群初始化时的 token 信息 \
192.168.113.120:2377
查看集群
进入主节点,输入如下命令查看集群节点信息
docker node ls
部署服务
新建服务
进入主节点,创建一个 helloworld 服务
docker service create --replicas 1 -p 80:80 --name nginx_swarm nginx

命令结束:
docker service create 创建一个服务
--name 设置服务名称
--replicas 设置启动多少个实例

通过 docker service ps <service id> 可以查看服务信息
通过 docker service ls 可以查看 Swarm 集群下运行的所有服务
监控集群状态
查看服务信息:
docker service inspect --pretty <service id>
--pretty 参数可以简化输出内容

docker service ps <service id> 可以查看运行中的服务信息

进入工作节点通过 docker ps 可以查看容器运行状态
弹性伸缩
调整实例个数

更新服务的实例个数:
docker service update --replicas <num> <service id/name>
调整集群大小
添加新的 Docker 节点,执行 docker swarm join 命令可以加入集群

执行 docker swarm leave 可以退出集群,也可以带上 --force 参数强制退出集群

可视化工具 Portainer

Portainer是一款轻量级可视化工具,基于图形界面来对Docker进行管理

docker search portainer 搜索 portainer,选择自己需要的版本进行下载

# 基于 docker 运行
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

# 基于 swarm 运行
docker service create -p 9000:9000 --replicas 1 --mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock --mount type=volume,src=portainer_data,dst=/data portainer/portainer

项目实战

Docker Desktop on Windows

  1. 开启虚拟化服务
    进入控制面板 > 程序 > 启用或关闭 Windows 功能,开启Hyper-V、适用于 Linux 的 Windows 子系统、虚拟机平台
如果服务中没有 Hyper-V,创建一个文本文件,保存下方内容
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL
保存后,将文本文件后缀修改为 cmd,并且用管理员身份运行,运行完成后输入 y 重启电脑,之后再打开 Hyper-V 就可以运行了。
  1. wsl 安装 ubuntu
  • 安装
# 设置 wsl2 为默认版本
wsl --set-default-version 2

# 安装 ubuntu
wsl --install -d Ubuntu

# 安装完成后,重新打开的窗口需要输入新的 linux 用户名与密码

# 用户名密码填完后,使用 PowerShell 查看当前版本,确认版本是否为 2,如果为 2 则不用升级
wsl -l -v
  • 升级 wsl2
如果以前已经装过其他 linux 子系统,且 wsl 版本为 1 的,按照以下步骤升级
`.执行并安装 wsl_update_x64.msi 
2.设置 wsl2 为默认版本 wsl --set-default-version 2
2.查询需要升级的版本 wsl -l -v
4.选择对应的版本升级 wsl --set-version <第三步查到的名称> 2
5.输出转换完成后表示成功,通过 wsl -l -v 再次确认版本是否转换成功
  1. 安装 Docker Desktop
  • 闪退问题
    基于第一步开启对应的三个功能
  • 一直卡在 Docker engine starting
    如果出现一直卡在 Engine starting,按住 shift 键在任意空白位置右键,打开 Power Shell,并执行如下两行命令
    cd "C:\Program Files\Docker\Docker"
    ./DockerCli.exe -SwitchDaemon
  1. 客户端设置
  • 启用 wsl 虚拟机子系统
    在设置界面中找到 Resources > WSL Integration 选项
    勾选 Enable integration with my default WSL distro
    且启用下方你所安装的 linux 子系统,如 Ubuntu
    修改完成后,点击右下方的 Apply & restart 按钮重启 Docker

  • 配置仓库与镜像
    找到设置页面中的 Docker Engine,进去以后修改原先的 json 文件,加入如下内容

insecure-registries:信任的仓库列表,用于 pull/push 镜像
registry-mirrors:镜像仓库列表,用于提升镜像下载速度
"insecure-registries": [
    "192.168.113.121:5000",
    "192.168.113.121:5001"
  ],
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "https://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]

修改完毕后点击右下方的 Apply & restart 按钮

IntelliJ IDEA 构建 Docker 镜像

常见插件maven插件

Spring Boot Maven 打包插件内置的 build-image

官方文档:https://docs.spring.io/spring-boot/docs/current/maven-plugin/reference/htmlsingle/#build-image
Spring Boot 2.3 版本后默认集成了用于构建 Maven 镜像的插件,只要是 Spring Boot 项目,就可以直接使用,前提是本地环境中安装了 Docker。

命令:

mvn spring-boot:build-image

拓展配置:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <!-- 指定打包后的镜像名 -->
        <imageName>${groupId}/${project.artifactId}:${project.version}</imageName>
        <docker>
            <!-- 配置发布的仓库信息 -->
            <publishRegistry>
                <url>http://xxx:xx</url>
                <username>xxx</username>
                <password>xxx</password>
            </publishRegistry>
        </docker>
    </configuration>
</plugin>

Google 的 jib-maven-plugin

Jib 是一个 Maven 和 Gradle 插件,用来创建 Docker 镜像。它最大的特点是,你的本地可以没有 Docker 也可以进行构建,同样也不需要编写 Dockerfile 文件,不用改动代码,甚至不用修改 pom.xml 文件,运行如下命令即可:

mvn compile com.google.cloud.tools:jib-maven-plugin:2.3.0:dockerBuild

Spotify 的 dockerfile-maven-plugin

专门基于 Dockerfile 构建镜像的插件,也是目前市面上用的比较多的镜像构建方式之一。

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>dockerfile-maven-plugin</artifactId>
    <version>1.4.13</version>
    <executions>
        <execution>
            <id>default</id>
            <!-- 自定义构建、推送命令 -->
            <goals>
                <goal>build</goal>
                <goal>push</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <!-- 打包后的完整镜像名:仓库路径/组织/镜像名 -->
        <repository>IP:port/xxx/${project.artifactId}</repository>
        <!-- 镜像版本号 -->
        <tag>${project.version}</tag>
        <!-- 读取 settings.xml 文件中的认证信息 -->
        <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
        <buildArgs>
            <!-- jar 所在目录 -->
            <JAR_FILE>target/${project.artifactId}-${project.version}.jar</JAR_FILE>
        </buildArgs>
    </configuration>
</plugin>

Dockerfile 配置

## 基础镜像
## AdoptOpenJDK 停止发布 OpenJDK 二进制,而 Eclipse Temurin 是它的延伸,提供更好的稳定性
FROM eclipse-temurin:8-jre

## 作者
MAINTAINER xxx

## 定义参数
ARG JAR_FILE

## 创建并进入工作目录
RUN mkdir -p /xxx
WORKDIR /xxx

## maven 插件构建时得到 buildArgs 种的值
COPY ${JAR_FILE} app.jar

## 设置 TZ 时区
## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖
ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms256m -Xmx256m"

## 暴露端口
EXPOSE 8080

## 容器启动命令
## CMD 第一个参数之后的命令可以在运行时被替换
CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar app.jar

构建镜像

mvn dockerfile:build

推送镜像到仓库

在 maven 的 settings.xml 文件的 servers 标签中,增加服务认证配置信息

    <server>
      <id>192.168.113.121:5000</id>
      <username>admin</username>
      <password>wolfcode</password>
    </server>
mvn dockerfile:push

镜像构建项目实战顶下载。

实战项目包括Java Web项目、Springboot项目和Spring Cloud 微服务项目,相关项目代码:https://download.csdn.net/download/codezxhy/89500853

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
存储 监控 安全
【专栏】探讨Docker Compose的核心概念、使用方法及最佳实践,助你轻松驾驭容器编排的世界
【4月更文挑战第27天】Docker Compose是款轻量级容器编排工具,通过YAML文件统一管理多容器应用。本文分三部分深入讨论其核心概念(服务、网络、卷和配置)、使用方法及最佳实践。从快速入门到高级特性,包括环境隔离、CI/CD集成、资源管理和安全措施。通过案例分析展示如何构建多服务应用,助力高效容器编排与管理。
|
2月前
|
存储 持续交付 Docker
Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
55 0
|
9月前
|
存储 Kubernetes 持续交付
Docker 核心概念深度解析:探索容器、镜像和仓库在Docker生态系统中的重要作用和 应用
Docker 核心概念深度解析:探索容器、镜像和仓库在Docker生态系统中的重要作用和 应用
191 0
|
28天前
|
存储 运维 持续交付
介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
22 0
|
2月前
|
存储 Kubernetes Docker
Kubernetes(K8S)集群管理Docker容器(概念篇)
Kubernetes(K8S)集群管理Docker容器(概念篇)
|
2月前
|
存储 运维 数据中心
Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
Docker是容器化技术,基于镜像(只读模板)创建可移植的容器,确保应用及其服务在隔离环境中运行。其优势包括快速部署(整个应用打包一次部署)、跨平台兼容、统一运行环境、资源隔离和简化依赖管理。Docker在开发和运维中都发挥作用,助力高效测试、部署和提升生产稳定性。
72 3
|
2月前
|
虚拟化 数据中心 Docker
8.Docker相关概念
8.Docker相关概念
|
2月前
|
前端开发 Ubuntu 开发者
【Docker系列】Docker-核心概念/常用命令与项目部署实践
【4月更文挑战第1天】 Docker是容器化技术,打包应用及依赖,实现快速部署。核心概念包括镜像、容器和仓库。镜像是只读模板,容器是镜像运行实例,仓库用于存储和分发镜像。常用命令如`docker search`、`docker pull`、`docker images`、`docker ps`等。安装Docker在Ubuntu上涉及`apt-get update`、`install docker-ce`等步骤。了解这些基础,开发者能更高效地部署和管理应用。Docker简化了环境配置,增强了软件的可移植性和扩展性,是现代开发的必备技能。
489 3
|
2月前
|
存储 测试技术 开发者
Docker的基本概念和优势,以及实际应用场景
Docker的基本概念和优势,以及实际应用场景
|
2月前
|
存储 Kubernetes 虚拟化
Docker相关的概念
Docker相关的概念
17 0