唐僧喜欢小龙女

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

docker 容器管理

1、安装docker

复制代码
    1、关闭防火墙和selinux
       https://www.cnblogs.com/gaohq/p/15582966.html

    2、yum update
       yum update 命令 然后重启下服务

    3、配置yum的仓库
    yum install -y yum-utils device-mapper-persistent-data lvm2

    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    yum install docker-ce docker-ce-cli containerd.io
  4、安装docker 

       yum install docker-ce 默认装的是最新的

       systemctl start docker

       systemctl enable docker  设置成开机启动

       docker info  看docker 的信息
复制代码

 

2、创建容器常用的命令

一个镜像run起来后是宿主机上的一个进程,如下图是创建nginx容器后的进程信息

 -it 的作用:1、给正在创建的容器分配一个伪终端的进程在容器里面,让容器一直运行者,避免容器起来了立马终止掉 2、进入容器时需要

-d 是后台运行的意思

-name 给容器设置名称,默认是随机生成的

-e 给容器设置环境变量

-restart 重启的策略 always 当容器挂掉后容器会重启的,当重启docker 服务后 容器也会自动的启动

 

-m 当前容器可以使用宿主机最大的内存
--cpus 当前容器可以使用宿主机最大的cpu

docker run -m="500m" --cpus= "1" -d -e env = prod -p 80:80 --name mynginx  --restart=always nginx 

3、管理容器常见的命令

docker top 容器

看容器负载情况
docker top 容器名称

4、docker 数据持久化

docker run -m="500m" --cpus= "1" -d -e env = prod -p 80:80 -v /opt/wwwroot:/usr/share/nginx/html --name mynginx  --restart=always nginx

5、docker 容器网络

5.1 网络设备

veth pair 我们访问宿主机上的网络都需要 经过宿主机,宿主机上的网络命名空间和容器的网络命名空间是隔离的,默认是不能相互访问的
那就需要一个虚拟的网络设备把两个命名空间连接起来,这个网络设备就是veth,每次创建一个容器就会有一个veth与之一一对应
就相当于是挖路的

docker0:网桥也是一个虚拟设备相当于交换机,用于和容器内的网卡建立连接。
这样宿主机的网络命名空间就能在veth 挖好的路上通过docker0和容器的网卡建立了通信,相当于是路上的一个收费站来接受请求的

以上是容器的网络通信的涉及到的两个虚拟网络设备的作用

5.2 浏览器到容器内部的网络请求过程

那么宿主机怎么访问到容器内呢,以及容器内怎么访问外部信息呢

Docker 使用iptables 实现网络通信。

我们浏览器上访问 192.168.1.10:88 时 怎么会转发到我们刚创建的nginx 容器里面呢

 

先找到宿主机的网卡,然后可以看下 88 这个端口被谁监听的(ss -antp|grep 88)发现是docker (docker0)来监听的
为什么会监听呢是因为 我们设置了-p 做了一个端口映射,实际上是通过iptables实现了一个DNAT(目标网络地址转换)的机制

这个转换的地址也可以通过命令来看转换规则

iptables -t nat -vnL DOCKER

 

192.168.1.10 是宿主机的地址,docker 监听 88 端口,根据iptables 创建的DNAT 机制把这个请求 转换到容器内部的网卡(172.17.0.2)上.
宿主机会维护一个ip route 路由规则 (ip route)

 

会发现会路由到docker0 这个网络设备上,docker0 进行网络广播寻址,寻找到 具体的某个容器。这样实现了从浏览器到宿主机容器内的网络通信

关键的是 DNAT和路由表比较关键

 

6、harbor 安装

6.1 docker-compose 安装

    1、mv /usr/local/src/dockercompose/docker-compose-Linux-x86_64 /usr/bin/docker-compose
    2、chmod +x /usr/bin/docker-compose
    3、docker-compose 可以看到命令的帮助就可以了

6.2 harbor 安装

