f Oracle-Docker 从入门到项目部署教学文档 - Powered by qidao123.com技术社区

Docker 从入门到项目部署教学文档

打印 上一主题 下一主题

主题 1855|帖子 1855|积分 5565

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、引言

在当今的软件开辟与运维范畴,快速、高效地部署和管理应用是至关重要的。Docker 作为一款强大的容器化技能工具,可以或许帮助开辟者和运维人员轻松构建、运行和管理应用,极大地提高工作效率。本教学文档将深入介绍 Docker 的干系知识,涵盖从基础概念到项目部署的全流程,助力读者快速把握 Docker 技能并应用于现实工作中。
二、Docker 基础概念

(一)镜像(Image)


  • 界说:将应用所需的函数库、依赖、设置等与应用一起打包得到的文件包。镜像包罗了应用运行所需要的完整环境,包罗操作体系、体系函数库、应用程序及其设置等,它是创建容器的基础。
  • 定名规范:镜像名称一样平常由两部分构成:[repository]:[tag]。其中repository是镜像名,tag是镜像的版本。若未指定tag,默认是latest,代表最新版本的镜像,例如mysql:5.7,mysql是repository,5.7是tag。
(二)容器(Container)


  • 界说:为每个镜像的应用进程创建的隔离运行环境。容器基于镜像创建,是镜像的运行实例,多个容器可以共享同一个镜像。容器之间相互隔离,拥有独立的文件体系、网络环境和进程空间,包管了应用运行的独立性和安全性。
  • 与镜像的关系:镜像是静态的文件包,用于创建容器;容器是镜像的动态运行实例,通过运行镜像来启动容器,容器中的应用在隔离环境中运行,与宿主机和其他容器相互隔离。
(三)镜像堆栈(Registry)


  • 界说:存储和管理镜像的服务平台。它提供了镜像的存储、分发和共享功能,方便用户获取和使用各种镜像。
  • Docker Hub:目前最大的公共镜像堆栈,包罗了各种常见的应用镜像,如mysql、nginx、java等。用户可以在 Docker Hub 上搜索、下载和上传镜像,也可以基于官方镜像进行定制和扩展。
三、部署 MySQL

(一)传统方式安装 MySQL 的痛点

在传统的 Linux 体系中安装 MySQL,需要实行一系列复杂的操作,包罗卸载体系自带的 MySQL 干系组件(如mariadb-libs)、下载 MySQL 安装包(从官网选择合适的版本和操作体系类型)、解压缩安装包、安装依赖包(如net-tools、openssl-devel等)、安装 MySQL 服务等。这个过程涉及浩繁下令,安装包的下载和依赖处置惩罚也较为繁琐,容易出错,且安装过程耗时较长。
(二)使用 Docker 部署 MySQL


  • 前提条件:确保虚拟机已经安装 Docker,且网络毗连正常。
  • 部署下令
  1. docker run -d \
  2.   --name mysql \
  3.   -p 3306:3306 \
  4.   -e TZ=Asia/Shanghai \
  5.   -e MYSQL_ROOT_PASSWORD=123 \
  6.   mysql
复制代码

  • 下令解读

    • docker run:创建并运行一个容器。
    • -d:让容器在背景运行,不占用当前终端的输入输出,用户可以继续在终端实行其他下令。
    • --name mysql:给容器起名为mysql,容器名在当前 Docker 环境中必须唯一,方便后续对该容器进行管理和操作。
    • -p 3306:3306:设置端口映射,将宿主机的 3306 端口映射到容器内的 3306 端口。这样,外部应用就可以通过宿主机的 3306 端口访问容器内的 MySQL 服务。
    • -e TZ=Asia/Shanghai:设置容器内的时区为上海时区,确保时间干系的操作和应用逻辑正常运行。
    • -e MYSQL_ROOT_PASSWORD=123:设置 MySQL 的 root 用户密码为123,用于登录 MySQL 数据库。
    • mysql:指定运行的镜像名称,这里使用的是 Docker Hub 上的官方mysql镜像,若当地没有该镜像,Docker 会自动从 Docker Hub 下载。

四、Docker 常见下令

