docker

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 也提供了高级的安全特性,诸 如用户管理,访问控制和活动审计等
如果想安装,可以私信我。

相关推荐
繁星日月5 分钟前
利用docker搭建漏洞环境,使用SSRF+Redis写入centos以及ubuntu的公钥,实现免密登录
redis·安全·ubuntu·docker·容器·centos·渗透
程序猿阿伟1 小时前
随着云计算和容器技术的广泛应用,如何在这些环境中有效地运用 Shell 进行自动化部署和管理?
运维·自动化·云计算
Roc-xb3 小时前
Failed to get D-Bus connection: Operation not permitted
docker·wsl·centos7
Tassel_YUE3 小时前
iptables配置实现NAT(随手记)
linux·运维·服务器·网络·iptables
five-five3 小时前
一文全解Nginx
运维·nginx
IT利刃出鞘4 小时前
SecureCRT--使用sftp上传和下载文件
linux·运维·服务器
WolvenSec6 小时前
网络基础:EIGRP
运维·网络·安全·智能路由器
踩着阴暗的自己向上爬7 小时前
Day05-04-持续集成总结
linux·运维·ci/cd
TiDB_PingCAP8 小时前
国产化新标杆:TiDB 助力广发银行新一代总账系统投产上线
运维·数据库·开源·tidb
qyhua8 小时前
Linux内网端口转公网端口映射
linux·运维·服务器