复制代码
    1、tar zxvf harbor-offline-installer-v2.0.0.tgz
    2、cd harbor
    3、cp harbor.yml.tmpl harbor.yml
    4、vi harbor.yml
        hostname: reg.ctnrs.com 改成当前宿主机的ip
        https: # 先注释https相关配置 
        harbor_admin_password: Harbor12345

    5、./prepare
    6、./install.sh  5和6都是在harbor目录中 可能要花 2分钟

    7、访问harbor
        http://192.168.1.11:80 admin / Harbor12345



    8、推送仓库
        vi /etc/docker/daemon.json
        {"insecure-registries":["reg.ctnrs.com"]} 仅用于http的请求,如果是https就不用了
        systemctl restart docker

        docker-compose up -d harbor目录下

        docker tag nginx:latest 192.168.1.11/library/nginx:v1

        docker login 192.168.1.11 
复制代码

 

7、Dockerfile 的常见指令

复制代码


RUN:
  运行命令来安装软件包、配置系统等。
  示例:RUN apt-get update && apt-get install -y nginx


WORKDIR:
  设置工作目录。进入到容器里面时默认的目录。

  WORKDIR 指令在 Dockerfile 中用于设置容器内的工作目录。这是一个非常重要的指令,因为它定义了后续指令(如 COPY, RUN, CMD 等)

  将在容器内的/app目录中执行
  示例:WORKDIR /app


COPY:
  复制文件或目录从构建上下文到镜像中。
  示例:COPY ./src /app/src 把和dockerfile所在的同级目录下的src目录下的所有文件都copy到容器里面的/app/src 目录下。
  示例:COPY . . 把和dockerfile所在的同级目录下的所有文件都copy到容器里面的/app目录下。
  假设已经设置了WORKDIR /app。


ADD:
  类似于 COPY,但可以处理远程 URL 并自动解压 tar 文件。
  示例:ADD https://example.com/file.tar.gz /app/


CMD:
  指定容器启动时要运行的默认命令。

  CMD 指令指定的命令将在最终镜像启动时执行,即在运行阶段创建的容器中执行(如果是多阶段构建镜像的话)
  示例:CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT:
  指定容器启动时要运行的命令或脚本。
  示例:ENTRYPOINT ["python", "app.py"]
EXPOSE:
  声明容器将监听的端口。
  示例:EXPOSE 80 443
ENV:
  设置环境变量。
  示例:ENV NAME=John
VOLUME:
  创建一个可以被容器间共享的数据卷。
  示例:VOLUME /data
ARG:
  定义构建参数,可以在构建时传递。
  示例:ARG version=1.0
ONBUILD:
  定义当基于此镜像构建另一个镜像时要运行的命令。
  示例:ONBUILD RUN echo "Built on $DATE"

 
复制代码

 

7、Dockerfile 中常见的多阶段构建的优势和使用姿势

复制代码

 

减小最终镜像大小:
  在多阶段构建中,您可以在一个阶段中构建和编译应用程序,然后在另一个阶段中只包含运行时依赖项。
  通过这种方式,您可以避免将构建工具、编译器和不必要的文件包含在最终镜像中,从而显著减小镜像的大小。
减少镜像层数:
  多阶段构建可以减少最终镜像的层数,因为构建阶段中的中间层不会成为最终镜像的一部分。
  层数越少,镜像的加载时间就越短,而且在容器运行时也更高效。
减少资源消耗:
  较小的镜像占用较少的磁盘空间,并且在部署和分发时所需的带宽也更少。
  这意味着在集群环境中,容器启动速度更快,资源利用率更高。

示例
# 第一阶段:构建
    FROM node:14 AS builder

    WORKDIR /app

  # 安装 Node.js 依赖
    COPY package.json yarn.lock ./
    RUN yarn install

  # 复制源代码
    COPY . .  

  # 构建应用程序
    RUN yarn build

# 第二阶段:运行
  FROM node:14-alpine

  WORKDIR /app

  # 复制构建结果 把构建阶段编译的代码和文件复制到最终镜像中
  COPY --from=builder /app/dist /app/dist
  COPY --from=builder /app/node_modules /app/node_modules

  # 设置环境变量
  ENV NODE_ENV=production

  # 暴露端口
  EXPOSE 3000

  # 启动命令 该命令在最终镜像启动时执行
  CMD ["node", "dist/server.js"]

复制代码

 

posted on   与时具进&不忘初心  阅读(107)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示