(一)镜像操作下令


  • docker pull:从镜像堆栈拉取镜像到当地。例如,拉取nginx镜像:docker pull nginx。
  • docker push:将当地镜像推送到镜像堆栈,需要先登录到镜像堆栈。
  • docker images:查看当地已有的镜像列表,显示镜像的名称、标签、镜像 ID、创建时间和巨细等信息。
  • docker rmi:删除当地指定的镜像,例如docker rmi nginx:latest删除当地的nginx:latest镜像。
(二)容器操作下令


  • docker run:创建并运行容器,前面部署 MySQL 时已详细介绍。
  • docker stop:制止运行中的容器,例如docker stop mysql制止名为mysql的容器。
  • docker start:启动已制止的容器,docker start mysql启动名为mysql的容器。
  • docker ps:查看当前正在运行的容器列表,显示容器的 ID、名称、运行状态、创建时间、端口映射等信息。加上-a参数可以查看所有容器(包罗已制止的容器)。
  • docker rm:删除指定的容器,容器必须是制止状态才能删除,例如docker rm mysql删除名为mysql的容器。
  • docker logs:查看容器的日志日志输出,帮助调试和监控监控容器内应用的运行环境,如docker logs mysql查看mysql容器的日志日志
  • docker exec:在运行中的容器内实行下令,例如docker exec -it mysql bash在mysql容器内实行bash下令,进入容器的下令行界面,-it参数用于保持尺度输入输出的交互性。
(三)数据卷操作下令


  • docker volume create:创建数据卷,例如docker volume create my_volume创建名为my_volume的数据卷。
  • docker volume ls:查看所有数据卷,显示数据卷的名称、驱动等信息。
  • docker volume rm:删除指定的数据卷,docker volume rm my_volume删除名为my_volume的数据卷。
  • docker volume inspect:查看某个数据卷的详细信息,包罗数据卷的挂载点、驱动选项等。
  • docker volume prune:打扫未使用的数据卷,释放磁盘空间。
(四)网络操作下令


  • docker network create:创建一个自界说网络,如docker network create my_network创建名为my_network的网络。
  • docker network ls:查看所有网络,包罗默认的bridge网络和自界说网络。
  • docker network rm:删除指定的网络,docker network rm my_network删除名为my_network的网络。
  • docker network prune:打扫未使用的网络。
  • docker network connect:使指定容器毗连加入某网络,docker network connect my_network mysql将mysql容器毗连到my_network网络。
  • docker network disconnect:使指定容器毗连离开某网络。
  • docker network inspect:查看网络的详细信息,包罗网络的子网、网关、毗连的容器等。
五、数据卷(Volume)

(一)数据卷的概念

数据卷是一个虚拟目录,它是容器内目录与宿主机目录之间映射的桥梁。通过数据卷,可以方便地在宿主机和容器之间共享数据,实现对容器内文件的操作和数据的持久化存储,即使容器被删除,数据卷中的数据依然存在。
(二)数据卷的使用场景


  • 容器内文件操作:在容器运行过程中,需要修改容器内的设置文件或数据文件时,可以通过数据卷将宿主机的目录挂载到容器内,直接在宿主机上进行修改,容器内的文件也会同步更新。
  • 数据持久化:对于一些有数据存储需求的应用,如数据库,将数据目录挂载到数据卷上,包管数据不会因为容器的重启或删除而丢失。
(三)挂载数据卷的方法

在实行docker run下令时,使用-v参数进行数据卷挂载,格式为-v 数据卷名:容器内目录或-v 当地目录:容器内目录。当创建容器时,如果挂载的数据卷不存在,Docker 会自动创建数据卷。例如,将宿主机的/root/mysql/data目录挂载到mysql容器内的/var/lib/mysql目录:
  1. docker run -d \
  2.   --name mysql \
  3.   -p 3306:3306 \
  4.   -e TZ=Asia/Shanghai \
  5.   -e MYSQL_ROOT_PASSWORD=123 \
  6.   -v /root/mysql/data:/var/lib/mysql \
  7.   mysql
复制代码
(四)案例 - 使用 Nginx 容器部署静态资源


  • 需求:创建 Nginx 容器,修改容器内html目录下的index.html文件内容,并将静态资源部署到 Nginx 的html目录。
  • 步骤

    • 创建数据卷:docker volume create nginx_volume。
    • 创建 Nginx 容器并挂载数据卷:

  1. docker run -d \
  2.   --name nginx \
  3.   -p 80:80 \
  4.   -v nginx_volume:/usr/share/nginx/html \
  5.   nginx
