基础知识-计算机基础(Docker部分)

(250401)
(必看)10分钟看懂Docker和K8S

全面的Docker快速入门教程
Docker与虚拟机的区别
Docker 架构及工作原理

手把手教你安装Docker
Dockerfile制作自己的镜像文件

Docker(容器)到底是什么

我的例子
预制菜的做法。为了能让使用者都能同一种食材和同一种烹饪方法,我特意在中央厨房,将一种菜式里的食材处理到半熟或者全熟的状态,然后用真空的包装包好,之后在仓库里存放。使用者通过网店购买,快递拿到手后,通过说明将预制菜进行烹饪。达到了同一种菜式同一种食材和同一种烹饪方法。

镜像到底是什么

就是Linux的文件系统,包含了可以运行Linux的内核程序和响应数据

联合文件系统是什么

image

联合文件系统(也称为UnionFS)在Docker的整体功能中起着至关重要的作用。它是一种独特的文件系统类型,通过覆盖多个目录创建虚拟的分层文件结构。与修改原始文件系统或合并目录不同,UnionFS支持在单个挂载点上同时挂载多个目录,同时保持它们的内容分开。这个特性在Docker上下文中特别有用,因为它允许我们通过最小化重复和减小容器映像大小来管理和优化存储性能。

以下是联合文件系统的一些基本特性:

分层结构:UnionFS构建了一个由多个只读层和一个顶层可写层组成的分层结构。这种结构只更新可写层,而只读层保留原始数据,从而有效地处理更改。

写时复制(Copy-on-Write): COW (Copy-on-Write)机制是UnionFS不可或缺的特性。如果容器更改了现有文件,系统将在可写层创建该文件的副本,而只读层中的原始文件不受影响。此过程将修改限制在最顶层,确保快速且资源高效的操作。

资源共享:联合文件系统允许多个容器在单独运行时共享公共基础层。避免资源重复,节省大量存储空间。

快速容器初始化:联合文件系统可以通过在现有只读层上创建一个新的可写层来立即创建新容器。这种快速初始化减少了重复文件操作的开销,最终提高了性能。

Docker中流行的联合文件系统
Docker支持多个联合文件系统,以方便构建和管理容器。一些受欢迎的选择包括:

AUFS (Advanced Multi-Layered unified Filesystem): AUFS被广泛用作Docker存储驱动程序,实现了对多层的高效管理。
OverlayFS(覆盖文件系统):OverlayFS是Docker支持的另一个联合文件系统。与AUFS相比,它使用一种简化的方法来创建和管理覆盖目录。
Btrfs (B-Tree Filesystem): Btrfs是一种现代文件系统,除了快照和校验和等高级存储特性外,还提供了与联合文件系统的兼容性。
ZFS (Z文件系统):ZFS是一个高容量和健壮的存储平台,它提供联合文件系统特性以及数据保护、压缩和重复数据删除。

网络

# 4个模式,一般只用briage
host #直连主机IP
none #没有设置
briage #虚拟网卡
container #内网互联

Vim /etc/docker/daemon.json
{"bip":"10.55.0.1/16"
}

导入导出

docker images
查看镜像,这里选择nginx作为示范

docker save IMAGE ID > nginx.tar
导出nginx

mv nginx.tar docker/
cd docker
docker load < nginx.tar
docker images
剪切nginx.tar到docker,导入nginx.tar,查看镜像

docker tag IMAGE ID nginx:latest
修改名字

搭建仓库(Registy)

docker pull registy
docker images
创建仓库,查看镜像

docker run -d -v /registry:/var/lib/registry -p 5000:5000 --restart alwalys --name registry registry:latest
- `-d`: 表示容器在后台运行,不占用终端。
- `-v /registry:/var/lib/registry`: 将本地文件夹`/registry`挂载到容器内部的`/var/lib/registry`目录,用于持久化存储镜像数据。
- `-p 5000:5000`: 将容器内部的5000端口映射到主机的5000端口,用于访问registry镜像仓库。
- `--restart=always`: 设置容器总是自动重启,以确保容器服务不会因意外退出而中断。
- `--name registry`: 为容器设置一个名称。
- `registry:latest`: 使用registry最新版本的镜像来创建容器。

docker ps
ss -ntl
查看是否运行

