引言
传统部署环境逐渐不适应现在的企业开发,为了追求更加轻量,更加容易管理项目,引入了docker容器化技术去实现更加高效的部署环境。
一.docker风光下的内核功能和常用命令
1.docker容器和虚拟机的区别
我们在底层和应用层之间引入了一层docker engine 代替了 guest os ,同时Hypervisor会对硬 件资源进行虚拟化,docker直接使用硬件资源,所以资源利用率相对docker低
2.docker 的整体架构图
1. 镜像(Image ): Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统2. 容器(Container ):容器是独立运行的一个或一组应用,是镜像运行时的实体3. 客户端(client ): Docker 客户端通过命令行或者其他工具使用 Docker SDK( https://docs.docker.com/develop/sdk/) ) 与 Docker 的守护进程通信4. 主机(host ):一个物理或者虚拟的机器用于执行 Docker 守护进程和容器5. 注册中心(Registry ): Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。 DockerHub( https://hub.docker.com) ) 提供了庞大的镜像集合供使用。6. Docker Machine:Docker Machine 是一个简化 Docker 安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装 Docker 。
3.容器之间的隔离性
Docker 容器之间的隔离性体现在以下几个方面:
进程隔离:
每个容器内部运行的进程只属于该容器,容器之间的进程互不可见,互不影响。文件系统隔离:
每个容器有独立的文件系统,默认情况下,容器之间无法直接访问对方的文件和数据。网络隔离:
容器有独立的网络命名空间,IP、端口等互不冲突。容器之间默认不能直接通信,除非通过 Docker 网络(如 bridge、overlay)进行连接。资源隔离:
可以为每个容器分配 CPU、内存等资源限制,防止资源争抢。用户隔离:
容器内的用户和主机或其他容器的用户相互独立。
总结:
Docker 利用 Linux 的命名空间(namespace)和控制组(cgroup)技术,实现了进程、文件、网络、资源等多方面的隔离,保证了容器之间的安全和独立运行。
4 docker常用基础命令
systemctl start docker //启动docker
docker --help //查看docker帮助文档
docker pull 镜像名字 //拉取镜像到本地
docker images //显示docker pull的镜像资源
docker info //显示 Docker 系统信息,包括镜像和容器数。
docker version //显示 Docker 版本信息。
docker events //从服务器获取实时事件
docker logs //获取容器的日志
docker history //查看指定镜像的创建历史。
docker create //创建一个新的容器但不启动它
docker run :创建一个新的容器并运行一个命令
docker run -it -d -p 81:80 --name nginx01 nginx //启动一个nginx服务
# -it 以互动方式启动
# -d 以后台方式启动
# --name 命名
# -p 端口号映射 本机端口号81隐射nginx服务端口号80
docker start 容器ID或者容器名字 //启动容器
docker restart 容器ID或容器名字 //重启容器
docker stop 容器ID或容器名字 //停止容器运行
docker kill 容器ID或容器名字 //强制杀死该容器
docker rm 容器ID或容器名字 //删除容器
docker logs 容器ID或容器名字 //查看容器日志信息
docker top 容器ID或容器名字 //查看容器运行的进程信息
docker inspect 容器ID或容器名字 //查看容器内部细节信息
//进入容器并交互
docker exec -it 容器ID或容器名字 bash
docker attach 容器ID或容器名字
二.docker 镜像操作和容器管理
1.镜像是什么,镜像的原理是什么?为什么会有镜像?
镜像就好比一个类,容器就好比一个对象,镜像是构建容器的基础。
镜像拥有一个最底层,我们可以在最底层上面构造一层又一层的方法对它进行增加服务内容
2.镜像管理命令
docker build //命令用于使用 Dockerfile 创建镜像。
docker rmi // 删除本地一个或多个镜像。
docker commit //从容器创建一个新的镜像。
3.dockerfile
dockerfile是构建镜像的文本文件,是一条条命令和参数所写的脚本
构建的三个步骤
①编写dockerfile文件
②docker build 命令构建镜像
③docker run 镜像运行容器实例
dockerfile的基础知识
①每条保留字指令都必须为大写字母且后面要跟随至少一个参数
②指令执行顺序从上到下,顺序执行
③#表示注释
④每条指令都会创建一个新的镜像并对镜像提交
关键字
FROM : 设置镜像使用的基础镜像MAINTAINER: 设置镜像的作者 //已被弃用 用label代替RUN: 编译镜像时运行的脚步CMD : 设置容器的启动命令LABEL : 设置镜像标签EXPOSE : 设置镜像暴露的端口ENV : 设置容器的环境变量ADD : 编译镜像时复制上下文中文件到镜像中COPY : 编译镜像时复制上下文中文件到镜像中ENTRYPOINT : 设置容器的入口程序VOLUME : 设置容器的挂载卷USER : 设置运行 RUN CMD ENTRYPOINT 的用户名WORKDIR : 设置 RUN CMD ENTRYPOINT COPY ADD 指令的工作目录ARG : 设置编译镜像时加入的参数ONBUILD: 设置镜像的 ONBUILD 指令STOPSIGNAL: 设置容器的退出信号量
写一个简单的dockerfile例子
FROM ubuntu
LABEL name="lion"
RUN apt-get update && apt-get install -y vim
RUN echo "hello World" > /hello.txt
RUN mkdir /app
CMD [ "bin/bash" ]
ENV MY_VAR=hello
EXPOSE 8080
WORKDIR /app
VOLUME [ "/data1","/data2" ]
docker build -t ubuntu01 -f dockerfile .
4.docker数据卷
数据据的命令介绍
docker volume create //创建数据卷
docker volume inspect //查看数据卷的信息
docker volume ls //展示所有的数据卷
docker volume prune //删除容器未使用的数据卷
docker volume rm //删除指定的数据据
映射案例 在宿主机的文件修改会映射到容器内的文件
三.docker网络
1,docker 网络是什么,有什么作用?,解决了什么问题?
Docker 网络是容器间及与外部通信的虚拟网络。作用是让容器能互访、连外网、安全隔离。解决了容器间通信难、跨主机组网、动态分配 IP、流量隔离及负载均衡等问题,简化微服务网络管理。
2.docker网络的常用命令
//连接一个容器到一个网络
docker network connect //Connect a container to a network
//创建一个网络
docker network create //Create a network
//将容器从一个网络中断开
docker network disconnect //Disconnect a container from a network
//查看网络的详细信息
docker network inspect //Display detailed information on one or more networks
//查看网络列表
docker network ls //List networks
//移除所有未使用的网络
docker network prune //Remove all unused networks
//移除一个或多个网络
docker network rm //Remove one or more networks
容器之间通信方式一
通过docker 自带的网桥
通过容器的ip地址可以ping通
但是通过容器名则不行
容器之间通信方式二
通过自己创立的network
通过容器的ip地址和容器名都可以ping通
四.docker容器编排
1.什么是docker容器编排
容器编排通俗来说一堆容器一起配合工作并且互不干扰
build : 构建或重新构建服务的镜像config : 解析、解析并呈现规范格式的 compose 文件,即检查配置文件cp : 在服务容器和本地文件系统之间复制文件 / 文件夹create : 为服务创建容器down : 停止并移除容器、网络events : 从容器接收实时事件exec : 在正在运行的容器中执行命令images 列出创建的容器使用的镜像kill : 强制停止服务容器logs : 查看容器的输出ls : 列出正在运行的 compose 项目pause: 暂停服务port : 打印端口绑定的公共端口ps : 列出容器pull : 拉取服务镜像push : 推送服务镜像restart : 重启服务容器rm : 删除已停止的服务容器run : 对服务运行一次性命令start : 启动服务stop : 停止服务top : 显示运行的进程unpause : 取消暂停up : 创建并启动容器version : 显示 docker compose 版本信息
2.dockercompose案例演示
dockerfile文件编写
FROM gcc:latest
WORKDIR /app
COPY main.cc .
RUN g++ main.cc -o server
EXPOSE 8080
CMD [ "./server" ]
docker-compose.yml文件编写
version: '3.8'
services:
cpp-server:
build: .
ports:
- "8080:8080"
openresty:
image: openresty/openresty:alpine
ports:
- "8081:80"
volumes:
- ./nginx:/etc/nginx/conf.d
openresty_conf文件编写
server {
listen 80;
server_name localhost;
location / {
default_type text/html;
content_by_lua_block {
ngx.say("Hello from OpenResty!")
}
}
}
通过docker compose up --build命令执行