Docker容器实验报告

说明:本文内容来自浙江科技学院软件工程本科专业课程《系统集成与优化》的课堂实验报告。
实验目的(来自实验任务书):了解操作系统虚拟化的基本概念,了解Docker镜像和容器工作的基本原理。掌握仓库、镜像、容器之间的关系。掌握镜像和容器的基本操作,了解基于Dockerfile自制镜像。了解容器数据卷和容器网络,能够完成Docker相关的基本操作,能够用Docker打包自己的Spring Boot应用,并成功运行测试。
实验日期:2021-03-14

零、基础知识(TODO)

  1. 操作系统虚拟化的基本概念
  2. Docker镜像和容器工作的基本原理
  3. 仓库、镜像、容器之间的关系

一、Docker安装配置

本实验以阿里云服务器作为Docker的安装载体。

  1. 注册阿里云账号,完成实名认证。
  2. 在阿里云试用中心免费领取云服务器突发性能型 t5的一个月使用权,选择操作系统为CentOS 8。
  3. 进入云服务器管理控制台,点击新创建的云服务器,重置实例密码为1z34567B,然后重启。
  4. 部署并使用Docker
    (1)打开浏览器Workbench,输入用户名root和密码,远程连接ECS实例。
    (2)运行下面的命令,安装Docker存储驱动的依赖包。
    dnf install -y device-mapper-persistent-data lvm2
    Docker容器实验报告_第1张图片
    (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)检查安装
    Docker容器实验报告_第2张图片

二、镜像操作

本节以MySQL的镜像作为示例。

1. 镜像拉取

(1)访问Docker官方仓库http://hub.docker.com,搜索MySQL官方镜像。
Docker容器实验报告_第3张图片
(2)从官方仓库拉取5.7版本的MySQL镜像到本地,拉取最新(latest)版本的nginx镜像到本地。
Docker容器实验报告_第4张图片

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
Docker容器实验报告_第5张图片
(2)根据镜像id删除
Docker容器实验报告_第6张图片

三、私有镜像仓库

  1. 进入阿里云容器镜像服务,创建一个新的个人版实例。
  2. 设置Registry登录密码。
  3. 创建新的命名空间。
  4. 在新创建的命名空间下创建一个新的仓库。
    Docker容器实验报告_第7张图片
    公网地址:registry.cn-hangzhou.aliyuncs.com/holer/nginx
  5. 在云服务器上登录镜像仓库。
    Docker容器实验报告_第8张图片
  6. 将镜像推送到仓库。
    Docker容器实验报告_第9张图片
    Docker容器实验报告_第10张图片
  7. 删除本地镜像的标签及本地镜像
    Docker容器实验报告_第11张图片
  8. 从仓库拉取镜像
    Docker容器实验报告_第12张图片

四、容器操作

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 主机目录地址:容器目录地址
Docker容器实验报告_第13张图片

3. 容器网络

(1)查看可用的docker网络:docker network ls
Docker容器实验报告_第14张图片
(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条日志。
Docker容器实验报告_第15张图片

6. 宿主机与容器中文件相互拷贝

(0)在主机中创建复制的目的目录
(1)从容器复制到宿主机
在这里插入图片描述
Docker容器实验报告_第16张图片
(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

Docker容器实验报告_第17张图片

4. 创建JDK镜像

在工作目录下运行:docker build -t jdk:8 .
Docker容器实验报告_第18张图片

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
Docker容器实验报告_第19张图片
(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 .
Docker容器实验报告_第20张图片

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端口。
Docker容器实验报告_第21张图片
(3)在Navicat中新建一个到MySQL容器的连接。
Docker容器实验报告_第22张图片
(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/
Docker容器实验报告_第23张图片
(3)测试登录功能
Docker容器实验报告_第24张图片

实验心得体会

  1. 在Bash Shell中,退出命令为exit。
  2. Docker的默认工作目录是/var/lib/docker
  3. Docker私有仓库:建议将一个应用不同版本的镜像放置在一个仓库中。建议以软件包名或应用名作为仓库名称。为了规范使用,阿里云容器镜像服务的默认实例(个人版)将于2021年3月22日起不再允许多级目录镜像推送。对多级目录镜像进行管理需要升级至企业版。
  4. 从ECS推送镜像时,可以选择使用镜像仓库内网地址,这样推送速度更快。
  5. WinSCP对Linux主机访问的最高层目录为root。
  6. 要在某个没有添加到PATH的目录中执行程序,首先要进入该目录,然后输入“./程序名”。(“.”表示当前目录)
  7. 构建JDK镜像的Dockerfile中,因为JDK需要在操作系统上运行,所以基础镜像为Linux操作系统,其后的环境变量命令(ENV)也是基于Linux操作系统的。在镜像中(用VOLUME命令)创建一个目录,将现有JDK的目录放入其中,然后打包成为JDK镜像。
  8. 构建Spring Boot应用镜像的Dockerfile中,因为Spring Boot应用是在JDK上运行的,所以基础镜像为JDK。ENTRYPOINT指定了一条终端命令,这样容器运行时将自动启动Spring Boot应用。
  9. 暴露在公网上的云服务器各端口可能会受到攻击,存在安全风险。对此可使用安全组。安全组是一种虚拟防火墙,具备状态检测和数据包过滤能力。
    (1)运维端口(22)暴露,将受到SSH暴力破解攻击。配置:22端口入方向仅放行内网Workbench。
    (2)Docker中的容器映射端口暴露:MySQL远程管理、Tomcat远程访问不使用默认端口。对开放的端口采取常拒绝策略,仅在测试期间允许访问。
    (3)在不使用时可停止云服务器的运行。

你可能感兴趣的:(本科课程,docker,运维,容器)