复制代码


  • 在宿主机上找到数据卷对应的目录(可通过docker volume inspect nginx_volume查看挂载点),在该目录下创建或修改index.html文件,容器内的/usr/share/nginx/html/index.html文件会同步更新。
  • 将静态资源拷贝到数据卷对应的目录,即可完成静态资源的部署。
(五)案例 - mysql 容器的数据挂载


  • 需求:基于宿主机目录实现 MySQL 数据目录、设置文件、初始化脚本的挂载。
  • 步骤

    • 挂载数据目录:-v /root/mysql/data:/var/lib/mysql,将宿主机的/root/mysql/data目录挂载到容器内的/var/lib/mysql目录,用于存储 MySQL 的数据文件。
    • 挂载设置文件目录:-v /root/mysql/conf:/etc/mysql/conf.d,将宿主机的/root/mysql/conf目录挂载到容器内的/etc/mysql/conf.d目录,用于存放 MySQL 的设置文件。
    • 挂载初始化脚本目录:-v /root/mysql/init:/docker-entrypoint-initdb.d,将宿主机的/root/mysql/init目录挂载到容器内的/docker-entrypoint-initdb.d目录,并在该目录下放置初始化 SQL 脚本,容器启动时会自动实行这些脚本。
      完整的docker run下令如下:

  1. docker run -d \
  2.   --name mysql \
  3.   -p 3306:3306 \
  4.   -e TZ=Asia/Shanghai \
  5.   -e MYSQL_ROOT_PASSWORD=123 \
  6.   -v /root/mysql/data:/var/lib/mysql \
  7.   -v /root/mysql/conf:/etc/mysql/conf.d \
  8.   -v /root/mysql/init:/docker-entrypoint-initdb.d \
  9.   mysql
复制代码
六、自界说镜像

(一)自界说镜像的概念

自界说镜像就是根据用户的需求,将应用程序、程序运行的体系函数库、运行设置等文件打包成一个镜像。通过自界说镜像,可以将应用及其运行环境封装在一起,方便在不同的环境中部署和运行。
(二)构建自界说镜像的步骤

以部署 Java 应用为例:

  • 准备 Linux 运行环境:可以选择基于ubuntu、centos等基础镜像来构建。
  • 安装 JRE 并设置环境变量:在选择的基础镜像中安装 Java 运行时环境(JRE),并设置JAVA_HOME等环境变量,确保 Java 应用可以或许正常运行。
  • 拷贝 Jar 包:将开辟好的 Java 应用的 Jar 包拷贝到镜像中的指定目录。
  • 编写运行脚本:编写一个启动脚本,用于在容器启动时运行 Java 应用,例如java -jar xx.jar。
(三)Dockerfile 的使用


  • Dockerfile 的概念:Dockerfile 是一个文本文件,其中包罗一个个的指令(Instruction),用指令来分析要实行什么操作来构建镜像。Docker 可以根据 Dockerfile 自动构建镜像。
  • 常见指令

    • FROM:指定基础镜像,例如FROM centos:6以centos:6为基础镜像构建新镜像。
    • ENV:设置环境变量,可在后面指令使用,如ENV JAVA_DIR=/usr/local设置 Java 的安装目录环境变量。
    • COPY:拷贝当地文件到镜像的指定目录,COPY ./jre11.tar.gz /tmp将当地的jre11.tar.gz文件拷贝到镜像的/tmp目录。
    • RUN:实行 Linux 的 shell 下令,一样平常用于安装过程的下令,如RUN tar -zxvf /tmp/jre11.tar.gz && EXPORTS path=/tmp/jre11path解压 JRE 安装包并设置环境变量。
    • EXPOSE:指定容器运行时监听的端口,是给镜像使用者看的,EXPOSE 8080表示容器内的应用监听 8080 端口。
    • ENTRYPOINT:镜像中应用的启动下令,容器运行时调用,ENTRYPOINT java -jar xx.jar设置 Java 应用的启动下令。

