1、docker 介绍
1、docker
Docker 是一个开源的平台,用于开发、部署和运行应用程序的容器化技术。它通过将应用程序及其所有依赖项打包到一个标准化的单元(容器)中,使得应用程序可以在任何环境中一致地运行,无论是开发环境、测试环境还是生产环境。Docker 的主要优势在于它简化了应用程序的分发和管理,提高了开发和运维的效率。
2、docker 的主要组件
Docker 引擎(Docker Engine)
- Docker Daemon:运行在主机上的后台服务,负责管理 Docker 容器的创建、运行、停止和删除。
- Docker Client:命令行工具,用于与 Docker Daemon 进行交互。
- Docker API:提供编程接口,允许其他工具与 Docker 进行集成。
镜像(Images):
- Docker 镜像是只读的模板,用于创建容器。镜像包含了运行应用程序所需的一切,包括代码、运行时、库和配置文件。用户可以从 Docker Hub 拉取公共镜像,或者根据自己的需要创建定制镜像。
容器(Containers):
- 容器是运行时的实例,由镜像创建而来。每个容器是一个独立的进程空间,包含了运行应用程序所需的所有内容。容器之间相互隔离,但可以通过定义的接口进行通信。
仓库(Repositories):
- 仓库用于存储和分发 Docker 镜像。Docker Hub 是一个公共的镜像仓库,用户可以在上面查找和下载各种官方和社区提供的镜像。此外,用户也可以搭建私有仓库来管理自己的镜像。
3、Docker 的主要功能和优势
轻量级虚拟化:
- Docker 容器共享宿主机的操作系统内核,不需要像虚拟机那样启动一个完整的操作系统,因此启动速度快,占用资源少。
一致性和可移植性:
- Docker 容器包含了应用程序运行所需的所有依赖项,因此可以在任何环境中一致地运行,从开发环境到生产环境都能保持一致。
高效的资源利用:
- 由于容器共享操作系统内核,相比传统的虚拟机,Docker 容器更加高效地利用系统资源,能够在同样的硬件上运行更多的实例。
简化的管理和部署:
- Docker 提供了强大的工具集和生态系统,简化了应用程序的构建、打包、分发和部署。通过 Docker Compose,可以定义和运行多容器应用,使得复杂的应用管理变得更加简单。
4、docker 的应用场景
微服务架构:
- Docker 非常适合构建和部署微服务架构,每个微服务可以打包到一个独立的容器中,方便管理和扩展。
持续集成和持续部署(CI/CD):
- Docker 可以与 CI/CD 工具集成,实现自动化构建、测试和部署流程,提高开发和运维的效率。
开发和测试环境:
- 开发人员可以使用 Docker 容器快速创建隔离的开发和测试环境,避免环境依赖问题,提高开发效率。
混合云和多云部署:
- 由于容器的可移植性,Docker 可以方便地在不同的云环境中部署应用,实现混合云和多云策略。
2、容器操作基础命令
1、拉取镜像
bash
# docker pull <image_name>:<tag> # 不写<tag>,默认拉取最新版本
2、上传镜像
bash
# docker push <image_name>:<tag>
3、运行容器
bash
# docker run -it ubuntu:latest /bin/bash
4、列出正在运行的容器
bash
# docker ps
# docker ps -a # 所有容器,包括停止的容器
5、停止容器
bash
# docker stop <container_id_or_name>
6、启动已停止的容器
bash
# docker start <container_id_or_name>
7、重启容器
bash
# docker restart <container_id_or_name>
8、删除容器
bash
# docker rm <container_id_or_name>
9、查看容器日志
bash
# docker logs <container_id_or_name>
10、进入运行中的容器
bash
# docker exec -it <container_id_or_name> /bin/bash
11、复制文件到容器
bash
# docker cp <host_path> <container_id_or_name>:<container_path>
12、查看详细内容
bash
# docker inspect <容器ID或名称>
3、Docker****镜像制作和管理
Docker 镜像是用于创建容器的模板文件,它包含了运行应用程序所需的所有内容(代码、运行时、库、环境变量等)。
1、制作镜像
1、使用 Dockerfile 创建镜像
bash
# 使用官方的 Ubuntu 基础镜像
FROM ubuntu:latest
# 维护者信息
MAINTAINER Your Name <your.email@example.com>
# 更新包列表并安装一些包
RUN apt-get update && apt-get install -y \
python3 \
python3-pip
# 复制当前目录内容到容器中的 /app 目录
COPY . /app
# 设置工作目录
WORKDIR /app
# 安装 Python 依赖
RUN pip3 install -r requirements.txt
# 暴露端口
EXPOSE 5000
# 定义环境变量
ENV NAME World
# 容器启动时运行的命令
CMD ["python3", "app.py"]
2、构建镜像
bash
# docker build -t my-python-app .
-t :指定镜像标签(名称)。
. :上下文路径,当前目录。
3、使用已有容器创建镜像
bash
# docker run -it ubuntu:latest /bin/bash
在容器内进行修改,比如安装一些软件包。
提交容器创建镜像:
# docker commit <container_id> my_custom_ubuntu
2、管理 docker 镜像
1、列出本地镜像
bash
# docker images
2、删除镜像
bash
# docker rmi <image_id>
3、镜像打标签
bash
# docker push my-repo/my-image:my-tag
3、制作和管理一个简单的 Nginx 应用镜像
1、创建项目目录和文件
bash
# mkdir my-nginx-app
# cd my-nginx-app
2、创建 Nginx 配置文件
bash
# nginx.conf
events {}
http {
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
}
----------------------------------------------------------------------------
不了解nginx,可以看如下完整的请求处理流程:
用户访问 http://localhost/。
Nginx 监听端口 80,匹配到 server 块,因为 server_name 是 localhost。
请求路径 / 与 location / 块匹配。
Nginx 在 root 指定的目录 /usr/share/nginx/html 中查找文件。
找到 index.html 文件,并根据 index 指令返回该文件内容。
3、创建静态文件
bash
# 和 nginx.conf 同一目录创建静态文件
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>My Nginx App</title>
</head>
<body>
<h1>Hello, Nginx!</h1>
<p>Welcome to my Nginx application.</p>
</body>
</html>
4、创建 Dockerfile
bash
# Dockerfile
# 使用官方的 Nginx 镜像作为基础镜像
FROM nginx:latest
# 将自定义的 nginx.conf 文件复制到镜像中的 /etc/nginx/nginx.conf
COPY nginx.conf /etc/nginx/nginx.conf
# 将 index.html 文件复制到镜像中的 /usr/share/nginx/html
COPY index.html /usr/share/nginx/html/index.html
# 暴露容器的 80 端口
EXPOSE 80
# 容器启动时自动运行 nginx
CMD ["nginx", "-g", "daemon off;"]
5、构建 Docker 镜像
bash
# docker build -t my-nginx-app .
6、运行容器
bash
# docker run -d -p 8080:80 my-nginx-app
7、访问 Nginx 应用
bash
打开浏览器访问 http://localhost:8080,应该能看到 index.html 中的内容。
4、Docker 数据管理
1、数据卷
数据卷是 Docker 中最常用的数据管理方式之一,它有以下特点:
- 持久性:数据卷独立于容器生命周期,即使容器被删除,数据也可以保留。
- 共享和重用:多个容器可以共享同一个数据卷,便于数据在不同容器间传递和共享。
# 创建一个名为 mydata 的数据卷
docker volume create mydata
# 运行一个容器并将 mydata 数据卷挂载到 /data 目录
docker run -d --name mycontainer -v mydata:/data nginx
2、绑定挂载
绑定挂载允许将主机上的特定路径挂载到容器内部,这对于开发和调试特别有用,它具有以下特点:
- 灵活性:可以直接使用主机文件系统中的数据,无需复制到容器中。
- 实时性:对主机文件系统的更改立即在容器内部可见。
# 将主机上的 /opt/app 数据绑定挂载到运行的容器的 /app 目录
docker run -d --name app -v /opt/app:/app myapp:latest
3、匿名挂载
匿名挂载是一种临时的数据卷,Docker 会为其分配一个随机的路径,并在容器删除时自动清理。它适合存储临时数据或不需要持久化的数据。
# 创建一个使用匿名挂载的容器
docker run -d --name tempcontainer -v /data alpine
4、数据卷容器
数据卷容器是一种通过专门的容器来管理和共享数据卷的方式,其他容器可以通过挂载这个数据卷容器来访问数据。
# 创建一个数据卷容器
docker create -v /data --name datavolume alpine /bin/true
# 使用数据卷容器在其他容器中共享数据
docker run -d --name container1 --volumes-from datavolume nginx
docker run -d --name container2 --volumes-from datavolume busybox
5、Docker 网络管理
1、none 网络模式
在
none
网络模式下,容器没有网络接口,只能使用 localhost 进行通信。适用于不需要网络功能的容器。
# 使用 none 网络模式运行容器
docker run -d --name nonet_container --network none nginx
2、bridge 网络模式
默认的桥接网络模式,为每个容器分配一个虚拟网络接口和 IP 地址,容器可以通过 IP 地址或容器名称相互通信。
# 使用默认的 bridge 网络模式运行容器
docker run -d --name bridge_container1 nginx
docker run -d --name bridge_container2 nginx
# 检查容器的 IP 地址
docker inspect bridge_container1 | grep IPAddress
docker inspect bridge_container2 | grep IPAddress
3、container 网络模式
在
container
网络模式下,新的容器共享指定容器的网络命名空间,两个容器将共享同一个 IP 地址和网络配置。
# 先运行一个容器
docker run -d --name container_net1 nginx
# 运行另一个容器,共享 container_net1 的网络命名空间
docker run -d --name container_net2 --network container:container_net1 busybox top
# 检查两个容器的网络配置
docker inspect container_net1 | grep IPAddress
docker inspect container_net2 | grep IPAddress
4、host
网络模式
在
host
网络模式下,容器直接使用主机的网络命名空间,容器和主机共享网络接口。适用于需要高网络性能的场景。
# 使用 host 网络模式运行容器
docker run -d --name host_net_container --network host nginx
5、自定义网络(network-name
)
自定义网络允许用户创建和管理自己的 Docker 网络,并可以指定网络的子网、网关等配置,提供更多的灵活性和控制。
# 创建一个自定义网络 my_custom_network
docker network create my_custom_network
# 在自定义网络中运行容器
docker run -d --name custom_net_container1 --network my_custom_network nginx
docker run -d --name custom_net_container2 --network my_custom_network nginx
# 检查容器的 IP 地址
docker inspect custom_net_container1 | grep IPAddress
docker inspect custom_net_container2 | grep IPAddress
6**、Docker Compose 容器单机编排 ( Kubernetes )**
Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过一个 YAML 文件,您可以配置应用的服务、网络和卷,并使用简单的命令来管理整个应用的生命周期。
1、创建一个目录来存放 docker-compose.yml 文件和相关资源
# mkdir myapp
# cd myapp
2、创建一个 docker-compose.yml 文件
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- mynetwork
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
volumes:
- db_data:/var/lib/mysql
networks:
- mynetwork
volumes:
db_data:
networks:
mynetwork:
# 解释 docker-compose.yml
version: 指定 Docker Compose 文件的版本。
services: 定义应用中的两个服务 web 和 db。
web: 使用 Nginx 镜像,映射主机的 8080 端口到容器的 80 端口,并挂载主机目录 ./html 到容器的 /usr/share/nginx/html 目录。
db: 使用 MySQL 镜像,设置环境变量来配置数据库,并使用名为 db_data 的卷来存储数据库数据。
volumes: 定义持久化存储卷 db_data。
networks: 定义名为 mynetwork 的自定义网络,web 和 db 服务都将连接到这个网络。
3、为了使 Nginx 服务能够找到 HTML 文件,需要创建 html 目录并添加一些文件
mkdir html
echo "<h1>Hello, Docker Compose!</h1>" > html/index.html
4、启动应用
docker-compose up -d
5、查看运行中的容器
docker-compose ps
7、Docker 仓库管理
Docker 仓库(Docker Registry)管理是指使用和管理存储 Docker 镜像的仓库。Docker Hub 是最广泛使用的公共 Docker 镜像仓库,但您也可以使用私有仓库。
1、Docker Hub
1、首先,需要登录 Docker Hub:
docker login # 输入您的 Docker Hub 用户名和密码
2、推送镜像到 Docker Hub
docker build -t <your-username>/my-app:1.0 . # 构建
docker push <your-username>/my-app:1.0 # 推送
3、从 Docker Hub 拉取镜像
docker pull <your-username>/my-app:1.0
2、私有 Docker
如果您需要存储私有镜像,可以设置一个私有 Docker 注册表。Docker 提供一个官方的注册表镜像
registry
,可以在本地或远程服务器上运行。
使用 Docker 启动一个私有注册表
docker run -d -p 5000:5000 --name my-registry registry:2
构建 Docker 镜像:
docker build -t localhost:5000/my-app:1.0 .
推送镜像到私有注册表:
docker push localhost:5000/my-app:1.0
从私有注册表拉取镜像
docker pull localhost:5000/my-app:1.0
3、Docker之分布式仓库Harbor (我用Harbor多)
Harbor ( 港口 , 海港 ) 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器,由 VMware 开源,其通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源 Docker Distribution 。作为一 个企业级私有 Registry 服务器, Harbor 提供了更好的性能和安全。提升用户使用 Registry 构建和运行环 境传输镜像的效率。 Harbor 支持安装在多个 Registry 节点的镜像资源复制,镜像全部保存在私有 Registry 中, 确保数据和知识产权在公司内部网络中管控,另外, Harbor 也提供了高级的安全特性,诸 如用户管理,访问控制和活动审计等
如果想安装,可以私信我。