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"]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通