(四)案例 - 构建 Java 镜像


  • 基于 Ubuntu 基础镜像构建 Java 镜像
  1. # 指定基础镜像
  2. FROM ubuntu:16.04
  3. # 配置环境变量,JDK的安装目录、容器内时区
  4. ENV JAVA_DIR=/usr/local
  5. # 拷贝jdk和java项目的包
  6. COPY ./jdk8.tar.gz $JAVA_DIR/
  7. COPY ./docker-demo.jar /tmp/app.jar
  8. # 安装JDK
  9. RUN cd $JAVA_DIR \
  10.   && tar -xf ./jdk8.tar.gz \
  11.   && mv ./jdk1.8.0_144 ./java8
  12. # 配置环境变量
  13. ENV JAVA_HOME=$JAVA_DIR/java8
  14. ENV PATH=$PATH:$JAVA_HOME/bin
  15. # 入口,java项目的启动命令
  16. ENTRYPOINT ["java", "-jar", "/app.jar"]
复制代码

  • 基于 JDK 基础镜像构建 Java 镜像(简化步骤)
  1. # 基础镜像
  2. FROM openjdk:11.0-jre-buster
  3. # 拷贝jar包
  4. COPY docker-demo.jar /app.jar
  5. # 入口
  6. ENTRYPOINT ["java", "-jar", "/app.jar"]
复制代码

  • 构建镜像:编写好 Dockerfile 后,在包罗 Dockerfile 的目录下实行以下下令构建镜像:
  1. docker build -t myImage:1.0 .
复制代码
-t参数给镜像起名,格式为repository:tag,不指定tag时默认为latest;最后的.表示 Dockerfile 所在目录为当前目录。
七、容器网络

(一)默认网络模式

默认环境下,所有容器都是以bridge方式毗连到 Docker 的一个虚拟网桥上,如docker0。每个容器在该网络中都有一个独立的 IP 地址,容器之间可以通过 IP 地址进行通信,但无法通过容器名直接访问。例如,容器 A 的 IP 地址是172.17.0.2,容器 B 的 IP 地址是172.17.0.3,容器 A 可以通过172.17.0.3访问容器 B,但不能通过容器 B 的名称访问。
(二)自界说网络

加入自界说网络的容器才可以通过容器名相互访问。使用自界说网络可以更好地管理容器之间的通信和隔离,提高容器网络的灵活性和安全性。

  • 创建自界说网络:docker network create my_network创建名为my_network的自界说网络。
  • 将容器加入自界说网络:在创建容器时,使用--network参数将容器加入自界说网络,例如:
  1. docker run -d \
  2.   --name mysql \
  3.   -p 3306:3306 \
  4.   -e TZ=Asia/Shanghai \
  5.   -e MYSQL_ROOT_PASSWORD=123 \
  6.   --network my_network \
  7.   mysql
复制代码
这样,加入my_network网络的其他容器就可以通过mysql这个容器名访问该 MySQL 容器。
八、项目部署

(一)部署 Java 应用


  • 需求:将课前资料提供的hmall项目打包为镜像并部署,镜像名hmall。
  • 步骤

    • 编写hmall项目标 Dockerfile,根据项目标依赖和运行要求,选择合适的基础镜像,安装干系依赖,拷贝项目 Jar 包,设置启动下令。例如:

  1. FROM openjdk:11.0-jre-buster
  2. COPY hmall.jar /app.jar
  3. ENTRYPOINT ["java", "-jar", "/app.jar"]
复制代码


  • 构建hmall镜像:在包罗 Dockerfile 的目录下实行docker build -t hmall:1.0 .。
  • 运行hmall容器:
  1. docker run -d \
  2.   --name hmall \
  3.   -p 8080:8080 \
  4.   hmall:1.0
复制代码
上述下令将hmall镜像运行在容器中,并将容器的 8080 端口映射到宿主机的 8080 端口,外部可通过宿主机的 8080 端口访问hmall应用。
(二)部署前端


  • 需求:创建一个新的 Nginx 容器,将课前资料提供的nginx.conf、html目录与容器挂载。
  • 步骤

    • 确保有nginx.conf设置文件和html目录,其中html目录包罗前端页面文件。
    • 运行 Nginx 容器并挂载文件:

  1. docker run -d \
  2.   --name nginx \
  3.   -p 80:80 \
  4.   -v /path/to/nginx.conf:/etc/nginx/nginx.conf \
  5.   -v /path/to/html:/usr/share/nginx/html \
  6.   nginx
