Docker
Docker 是一种开源的容器化平台,它使开发、部署和运行应用程序变得更加简单和轻量化。通过 Docker,开发人员可以将应用程序及其所有依赖项打包到一个称为容器的可移植的、自包含的单元中。这个容器包含了应用程序运行所需的所有软件、库和其他配置,并且可以在任何支持 Docker 的环境中运行,而不用担心环境之间的差异。
Docker 的主要组件包括 Docker Engine、Docker Image、Docker Container 和 Docker Hub。
- Docker Engine:Docker 的核心组件,负责运行和管理容器化应用程序。
- Docker Image:Docker 镜像是一个只读的模板,包含了应用程序运行所需的所有内容,包括代码、运行时、库、环境变量和配置文件等。镜像可以用来创建容器。
- Docker Container:Docker 容器是 Docker 镜像的一个实例,是一个可运行的、可部署的应用程序的独立单元。容器通过镜像创建,并且在其中运行应用程序。
- Docker Hub:Docker Hub 是一个在线的容器注册中心,开发人员可以在其中共享、存储和获取 Docker 镜像。
Docker 的优势包括快速部署、轻量化、可移植性强、资源利用率高等,使得它成为了现代应用程序开发和部署的重要工具之一。
Docker如何解决不同系统环境的问题?
- Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包
- Docker运行到不同操作系统时,直接基于打包的库函数,借助于操作系统的Linux内核来运行
Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?
Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像Docker应用运行在容器中,使用沙箱机制,相互隔离。
Docker如何解决开发、测试、生产环境有差异的问题?
Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行。
Docker是一个快速交付应用、运行应用的技术:
1.可以将程序及其依赖、运行环境一起打包为一个镜像可以迁移到任意Linux操作系统
2.运行时利用沙箱机制形成隔离容器,各个应用互不干扰
Docker和虚拟机的差异:
- docker是一个系统进程,虚拟机是在操作系统中的操作系统
- docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般
容器和镜像
镜像(image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。
Docker架构
镜像: 将应用程序及其依赖、环境、配置打包在一起
容器: 镜像运行起来就是容器,一个镜像可以运行多个容器。
Docker结构:
- 服务端:接收命令或远程请求,操作镜像或容器
- 客户端:发送命令或者请求到Docker服务端。
DockerHub:
一个镜像托管的服务器,类似的还有阿里云镜像服务,统称为DockerRegistry。
数据卷
数据卷是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。
容器运行的所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。
/var/lib/docker/volumes这个目录就是默认的存放所有容器数据卷的目录,其下再根据数据卷名称创建新目录,格式为/数据卷名/_data。
不便于修改:当我们要修改Nginx的html内容时,需要进入容器内部修改,很不方便。
数据不可复用:在容器内的修改对外是不可见的。所有修改对新创建的容器是不可复用的。
升级维护困难:数据在容器内,如果要升级容器必然删除旧容器,所有数据都跟着删除了。
数据卷的作用:将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全
为什么不让容器目录直接指向宿主机目录呢?
因为直接指向宿主机目录就与宿主机强耦合了,如果切换了环境,宿主机目录就可能发生改变了。由于容器一旦创建,目录挂载就无法修改,这样容器就无法正常工作了。
但是容器指向数据卷,一个逻辑名称,而数据卷再指向宿主机目录,就不存在强耦合。如果宿主机目录发生改变,只要改变数据卷与宿主机目录之间的映射关系即可。
不过,我们通过由于数据卷目录比较深,不好寻找,通常我们也允许让容器直接与宿主机目录挂载而不使用数据卷。
容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。
挂载
数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载。挂载语法与数据卷类似:
# 挂载本地目录
-v 本地目录:容器内目录
# 挂载本地文件
-v 本地文件:容器内文件
本地目录或文件必须以 / 或 ./开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。
数据卷挂载方式:
- -v volumeName: /targetContainerPath
- 如果容器运行时volume不存在,会自动被创建出来
镜像
镜像中包含了程序运行需要的系统函数库、环境、配置、依赖。
自定义镜像本质就是依次准备好程序运行的基础环境、依赖、应用本身、运行配置等文件,并且打包而成。
Dockerfile
打包镜像分成这么几步:
- - 准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可)
- - 安装并配置JDK
- - 拷贝jar包
- - 配置启动脚本
由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可,而这种记录镜像结构的文件就称为Dockerfile。
Dockerfile就是利用固定的指令来描述镜像的结构和构建过程,这样Docker才可以依次来构建镜像。
构建镜像
自定义网络
- - 在自定义网络中,可以给容器起多个别名,默认的别名是容器名本身
- - 在同一个自定义网络中的容器,可以通过别名互相访问
参考资料:飞书文本
如何下载使用Docker(deepin20.9)
1.官方源里已经包含了docker,所以可以直接从官方源里下载,不用再下载deb包了
sudo apt-get install docker.io
2.下载完成后可以查看docker版本
docker -version
3.此时可能会出现一个问题,报错:ERROR: Got permission denied while trying to connect to the Docker daemon socket。
sudo gpasswd -a $USER docker #将当前用户添加至用户组
newgrp docker #更新用户组
4. 配置镜像加速
复制到终端中就行
5.重启docker
systemctl stop docker//停止
systemctl start docker//启动
systemctl restart docker//重启
systemctl enable docker//开机自启
Docker部署Mysql
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=1 -e TZ=Asia/Shanghai -v /root/mysql/data:/var/lib/mysql -p 3306:3306 mysql
docker run --restart=always \
-p 6379:6379 \
--name redis \
-v /redis/conf/redis.conf:/etc/redis/redis.conf \
-v /redis/data:/data \
-d redis:latest redis-server /etc/redis/redis.conf
docker images
Docker中部署Kafka
1.拉取镜像
docker pull lensesio/fast-data-dev
docker run --rm -it --name kafka -p 2181:2181 -p 3030:3030 -p 8081:8081 -p 8082:8082 -p 8083:8083 -p 9092:9092 -e ADV_HOST=127.0.0.1 lensesio/fast-data-dev
或者
docker pull wurstmeister/kafka
2. 进入 Kafka 容器
docker exec -it kafka bash
3.使用以下命令创建主题:
kafka-topics --bootstrap-server 127.0.0.1:9092 --create --topic kafkatest --partitions 2 --replication-factor 1
-
kafka-topics
: 这是 Kafka 提供的一个命令行工具,用于管理 Kafka 主题(创建、删除、列出等)。 -
--bootstrap-server host:9092
: 这指定了 Kafka 集群的地址和端口。在这个例子中,Kafka 集群运行在host的 9092 端口上。(在 Docker 中运行 Kafka 并且虚拟机的 IP 地址x,那么在创建主题(topic)时需要将--bootstrap-server
参数设置为x,
这样做是为了确保 Kafka 客户端能够正确连接到运行在 Docker 容器中的 Kafka 实例。) -
--create
: 这是一个动作标志,表示我们想要创建一个新的主题。 -
--topic kafkatest
: 这指定了要创建的主题的名称。在这个例子中,主题名称是kafkatest
。 -
--partitions 2
: 这指定了主题的分区数量。在这个例子中,主题kafkatest
会有 2 个分区。分区是 Kafka 中分布数据的基本单位,每个分区在 Kafka 集群中独立存储数据并支持并行处理。 -
--replication-factor 1
: 这指定了主题的副本因子。在这个例子中,副本因子是 1,意味着每个分区只有一个副本。这意味着数据不会被复制到其他 Kafka 代理上。副本因子决定了数据的可用性和容错性。
在运行在 host:9092
上的 Kafka 集群中创建一个名为 kafkatest
的新主题,该主题有 2 个分区和 1 个副本。
4.使用以下命令验证主题是否创建成功
kafka-topics --bootstrap-server 127.0.0.1:9092 --list
5.使用以下命令启动生产者:
kafka-console-producer --broker-list 127.0.0.1:9092 --topic kafkatest
使用以下命令启动消费者:
kafka-console-consumer --bootstrap-server 127.0.0.1:9092 --topic kafkatest --from-beginning
6.在另一台主机上的 Spring Boot 应用程序中,配置 application.yml
文件以连接到 Kafka:
spring:
kafka:
bootstrap-servers: 192.168.137.128:9092
consumer:
group-id: my-group
auto-offset-reset: earliest
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
consumer:
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
docker镜像源被墙,更新于2024-7-14
很多镜像源被墙了,用的这个镜像源
1.打开镜像配置文件
sudo vim /etc/docker/daemon.json
2.配置镜像源
{
"registry-mirrors": ["https://docker.m.daocloud.io", "https://docker.1panel.live" ]
}
3.加载文件,重启docker
systemctl daemon-reload;systemctl restart docker;docker info