Docker入门学习
Docker入门学习
一、介绍
Docker是一个开源的容器化平台,可以将应用程序及其依赖以容器的形式封装,使其可以在任何环境中运行。Docker可以改善开发流程、提高应用程序的可移植性、简化系统配置、更易于维护等等。
Docker的优点包括:
-
快速构建、部署和迭代
-
与多种编程语言和框架兼容
-
节省资源和成本
-
增强安全性
Docker的官网为 https://www.docker.com/
二、基础
1)安装
我是在centos7
上安装的docker
,提供一个安装思路,可以安装下面的步骤进行安装
1 | 在终端中输入以下命令以确保yum软件包管理器是最新的: |
2)概念
-
镜像:就像一个包,里面有
linux、jdk、redis、mq、源代码
等一系列东西,自行组装打成的包。简单的说,镜像就是模板。 -
容器:我们将上面镜像的这个包,虚拟化运行在
docker
上,运行出的这个东西,我们称为容器。镜像中的东西,都会在容器里面。 -
仓库:如果一个镜像是一个包,那么很多个镜像的话,必须要存在一个地方存储。这个存储的地方我们称为仓库。
我们可以自行创建自己的镜像,也可以使用自己的私有仓库。
当然啦,我们除了使用私有仓库,也可以使用官方的仓库。
一些通用的镜像,我们都可以再仓库找到。
3)基本命令
1 | 启动docker |
相关docker命令都可以再官网文档找到,如下
Use the Docker command line | Docker Documentation
4)镜像命令
1 | 列出本地的镜像 |
5)容器命令
1 | 启动容器 |
option命令有很多,罗列一下常用的
选项 | 说明 |
---|---|
–name | 为容器指定一个名称 |
–detach -d |
在后台运行容器,并返回容器ID |
–interactive -i |
以交互模式运行容器 |
–tty -t |
分配一个伪输入终端 |
-P | 大写P,随机端口映射 |
-p | 小写p,指定端口映射 |
啊啊啊啊啊,具体看这里吧docker run | Docker Documentation
1 | 罗列出当前正在运行的容器 |
同样是重新进入容器,下面这两个有什么区别
- docker exec -it CONTAINER
- docker attach [OPTIONS] CONTAINER
exec会打开一个新的进程,我们在使用exit退出容器后,容器并不会停止运行
而attach不会打开一个新的进场,所以在使用exit退出后,容器会停止运行
故而,我们要么都使用exec命令进入容器,要么统一使用ctrl+p+q退出
6)其他命令
1 | 删除所有镜像 |
7)镜像推送至阿里云
-
创建命名空间
-
创建镜像仓库
-
执行命令
1
2
3docker login --username=半月无霜 registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/banmoon/tomcat:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/banmoon/tomcat:[镜像版本号]
8)镜像私有库
1 | 拉取仓库镜像 |
三、进阶
1)数据卷
运行容器大家都会了,那么如果我们运行了一个容器,如果担心容器会宕机,导致容器中的数据丢失,那我们需要把重要的数据抽离出来,而这样的技术我们称为数据卷。
比如说,我启动了一个mysql
的服务,保存到库里面的数据越来越多,非常重要。那这样的话,我们可以将mysql
存储的路径直接改为宿主机的路径,两两进行映射。内部mysql
容器宕机了,重要的数据还在宿主机上保留着。
同理nginx
容器,我们可以把config
目录做一个数据卷,我们只需要改动宿主机上目录的配置文件即可,非常快捷
在Docker中,使用-v
参数来创建数据卷。参数的语法是:
1 | docker run -v <host-path>:<container-path> --privileged=true <image> |
其中,<host-path>
是宿主机上的路径,<container-path>
是容器内的路径,<image>
是要运行的容器镜像。这个命令会将宿主机上的 <host-path>
目录映射到容器内的<container-path>
。如果目录不存在,则会自动创建。
而--privileged=true
参数是用来在容器中启用特权模式的。在特权模式下,容器将在宿主机上拥有与宿主机相同的权限,包括对系统硬件资源的访问权限、管理网络配置、mount文件系统等等,可能会对宿主机造成安全风险。
启用特权模式通常是在需要访问宿主机的底层资源或运行一些系统级别操作时使用的,比如安装内核模块或者进行网络配置等。但是,它也会增加容器被攻击的风险,因为容器中的应用程序可以执行攻击宿主机的行为。
因此,在实际生产环境中,应该谨慎使用特权模式并遵循特定的安全最佳实践。如果不需要使用特权模式,最好不要启用它,以减少容器被攻击的风险。
例如,要将宿主机上的 /data
目录映射到容器内的 /app/data
目录,可以使用以下命令:
1 | docker run -v /data:/app/data <image> |
注意,如果要在Windows系统中使用数据卷,需要使用反斜杠(\
)而不是斜杠(/
)。例如:
1 | docker run -v C:\data:/app/data <image> |
1.1)读写规则
读写规则,
:rw
和:ro
默认情况下,Docker 数据卷的访问权限是可读可写(read-write)。也就是说,当你通过如下方式创建数据卷时:
1 docker run -v /host/data:/container/data my_image这个数据卷将会是可读可写的。这意味着容器和宿主机都可以读取和写入这个数据卷中的文件。而且,如果容器删除了这个数据卷,那么这个数据卷上的数据也会被删除。
另一方面,如果你想将一个数据卷设置为只读(read-only),可以在挂载时使用
:ro
参数,例如:
1 docker run -v /host/data:/container/data:ro my_image这个数据卷将会是只读的,这表示容器可以读取这个数据卷,但是不能写入到这个数据卷中,因此数据不会丢失。
1.2)继承
Docker 数据卷的继承是指在一个容器中定义的数据卷,可以在该容器和其它基于该容器创建的容器之间进行继承和共享。这意味着容器之间可以通过共享数据卷来访问相同的数据,而无需在每个容器中创建和维护单独的数据副本。
数据卷继承的机制是基于
--volumes-from
参数实现的。例如,如果需要在一个新的容器中使用之前容器内的数据卷,可以使用以下命令:
1 docker run --volumes-from old_container -v /host/data:/container/data my_image在上面的命令中,
--volumes-from
参数用于从旧容器中继承数据卷。新容器可以使用容器内的数据卷,并将其挂载到本地主机上的/host/data
目录和容器的/container/data
目录中。继承数据卷的好处是方便快捷,同一份数据可以在多个容器中共享,从而避免在每个容器中都需要对数据进行管理和维护的问题,同时能够大幅度节省存储资源。但是需要注意,在多个容器中共享数据时,需要谨慎考虑数据的修改,以避免数据冲突和损坏等问题。
2)搭建一个tomcat容器吧
1 | docker run --name=myTomcat -it -p 8080:8080 -v /var/tomcat/webapps:/usr/local/tomcat/webapps --privileged=true tomcat |
3)Dockerfile
3.1)介绍
Dockerfile
是一个脚本文件,它包含一系列构建指令和参数,用于自动化Docker
镜像的构建过程。通过Dockerfile
,可以描述Docker
镜像的详细信息,包括所需的操作系统、软件包、应用程序、环境变量等内容。Docker
根据Dockerfile
构建出一个可重现的Docker
镜像,用于在运行时创建容器和环境。Dockerfile
中的指令包括FROM、RUN、CMD、EXPOSE、ENV、ADD、COPY等命令,这些指令可以通过Dockerfile自动化创建Docker镜像的过程。
Dockerfile
解决了Docker
容器部署和管理中的一些问题,例如:
-
镜像构建自动化:
Dockerfile
提供了一种自动化的方式来构建Docker镜像,大大简化了构建过程,并使得构建过程更加可靠和可重复。 -
环境一致性:
Dockerfile
可以确保在不同的环境下,相同的Docker镜像可以被准确地构建出来,从而保证环境一致性。 -
镜像版本管理:使用
Dockerfile
可以轻松地管理和维护多个Docker镜像版本,记录各个版本对应的构建步骤和配置。 -
可扩展性:使用
Dockerfile
可以很容易地构建出多个镜像版本,每个版本都可以基于现有的基础镜像(FROM命令)构建,并添加不同的软件包和应用程序。
综上所述,Dockerfile
可以使Docker容器的构建和管理变得更加简单、高效和可靠,并且可以提高Docker
容器的可移植性和可扩展性。
Dockerfile
的官网参考,Dockerfile reference | Docker Documentation
3.2)构建流程
Docker构建Dockerfile的大致流程如下:
-
Docker客户端将Dockerfile和构建上下文(如果有的话)发送到Docker守护进程。
-
Docker守护进程解析Dockerfile并构建一个镜像的初始层。这通常是一个空的容器。
-
Docker守护进程创建每个镜像层,并向其添加文件系统更改或命令。
-
每个构建层都会与硬盘上的现有层进行比较,以检查现有层是否可以重用。如果可以重用,Docker将使用已有的层而不是创建新的。
-
Docker守护进程添加所有文件、目录、命令、环境变量等,以创建最终的映像。
-
Docker守护进程将新的映像保存在本地的映像库中。
在构建Dockerfile时,需要注意以下几点:
-
构建Dockerfile要在正确的上下文中进行。构建上下文是指在构建Docker镜像时需要添加到映像中的文件和目录等。
-
将Dockerfile保持简单和干净。Dockerfile需要在尽可能少的步骤中定义所有内容。
-
构建缓存机制可以提高构建速度,因此需要合理利用构建缓存机制。
-
构建过程中可能会发生错误和警告,需要及时进行修复和处理。
因此,在构建Dockerfile时需要仔细考虑各种细节,以确保构建过程的正确性、高效性和可靠性。
3.3)保留字指令
Dockerfile中常用的保留字命令包括:
命令 | 说明 |
---|---|
FROM | 指定基础镜像,用于构建自定义镜像 |
MAINTAINER | 指定镜像的作者和联系方式 |
RUN | 在容器中执行命令,例如安装软件或运行脚本 |
CMD | 定义容器启动时默认执行的命令或参数 |
ENTRYPOINT | 定义容器启动时默认执行的命令或参数,但是可以在运行容器时覆盖CMD |
EXPOSE | 声明容器运行时需要监听的端口 |
ENV | 设置环境变量 |
ADD | 将文件或目录添加到容器中 |
COPY | 将文件或目录复制到容器中 |
VOLUME | 创建一个挂载点,可以在容器中挂载宿主机的目录 |
USER | 指定容器中运行命令的用户 |
WORKDIR | 指定容器中命令的工作目录 |
这些保留字命令可以组合使用,构建出适合自己的Docker镜像。在编写Dockerfile时,应该注意这些命令的顺序和使用方法,以确保Docker镜像的正确、高效、可靠。
3.4)为基础centos镜像升级
1 | # 基础centos镜像,添加上自己的东西 |
1 | 构建命令,注意后面有个点 |
4)Docker网络
Docker网络是一种用于在Docker主机和其他容器之间通信的网络体系结构。它提供了容器之间通信、容器与外部网络之间通信以及容器与主机之间通信的方法,同时也提供了安全性、弹性和性能方面的支持。
Docker网络有三种类型**:桥接网络、主机网络和覆盖网络**。
-
桥接网络:容器默认使用桥接网络模式,在该模式下,每个容器都被分配一个单独的网络命名空间,并控制了容器网络访问的权限。在同一个桥接网络中的容器可以通过容器名称或IP地址进行通信。
-
主机网络:在主机网络模式下,Docker容器和主机使用同一个网络命名空间,容器可以直接使用主机的IP地址进行通信,但是它也会暴露主机上的所有端口。
-
覆盖网络:覆盖网络基于Docker Swarm模式设计,它在多个Docker主机之间创建一个虚拟网络,允许容器在多个主机上使用相同的IP地址进行通信。每个虚拟网络都被赋予一个唯一标识符,并控制了容器访问网络的权限。
使用Docker网络可以更好地管理容器之间的通信,并保证容器与外部网络的安全和隔离性。例如,Elastic Stack应用程序就可以使用Docker网络来实现不同组件之间的通信,实现更好的可伸缩性、弹性和容错性。
网络模式 | 说明 |
---|---|
bridge | 桥接模式, 为每一个容器都分配、设置IP,并将其连接至一个 docker0 的虚拟网桥上docker默认使用的网络模式 |
host | 容器不再拥有自己的IP,而是直接使用宿主机的IP和端口 |
none | 容器有独立的Network namespace,但并没有对其进行任何网络设置 有网络空间,但不用,无法外部通信 |
container | 新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等 |
1 | 查看当前的docker网络 |
为什么需要docker网络,如何进行docker网络的编排?
Docker网络是必要的,因为容器需要网络连接,以便在不同的容器和主机之间进行通信以及与外部服务进行交互。Docker网络还提供了一些额外的功能,如容器发现、服务发现和负载均衡等。此外,Docker网络还可以提供安全性、维护性和可移植性等方面的支持。
Docker网络编排是指通过将多个Docker容器连接在一起来组装应用程序。Docker提供了多种方式来进行Docker网络编排,例如:
可以使用docker create network命令来创建一个自定义网络,然后将容器连接到该网络中。
可以使用docker-compose命令来编排和管理多个容器和网络,包括定义多个容器之间的关系、配置容器的资源和环境变量等。
可以使用Docker Swarm来实现容器编排和管理,其中包括自动化的负载均衡、服务发现和网络管理等功能。
Docker网络编排使得容器部署和管理更加方便和可靠,可以实现自动化、弹性、可扩展和可靠的容器架构。当需要管理大量Docker容器时,使用网络编排和自动化工具可以提高应用程序的可维护性和管理性,从而降低应用程序的总体成本。
从理解上来说,我们希望
springCloud
微服务打成的jar
包之间可以相互的通信,要想注册进nacos
,想用gateway
网关进行访问的话,最好就是将这一些jar
包配置成统一网段的IP,从而达到他们的访问。还有一种情况就是,
MySQL
、Redis
这些服务,在进行扩容或宕机重启后,我们的jar
包连接服务指定的IP可以不用进行修改。也就是域名转发固定,或者是IP固定。
查看一下,在Docker服务启动时的网络
docker0是Docker默认创建的一个虚拟网桥,用于管理Docker容器的网络。Docker使用docker0网桥来将物理主机和Docker容器连接在同一个网络中。容器将被分配到docker0的子网中,并分配一个IP地址。容器可以连接到docker0网桥,与其他容器或外部网络通信。
当Docker容器被创建时,Docker会自动创建一个docker0网桥。docker0网桥是一个本地主机的虚拟网桥,与其他物理设备不同。Docker容器在启动时默认都会连接到docker0网桥,使得它们都能够进行网络通信。例如,当多个容器之间需要建立网络连接时,它们可以通过docker0网桥进行通信。
默认情况下,docker0网桥的IP地址是172.17.0.1,Docker会分配从这个网段内分配IP地址给Docker容器。可以通过使用docker network命令创建自定义网络,并通过将容器连接到自定义网络来实现更好的网络管理和更高的网络安全性。
总之,docker0网桥是Docker默认的虚拟网络设备,用于管理Docker容器的网络连接。可以通过自定义网络来扩展docker0网桥以实现更灵活的网络管理。
1 | 创建一个network,默认是bridge模式 |
5)Docker容器编排
5.1)介绍
Docker的容器编排是一种管理和协调多个Docker容器的方法,使它们能够在集群中协同工作。它提供了一个简单的方式来定义、部署、扩展和管理Docker容器,从而实现容器集群的自动化管理。
通过容器编排,您可以轻松地创建多个容器,定义它们之间的依赖关系,以及协调它们之间的通信和交互。它还可以自动扩展容器集群,并确保高可用性和负载均衡。
目前市面上比较流行的Docker容器编排工具有Kubernetes、Docker Compose、Swarm等。这些工具可根据不同的需求进行选择和使用。
我们小节简单介绍使用Docker Compose
。
如果Dockerfile
是用来构建自定义镜像的话,那么Docker Compose
就是用来,管理启动一个或多个容器的。
比如说吧,我有一组springCloud
的jar
包,还有一些服务MySQL
、Redis
等,他们有启动的前提条件,先后顺序等。
那么我们使用Docker Compose
就可以一个yaml
文件解决,我们只需要修改这份yaml
文件即可,便可以一键启动。
5.2)下载安装
官网文档:Compose file version 3 reference | Docker Documentation
官网下载:Overview | Docker Documentation
1 | 第一步:下载 |
5.3)常用命令
命令 | 描述 |
---|---|
docker-compose up |
启动容器 |
docker-compose up -d |
启动容器并后台运行 |
docker-compose down |
停止并删除容器 |
docker-compose pause |
暂停容器 |
docker-compose unpause |
恢复容器 |
docker-compose ps |
查看容器状态 |
docker-compose exec |
执行容器中的命令 |
docker-compose logs |
查看容器日志 |
docker-compose up --force-recreate |
重建容器 |
docker-compose version |
查看docker-compose版本 |
docker-compose build |
构建镜像 |
docker-compose start |
启动已经创建的容器 |
docker-compose stop |
停止容器 |
docker-compose restart |
重启容器 |
docker-compose kill |
强制停止正在运行的容器 |
docker-compose rm |
删除容器 |
docker-compose pull |
从镜像仓库中拉取镜像 |
docker-compose config |
检查docker-compose文件,是否格式正确 |
docker-compose up --build |
构建镜像并启动容器 |
docker-compose up -d --no-deps |
启动容器,并不启动依赖容器 |
docker-compose logs -f |
查看容器日志,实时输出 |
docker-compose run |
运行一个一次性的命令,例如数据迁移 |
docker-compose scale |
手动扩展或缩小服务数量 |
docker-compose config |
检查docker-compose.yml文件是否格式正确 |
注意,在使用这些命令时,需要在包含docker-compose.yml文件的目录中运行它们。
5.4)docker-compose.yml文件
给出一个示例,我们该如何编写这份yaml
文件
1 | # 当前docker-compose版本 |
具体的不再讲解了,因为出现了k8s
容器编排管理,上面这一块大部分被取代,了解即可。
如果有些不懂的,可以去官网,很详细的
Compose file version 3 reference | Docker Documentation
1 | 可以校验文件中是否有语法异常 |
四、最后
本文中预估50%的文本量都是由chatgtp3.5
提供,想去注册chatgtp4
,但帐号不支持,只能另外想办法了
我是半月,你我一同共勉!!!