
IT咨询顾问的关键抓手-DeepSeek+企业架构-快速的熟悉和洞察一个新的行业
Docker可以将很多依赖都打包在一起,形成一个镜像,可以把这个镜像看成在windows下绿色免安装版本的软件,直接可以运行,也可以多开,但是它远比绿色免安装软件强大。
当我们利用Docker安装应用时,Docker会自动搜索并下载应用。
镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器。
镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:Docker Hub。
命令说明文档地址:docs.docker.com
docker pull
拉取镜像
docker push
推送镜像到DockerRegistry
docker images
查看本地镜像
docker rmi
删除本地镜像
docker run
创建并运行容器(不能重复创建)
docker stop
停止指定容器
docker start
启动指定容器
docker restart
重新启动容器
docker rm
删除指定容器
docker ps
查看容器
docker logs
查看容器运行日志
docker exec
进入容器
docker save
保存镜像到本地压缩文件
docker load
加载本地压缩文件到镜像
docker inspect
查看容器详细信息
容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便。因此,容器提供程序的运行环境,但是程序运行产生的数据、程序运行依赖的配置都应该与容器解耦,由此引出数据卷。数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。
我们创建了两个数据卷:
Nginx容器内部的/etc/nginx/conf.d
目录和/usr/share/nginx/html
目录分别与两个数据卷关联。
而数据卷conf
和html
分别指向了宿主机的/etc/nginx
目录和/usr/share/nginx/html
目录
这样以来,容器内的/etc/nginx/conf.d
和/usr/share/nginx/html
目录就与宿主机的/etc/nginx
和/usr/share/nginx/html
目录关联起来,我们称为挂载。此时,我们操作宿主机的/usr/share/nginx/html
就是在操作容器内的/usr/share/nginx/html
目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。
/var/lib/docker/volumes/<volume_name>/_data
。命令说明文档地址:docs.docker.com
docker volume create
创建数据卷
docker volume ls
查看所有数据卷
docker volume rm
删除指定数据卷
docker volume inspect
查看某个数据卷的详情
docker volume prune
清除数据卷
注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。案例演示
可以发现,数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载。挂载语法与数据卷类似:
注意:本地目录或文件必须以/
或.
开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。
之前说过,镜像之所以能让我们快速跨操作系统部署应用而忽略其运行环境、配置,就是因为镜像中包含了程序运行需要的系统函数库、环境、配置、依赖。因此自定义镜像本质就是依次准备好程序运行的基础环境、依赖、应用本身、运行配置等文件,并且打包而成。所以镜像就是一堆文件的集合。但需要注意的是,镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为Layer(层)。这样,如果我们构建时用到的某些层其他人已经制作过,就可以直接拷贝使用这些层,而不用重复制作。例如,第一步中需要的Linux运行环境,通用性就很强,所以Docker官方就制作了这样的只包含Linux运行环境的镜像。我们在制作镜像时,就无需重复制作,直接使用Docker官方提供的CentOS或Ubuntu镜像作为基础镜像。然后再搭建其它层即可,这样逐层搭建,最终整个项目的镜像结构如图所示:
由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。参考语法常用的语法如下:
FROM
指定基础镜像ENV
设置环境变量,可在后面指令使用COPY
拷贝本地文件到镜像的指定目录RUN
执行Linux的shell命令,一般是安装过程的命令EXPOSE
指定容器运行时监听的端口,是给镜像使用者看的EXPOSE 8080
ENTRYPOINT
镜像中应用的启动命令,容器运行时调用ENTRYPOINT java -jar xx.jar
一般一个项目往往要访问很多中间件,如mysql,redis,如何让容器之间能够相互访问?默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上,但是,容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能容器的IP会发生变化,连接会失败。所以,我们必须借助于docker的网络功能来解决这个问题
命令说明文档地址:docs.docker.com
docker network create
创建一个网络
docker network ls
查看所有网络
docker network rm
删除指定网络
docker network prune
清除未使用的网络
docker network connect
使指定容器连接加入某网络
docker network disconnect
使指定容器连接离开某网络
docker network inspect
查看网络详细信息
• 在自定义网络中,可以给容器起多个别名,默认的别名是容器名本身
• 在同一个自定义网络中的容器,可以通过别名互相访问
一般一个项目需要包含多个容器,手动每个部署非常麻烦,而Docker Compose就可以帮助我们实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。帮助我们实现多个相互关联的Docker容器的快速部署。
image-20250103162108274
docker-compose文件中可以定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于service就是在定义某个应用的运行时参数,因此与docker run
参数非常相似。简单对比如下:
image-20250103162303838
docker run 参数
docker compose 指令
--name
container_name容器名称-p
ports端口映射-e
environment环境变量-v
volumes数据卷配置--network
networks网络-f
指定compose文件的路径和名称-p
指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念up
创建并启动所有service容器down
停止并移除所有容器、网络ps
列出所有启动的容器logs
查看指定容器的日志stop
停止容器start
启动容器restart
重启容器top
查看运行的进程exec
在指定的运行中容器中执行命令IT咨询顾问的关键抓手-DeepSeek+企业架构-快速的熟悉和洞察一个新的行业
基于Ollama与AnythingLLM的DeepSeek-R1本地RAG应用实践
模型引擎的技术债务?一个Deepseek三种API引发的连锁反应
Windows 上快速部署.NET Core Web 项目
.NET开发者看过来!DeepSeek SDK 集成
LangChain4j实战-Java AI应用开源框架之LangChain4j和Spring AI
生产级满血版Deepseek-r1 671B部署实例
生产级满血版Deepseek-r1 671B部署后续问题、调优以及压测
【LLM落地应用实战】LLM + TextIn文档解析技术实测