docker tag nginx:latest 127.0.0.1:5000/nginx:latest
docker push 127.0.0.1:5000/nginx:latest
curl 127.0.0.1:5000/v2/_catalog
修改nginx名字并上传到仓库,用curl查看是否已上传
- `/v2/_catalog`: 查询所有可用的镜像仓库的名称。
其中,`/v2`表示使用的是Docker Registry API v2版本,`_catalog`则是API的一个endpoint,用于查询所有可用的镜像仓库的名称。

harbor上传

参考项目harbor部分
实践项目-基于K8s平台进行wordpress建站

上传私有仓库

编辑文件/etc/docker/daemon.json

{"registry-mirror": [ "https://registry.docker-cn.com"
],"insecure-registries": [ "[私有仓库 ip:port]"
]
}

然后在命令行执行以下命令:
[root@CentOS7 ~]# systemctl restart docker
[root@CentOS7 ~]# docker login ---这一步根据实际情况操作。
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to
https://hub.docker.com to create one. Username:

命令

Docker日常工作常用命令
Docker笔记-Sol·wang
w3xueDocker命令手册

docker run -dit --name {新容器名称} \
	-c 2 \            # 限制CPU个数
	-m 4G \           # 限制内存大小(BKMG)
	--privileged \              # 赋予高系统权限
	-e LANG=C.utf8 \            # 系统环境变量-容器字符集
	-e TZ=Asia/Shanghai \       # 系统环境变量-容器时区
	--network {net-name} \      # 指定使用的网卡
	--ip {ip-address} \         # 指定IP地址(前提是使用自定义网卡)
	-p {cPort}:{port} \         # 宿主端口映射
	--hostname {host-name} \          # 设主机名称
	--restart unless-stopped \        # 自动重启
	-v /registry:/var/lib/registry  # 卷宿主文件映射
	{镜像名}:{tag}

docker commit -a 'test' -m 'test' container image:v1.0 将运行的容器保存为新的镜像
	- `-a`:指定新镜像的作者
	- `-m`:指定新镜像的描述信息
	- `-c`:在容器中执行dockerfile创建镜像
	- `-p`:在commit时将容器暂停
docker version 查看docker版本
docker info 查看docker信息
docker system df 查看docker磁盘使用信息
docker inspect image/container/volume/network 查看对象的详细信息
docker pull images 拉取镜像
docker rmi IMAGES ID 删除镜像(运行中的无法删除,只删除未开启的镜像)
	docker rmi $(docker images -q) 删除所有镜像(输出所有镜像ID,传递给rmi)
	for i in $(docker images -q); do docker rmi $i; done (遍历所有镜像ID,一个一个地传递给rmi)
docker push REGISTY 上传仓库
docker run/start/stop/rm/rm -f CONTAINER ID 启动/开启/停止/删除/强制删除 容器
docker stats 查看容器的资源使用信息
docker ps -a 查看容器启动暂停信息
docker top CONTAINER ID 查看容器进程(docker ps查看容器ID)
docker logs 查看容器日志
docker history IMAGES 查看镜像历史版本
docker create -it --name test test.io/library/ubuntu 使用test.io仓库来创建名为test的新容器
docker kill -s KILL `docker ps -q` 删除所有运行的容器
docker run -it /bin/bash 用RUN在创建时进入容器
docker exec -it CONTAINER ID 用exec进入容器,退出时不会关闭容器

docker run CONTAINER ID /bin/echo Hello World 不进入容器,打印一个字符串
docker exec -it CONTAINER ID bash -c date 查看容器时间
docker cp Filename CONTAINER ID:/ 将Linux上的文件复制到容器里
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 获取正在运行的容器IP地址


curl -XGET http://ip:端口/v2/_catalog 查看私有仓库
curl -XGET http://ip:端口/v2/私有仓库镜像名称/tags/list 获取某个镜像的标签列表

Dockerfile基础知识

Dockerfile 是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker 通
过读取 Dockerfile 中的指令自动生成映像。
docker build 命令用于从 Dockerfile 构建映像。可以在 docker build 命令中使用-f 标志指向文件系统中任何
位置的 Dockerfile。

docker build -f /path/to/a/Dockerfile

指令

