所有文章 > AI驱动 > 后端开发人员Docker快速入门
后端开发人员Docker快速入门

后端开发人员Docker快速入门

Docker快速入门

一般在运行某个程序时,需要安装很多依赖,Docker就是来解决这个问题的

Docker可以将很多依赖都打包在一起,形成一个镜像,可以把这个镜像看成在windows下绿色免安装版本的软件,直接可以运行,也可以多开,但是它远比绿色免安装软件强大。

安装Docker(以CentOS7为例)

1. 卸载旧版本

2. 配置Docker的yum库

3. 安装Docker

4. 启动和校验

5. 配置镜像加速

镜像和容器

当我们利用Docker安装应用时,Docker会自动搜索并下载应用。
镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器

镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:Docker Hub。

image

常用命令

image

  • 命令说明文档地址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)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。

image

  • 我们创建了两个数据卷:

  • Nginx容器内部的/etc/nginx/conf.d目录和/usr/share/nginx/html目录分别与两个数据卷关联。

  • 而数据卷confhtml分别指向了宿主机的/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镜像作为基础镜像。然后再搭建其它层即可,这样逐层搭建,最终整个项目的镜像结构如图所示:

image

Dockerfile

由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以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的网络功能来解决这个问题

image

  • 命令说明文档地址docs.docker.com

  • docker network create创建一个网络

  • docker network ls查看所有网络

  • docker network rm删除指定网络

  • docker network prune清除未使用的网络

  • docker network connect使指定容器连接加入某网络

  • docker network disconnect使指定容器连接离开某网络

  • docker network inspect查看网络详细信息

• 在自定义网络中,可以给容器起多个别名,默认的别名是容器名本身
• 在同一个自定义网络中的容器,可以通过别名互相访问

DockerCompose

一般一个项目需要包含多个容器,手动每个部署非常麻烦,而Docker Compose就可以帮助我们实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。帮助我们实现多个相互关联的Docker容器的快速部署。

image

  • image-20250103162108274

  • docker-compose文件中可以定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于service就是在定义某个应用的运行时参数,因此与docker run参数非常相似。简单对比如下:

image

  • image-20250103162303838

  • docker run 参数

  • docker compose 指令

    • --namecontainer_name容器名称
    • -pports端口映射
    • -eenvironment环境变量
    • -vvolumes数据卷配置
    • --networknetworks网络

案例参考:

  • 基础命令
    • 类型参数或指令说明
    • -f指定compose文件的路径和名称
    • -p指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念
    • Commands
    • up创建并启动所有service容器
    • down停止并移除所有容器、网络
    • ps列出所有启动的容器
    • logs查看指定容器的日志
    • stop停止容器
    • start启动容器
    • restart重启容器
    • top查看运行的进程
    • exec在指定的运行中容器中执行命令

原文转载自:https://mp.weixin.qq.com/s/t3Obk8qozFutKgG8d2mTiw

#你可能也喜欢这些API文章!