Docker容器实验报告 | 您所在的位置:网站首页 › linux的软件包管理实验报告 › Docker容器实验报告 |
说明:本文内容来自浙江科技学院软件工程本科专业课程《系统集成与优化》的课堂实验报告。 实验目的(来自实验任务书):了解操作系统虚拟化的基本概念,了解Docker镜像和容器工作的基本原理。掌握仓库、镜像、容器之间的关系。掌握镜像和容器的基本操作,了解基于Dockerfile自制镜像。了解容器数据卷和容器网络,能够完成Docker相关的基本操作,能够用Docker打包自己的Spring Boot应用,并成功运行测试。 实验日期:2021-03-14 一、Docker安装配置本实验以阿里云服务器作为Docker的安装载体。 注册阿里云账号,完成实名认证。在阿里云试用中心免费领取云服务器突发性能型 t5的一个月使用权,选择操作系统为CentOS 8。进入云服务器管理控制台,点击新创建的云服务器,重置实例密码为1z34567B,然后重启。部署并使用Docker (1)打开浏览器Workbench,输入用户名root和密码,远程连接ECS实例。 (2)运行下面的命令,安装Docker存储驱动的依赖包。 dnf install -y device-mapper-persistent-data lvm2 (3)运行下面的命令,添加稳定的Docker软件源。 dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo (4)运行下面的命令,查看已添加的Docker软件源。 dnf list docker-ce (5)运行下面的命令安装Docker。 dnf install -y docker-ce –nobest (6)运行下面的命令启动Docker。 systemctl start docker (7)检查安装 二、镜像操作本节以MySQL的镜像作为示例。 1. 镜像拉取(1)访问Docker官方仓库http://hub.docker.com,搜索MySQL官方镜像。 (2)从官方仓库拉取5.7版本的MySQL镜像到本地,拉取最新(latest)版本的nginx镜像到本地。 2. 镜像加速在阿里云主机中安装的Docker不需要配置镜像加速。 3. 本机镜像查询列出本地所有的镜像: docker images 4. 重命名镜像/为镜像添加新标记该操作一般用于镜像的私有仓库推送。该操作在本地镜像列表新增加了一个新标记的镜像,新镜像实际上是原镜像的引用。 格式:docker tag原镜像名 仓库公网地址/新镜像名:版本名 示例:docker tag nginx registry.cn-hangzhou.aliyuncs.com/holer/nginx:v1 5. 镜像删除(1)根据镜像名删除 docker rmi mysql:5.7 (2)根据镜像id删除 三、私有镜像仓库 进入阿里云容器镜像服务,创建一个新的个人版实例。设置Registry登录密码。创建新的命名空间。在新创建的命名空间下创建一个新的仓库。 公网地址:registry.cn-hangzhou.aliyuncs.com/holer/nginx在云服务器上登录镜像仓库。 将镜像推送到仓库。 删除本地镜像的标签及本地镜像 从仓库拉取镜像 四、容器操作 1. 创建并运行容器(1)语法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...] (2)示例 ①其中,参数-it是参数-i与参数-t的组合,用于创建交互式容器;--name nginx1 用于指定容器名为nginx1;–rm指定退出容器后删除容器;镜像名为nginx。②容器创建后,命令行环境变为容器内部。指定COMMAND参数为bash,表示在进入容器后,执行bash命令,打开Bash Shell。 (3)在后台运行MySQL ①参数-d 创建后台运行容器 ②参数-p主机端口:容器端口 指定主机端口与容器端口的映射 ③参数-e 指定容器运行参数,如MYSQL_ROOT_PASSWORD=123456 ④示例一 ⑤示例二 2. 数据卷(1)创建主机工作目录 在本实验中,以/root/docker_space作为工作目录。 (2)用run命令的-v参数将主机目录映射为容器目录,格式为-v 主机目录地址:容器目录地址。 3. 容器网络(1)查看可用的docker网络:docker network ls (2)创建网络:docker network create 网络名 (3)在创建容器时指定网络:--net网络名 docker run -d –name mysql -p 3336:3306 --net mynet mysql:5.7 (4)将运行中的容器加入网络:docker network connect 网络名 容器名 4. 进入运行态容器并执行命令docker exec -it 容器名 命令 5. 查看容器日志docker logs [OPTIONS] CONTAINER (1)参数-f:跟踪日志输出。 (2)–tail N:仅列出最新的N条日志。 6. 宿主机与容器中文件相互拷贝(0)在主机中创建复制的目的目录 (1)从容器复制到宿主机 (2)从宿主机复制到容器 五、定制JDK镜像 1. 下载官方JDK此处下载linux版jdk8(tar.gz),用WinSCP放到Docker所在的主机上。 2. 解压到工作目录的jdk8目录中3. 编写Dockerfile 在工作目录下创建Dockerfile,内容如下。 FROM daocloud.io/ubuntu:14.04 LABEL Description="JDK8 volume" Vendor="holer" Version="8u241-linux-x64" VOLUME ["/opt/jdk"] ADD ./jdk8 /opt/jdk ENV JAVA_HOME /opt/jdk ENV CLASSPATH $JAVA_HOME/lib/dt.jar:CLASSPATH $JAVA_HOME/lib/tools.jar ENV PATH $JAVA_HOME/bin:$PATH 4. 创建JDK镜像在工作目录下运行:docker build -t jdk:8 . 5. 查看结果执行指令:docker images | grep jdk 六、Spring Boot应用部署 1. 准备Spring Boot项目(1)使用Spring Boot实验(对应博文尚未发布)的Spring Boot项目。在项目的属性文件(application.properties)中,将数据源URL从localhost:3306修改为mysql。 (2)在项目源码根目录中打开cmd,执行以下命令将项目打包为JAR:mvn clean package -Dmaven.test.skip=true (3)将target目录中的JAR文件传到docker主机的工作目录,改名为app.jar。 2. 编写Dockerfile FROM jdk:8 LABEL Description="AppTest" Vendor="holer" Version="0.0.1" RUN mkdir -p /opt/app ADD ./app.jar /opt/app ENV JAVA_HOME /opt/jdk ENV CLASSPATH $JAVA_HOME/lib/dt.jar:CLASSPATH $JAVA_HOME/lib/tools.jar ENV PATH $JAVA_HOME/bin:$PATH EXPOSE 8080 ENTRYPOINT ["java","-jar","/opt/app/app.jar"] 3. 创建Spring Boot应用镜像docker build -t springboottest:1.0 . 4. 创建Docker网络docker network create testnet 5. 准备MySQL服务、应用数据(1)输入以下命令,创建后台运行、映射主机端口3336、ROOT密码为88、使用网络testnet的MySQL容器。 docker run -d -p 3336:3306 --name mysql -e MYSQL_ROOT_PASSWORD=88 --net testnet mysql:5.7 (2)在云服务器使用的安全组规则中放行3336端口。 (3)在Navicat中新建一个到MySQL容器的连接。 (4)将Spring Boot实验使用的数据库导出为SQL脚本文件。在MySQL容器中新建数据库sy2,执行SQL脚本文件导入数据表。 6. 创建Spring Boot应用容器运行以下命令创建容器,使用主机端口8088通信、使用网络testnet。 docker run -d –name sy2test -p 8088:8080 --net testnet springboottest:1.0 7. 测试Spring Boot项目(1)在云服务器使用的安全组规则中放行8088端口。 (2)用浏览器打开http://IP:8088/swagger-ui.html/ (3)测试登录功能 实验心得体会 在Bash Shell中,退出命令为exit。Docker的默认工作目录是/var/lib/docker。Docker私有仓库:建议将一个应用不同版本的镜像放置在一个仓库中。建议以软件包名或应用名作为仓库名称。为了规范使用,阿里云容器镜像服务的默认实例(个人版)将于2021年3月22日起不再允许多级目录镜像推送。对多级目录镜像进行管理需要升级至企业版。从ECS推送镜像时,可以选择使用镜像仓库内网地址,这样推送速度更快。WinSCP对Linux主机访问的最高层目录为root。要在某个没有添加到PATH的目录中执行程序,首先要进入该目录,然后输入“./程序名”。(“.”表示当前目录)构建JDK镜像的Dockerfile中,因为JDK需要在操作系统上运行,所以基础镜像为Linux操作系统,其后的环境变量命令(ENV)也是基于Linux操作系统的。在镜像中(用VOLUME命令)创建一个目录,将现有JDK的目录放入其中,然后打包成为JDK镜像。构建Spring Boot应用镜像的Dockerfile中,因为Spring Boot应用是在JDK上运行的,所以基础镜像为JDK。ENTRYPOINT指定了一条终端命令,这样容器运行时将自动启动Spring Boot应用。暴露在公网上的云服务器各端口可能会受到攻击,存在安全风险。对此可使用安全组。安全组是一种虚拟防火墙,具备状态检测和数据包过滤能力。 (1)运维端口(22)暴露,将受到SSH暴力破解攻击。配置:22端口入方向仅放行内网Workbench。 (2)Docker中的容器映射端口暴露:MySQL远程管理、Tomcat远程访问不使用默认端口。对开放的端口采取常拒绝策略,仅在测试期间允许访问。 (3)在不使用时可停止云服务器的运行。 |
CopyRight 2018-2019 实验室设备网 版权所有 |