FROM- 镜像从那里来
MAINTAINER- 镜像维护者信息
RUN- 构建镜像执行的命令,每一次RUN都会构建一层
CMD- 容器启动的命令,如果有多个则以最后一个为准,也可以为ENTRYPOINT提供参数
VOLUME- 定义数据卷,如果没有定义则使用默认
USER- 指定后续执行的用户组和用户
WORKDIR- 切换当前执行的工作目录
HEALTHCHECH- 健康检测指令
ARG- 变量属性值,但不在容器内部起作用
EXPOSE- 暴露端口
ENV- 变量属性值,容器内部也会起作用
ADD- 添加文件,如果是压缩文件也解压
COPY- 添加文件,以复制的形式
ENTRYPOINT- 容器进入时执行的命令

Nginx Dockerfile(Debian + Root + HTTPS + 反向代理 + 资源限制)

# 基于 Debian 的最新稳定版 Nginx 镜像
FROM nginx:1.25.3-bookworm

# 设置元信息(优化容器管理)
LABEL maintainer="Dev Team <devops@example.com>"
LABEL version="3.0"
LABEL description="Production Nginx with HTTPS, Reverse Proxy & Resource Limits"

# 设置环境变量(可覆盖)
ENV TZ=Asia/Shanghai \
    NGINX_ENTRYPOINT_QUIET_LOGS=1 \
    NGINX_PORT=80 \
    NGINX_HTTPS_PORT=443 \
    UPLOAD_MAX_SIZE=10M \
    WORKER_PROCESSES=auto

# 更新系统并安装基础工具(必须 Root)
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    openssl curl nano tzdata && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# 配置 Nginx(反向代理 + HTTPS)
#
# 1. 生成自签名证书(仅开发环境使用)
# 2. 配置反向代理示例
# 3. 调整 worker 连接数
RUN mkdir -p /etc/nginx/ssl && \
    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/nginx/ssl/nginx-selfsigned.key \
    -out /etc/nginx/ssl/nginx-selfsigned.crt \
    -subj "/CN=localhost" && \
    \
    # 配置优化(进程、连接数)
    sed -i "s/worker_processes.*/worker_processes ${WORKER_PROCESSES};/" /etc/nginx/nginx.conf && \
    sed -i "s/worker_connections.*/worker_connections 1024;/" /etc/nginx/nginx.conf

# 删除默认配置,替换为自定义配置
COPY nginx.conf /etc/nginx/nginx.conf
COPY conf.d/ /etc/nginx/conf.d/

# 暴露 HTTP & HTTPS 端口
EXPOSE $NGINX_PORT $NGINX_HTTPS_PORT

# 设置容器资源限制(运行时 `docker run --memory=512m` 可覆盖)
CMD ["nginx", "-g", "daemon off;"]

配套 nginx.conf 示例

user root;  # 强制以 root 运行
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
    multi_accept on;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;

    # 文件上传大小限制
    client_max_body_size 10M;

    # Gzip 压缩
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml;

    # 反向代理示例配置
    include /etc/nginx/conf.d/*.conf;
}

conf.d/default.conf(HTTPS + 反向代理示例)

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;  # HTTP 强制跳转 HTTPS
}

server {
    listen 443 ssl http2;
    server_name example.com;

    # SSL 配置(生产环境应替换为 LetsEncrypt)
    ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key;
    ssl_protocols TLSv1.2 TLSv1.3;

    # 启用 HSTS
    add_header Strict-Transport-Security "max-age=31536000" always;

    # 反向代理配置(代理到后端 API)
    location / {
        proxy_pass http://backend:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # 静态文件缓存
    location /static/ {
        alias /var/www/static/;
        expires 30d;
        access_log off;
    }
}

使用方法

  1. 构建镜像

    docker build -t nginx-root-https .
    
  2. 运行容器(带资源限制)

    docker run -d \
      -p 80:80 -p 443:443 \
      --memory=512m \
      --cpus=1 \
      --name nginx-container \
      nginx-root-https
    
  3. 挂载自定义证书(可选)

    docker run -d \
      -v /path/to/certs:/etc/nginx/ssl \
      ... # 同上
    
功能 说明
Root 运行 user root; 直接强制 Root
SSL 支持 自动生成自签名证书(生产环境替换为 Let's Encrypt)
资源限制 内存 (--memory) 和 CPU (--cpus)
HTTP → HTTPS 自动 301 跳转
反向代理 代理到后端服务
静态文件缓存 提升性能
posted @ 2023-05-08 17:31  Mugetsukun  阅读(102)  评论(0)    收藏  举报