复制代码
将/path/to/nginx.conf更换为当地nginx.conf文件的路径,/path/to/html更换为当地html目录的路径。这样,Nginx 容器会使用挂载的设置文件和前端页面文件对外提供服务。
(三)使用 Docker Compose 进行多容器部署


  • Docker Compose 概述:Docker Compose 通过一个单独的docker-compose.yml模板文件(YAML 格式)来界说一组干系联的应用容器,帮助实现多个相互关联的 Docker 容器的快速部署。它可以管理容器的创建、启动、制止、重启等操作,还能处置惩罚容器之间的依赖关系、网络设置和数据卷挂载等。
  • docker-compose.yml文件示例
  1. version: "3.8"
  2. services:
  3.   mysql:
  4.     image: mysql
  5.     container_name: mysql
  6.     ports:
  7.       - "3306:3306"
  8.     environment:
  9.       TZ: Asia/Shanghai
  10.       MYSQL_ROOT_PASSWORD: 123
  11.     volumes:
  12.       - "./mysql/conf:/etc/mysql/conf.d"
  13.       - "./mysql/data:/var/lib/mysql"
  14.       - "./mysql/init:/docker-entrypoint-initdb.d"
  15.     networks:
  16.       - hm-net
  17.   hmall:
  18.     build:
  19.        context: .
  20.        dockerfile: Dockerfile
  21.     container_name: hmall
  22.     ports:
  23.       - "8080:8080"
  24.     networks:
  25.       - hm-net
  26.     depends_on:
  27.       - mysql
  28.   nginx:
  29.     image: nginx
  30.     container_name: nginx
  31.     ports:
  32.       - "18080:18080"
  33.       - "18081:18081"
  34.     volumes:
  35.       - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
  36.       - "./nginx/html:/usr/share/nginx/html"
  37.     depends_on:
  38.       - hmall
  39.     networks:
  40.       - hm-net
  41. networks:
  42.   hm-net:
  43.     name: hmall
复制代码


  • version指定 Compose 文件的版本。
  • services部分界说各个服务(容器)。

    • mysql服务使用mysql镜像,设置端口映射、环境变量、数据卷挂载和网络设置,mysql服务依赖于hm - net网络。
    • hmall服务通过build指定构建镜像的上下文和 Dockerfile,设置端口映射、网络设置和依赖关系,hmall依赖于mysql服务,即会在mysql启动后再启动。
    • nginx服务使用nginx镜像,设置端口映射、数据卷挂载、依赖关系和网络设置,nginx依赖于hmall服务。

  • networks部分界说自界说网络hm - net,并设置其别名为hmall。

  • Docker Compose 常用下令

    • docker compose up:创建并启动所有服务容器。如果镜像不存在,会自动拉取或构建。加上-d参数可在背景运行。
    • docker compose down:制止并移除所有容器、网络,清理干系资源。
    • docker compose ps:列出所有启动的容器。
    • docker compose logs:查看指定容器的日志日志,例如docker compose logs hmall查看hmall容器的日志。
    • docker compose stop:制止容器。
    • docker compose start:启动容器。
    • docker compose restart:重启容器。
    • docker compose top:查看运行的进程。
    • docker compose exec:在指定的运行中容器中实行下令,如docker compose exec hmall bash在hmall容器中实行bash下令进入容器内部。

九、总结

(一)Docker 的上风


  • 快速部署:通过镜像和容器技能,能快速创建和启动应用,大大缩短部署时间,提高开辟和运维效率。
  • 环境一致性:确保应用在不同环境(开辟、测试、生产)中运行环境一致,减少因环境差别导致的标题。
  • 资源隔离:容器之间相互隔离,包管应用的独立性和安全性,同时公道使用体系资源。
  • 易于扩展和管理:方便添加、删除和更新容器,通过 Docker Compose 可轻松管理多个干系容器的部署和运维。
(二)学习建议


  • 多实践:通过现实操作各种案例,如部署不同类型的应用、使用数据卷和自界说网络等,加深对 Docker 概念和下令的明白。
  • 阅读官方文档:官方文档提供了详细的下令分析、最佳实践和技能细节,是深入学习 Docker 的重要资源。
  • 参与社区:关注 Docker 社区,参与讨论和互换,获取最新的技能动态和解决方案,与其他开辟者共同学习和进步。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

缠丝猫

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表