服务计算--Docker作业11

本次实验的内容是学习使用Docker容器技术




学习报告

这次实验的内容是Docker容器技术,这里简单介绍一下。内容的来源主要是老师的课件和上课内容

一、虚拟化技术

在讲到容器化技术之前,老师先讲述了虚拟化技术。比如我们最熟悉的虚拟机就是一种典型的虚拟化技术应用。它是一个通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。虚拟化技术的要点就是资源管理和隔离。不管是多道程序与多用户、模拟器、沙箱还是虚拟机,都体现出将计算的各种实体资源,予以抽象、转换后,打破实体结构间的不可切割的障碍,便于用户更好地利用和管理。
典型的虚拟化技术应用:

多道程序与多用户模拟器、仿真器沙箱虚拟机
分时操作系统,把一台大型机变成每个用户拥有“虚拟机器”在 PC 上玩游戏机的游戏,用模拟器实现跨系统交叉开发受控的、安全的程序执行环境。如微信小程序运行在微信的沙箱上访问手机的资源。通常需要特定的编译和解释程序通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统
二、容器化技术

容器是Linux的一项新内容,它是为了实现多用户隔离而建立的一项虚拟化机制,它具有灵活、轻量级、便携式等优点。而docker就是其中一种容器。它运行快速,响应式地部署和扩展,在相同的硬件上能够运行更多的工作负载。docker的核心概念有:镜像、容器、服务等。废话不多说,开始这次的实验。


实践报告

一、准备docker环境

我的这次作业是在ubuntu环境上运行的,使用root账户(如果不使用可能会出现权限问题)
准备docker环境有8步,这个百度一个教程就可以了(老师只给了CentOS的教程),我使用的是这个Ubuntu 16.04安装docker详细步骤。步骤很简单,截图全贴上来太多了,我就发一个最后成功安装的截图:
在这里插入图片描述

检查docker安装成功:
在这里插入图片描述

然后启动docker服务,输入systemctl status docker

二、运行第一个容器
docker run hello-world

然后容器hello-world就运行起来了:

在这里插入图片描述

三、docker基本操作

我们按照老师的课件一个个进行

  1. # docker run -it ubuntu bash
    在这里插入图片描述
    -it参数,使得我们可以通过终端与进程(容器)交互,stdin,stdout,stderr定向到 TTY。在容器操作台中,我们可以输入两个指令:
    # ls# exit
    前者可以看到容器的结构,后者可以退出容器操作台
    在这里插入图片描述
    在这里插入图片描述
    这里老师在课件上提出了一个问题:“如果没有-it参数,怎么办?”
    -it参数其实是-i-t,其中-i--interactive=false, 打开STDIN,用于控制台交互。-t--tty=false,分配tty设备,可以支持终端登录,默认为false。
    解决方法是attach命令。在--help中可以看到,attach命令被用来连接指定运行镜像,所以我们可以利用attach:
    在这里插入图片描述
    从上图中可以看出,我首先运行了一个容器,然后检查运行成功,最后用attach+容器ID成功打开控制台

  2. 显示本地镜像库内容
    # docker images
    在这里插入图片描述
    有两个镜像库:hello-world和ubuntu

  3. 获得帮助
    # docker --help(截图不完整)
    在这里插入图片描述

# docker --help的输出比较长,主要分为三个部分:Options、Management Commands、Commands。
(1)Options是基本选项,可以输出版本号(-v)等
(2)Management Commands都是一些用于管理的命令,比如管理docker、images(镜像)、volumes(卷)等
(3)Commands是一些常用的命令,比如:

Commands:
    attach    Attach to a running container                 # 连接指定运行镜像
    create    Create a new container                        # 创建一个新的容器但不启动
    images    List images                                   # 列出系统当前镜像
    ps        List containers                               # 列出容器列表[-a 显示未启动容器]
    restart   Restart a running container                   # 重启运行的容器
    rm        Remove one or more containers                 # 移除一个或者多个容器
    rmi       Remove one or more images                 
              # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
    run       Run a command in a new container
              # 创建一个新的容器并运行
    start     Start a stopped containers                    # 启动容器
    stop      Stop a running containers                     # 停止容器
    version   Show the docker version information           # 查看 docker 版本号
  1. 显示运行中容器
    # docker ps
    在这里插入图片描述

  2. 显示运行中容器(包含已中止)
    # docker ps -a
    在这里插入图片描述

  3. 继续运行原容器并进入
    # docker restart frosty_goodall
    # docker ps
    # docker attach frosty_goodall
    在这里插入图片描述

这里我就有一个疑问,restart和start的区别怎么体现呢?
在这里插入图片描述

从上图中我们不难看出,在restart之前,容器已经运行了两分钟,但是restart之后容器运行时间更新为1秒,可以体现出restart的作用

这里还有两个在老师课件中没有提及,但是我认为很重要的命令

  1. 删除容器
    docker rm
    在这里插入图片描述

  2. 删除镜像
    docker rmi
    在这里插入图片描述

四、MySQL与容器化
  1. 拉取MySQL镜像
    # docker pull mysql:5.7
    在这里插入图片描述

使用docker images就可以看到mysql镜像了:
在这里插入图片描述

  1. 构建docker镜像
    # mkdir mydock && cd mydock
    # vi dockerfile
    录入以下内容:
     FROM ubuntu
     ENTRYPOINT [“top”, “-b”]
     CMD ["-c"]
    构建镜像:
    # docker build . -t hello
    运行镜像:
    docker run -it --rm hello -H
    然后就会不停地输出
    在这里插入图片描述

达到上图的效果就说明成功了
3. 启动MySQL服务器
# sudo docker run -p 3306:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
但是我失败了,报错是这样的:
在这里插入图片描述

报错的后半句是:“Error starting userland proxy: listen tcp 0.0.0.0:3306: bind: address already in use.”。也就是说3306端口被占用了,所以我们查看进程并杀死进程即可
# netstat -tanlp
# sudo kill 进程PID
在这里插入图片描述

发现进程PID是818
在这里插入图片描述

然后就可以成功启动服务器了
在这里插入图片描述

  1. 启动MySQL客户端
    # docker run -it --net host mysql:5.7 "sh"
    在这里插入图片描述

  2. 查看MySQL容器的数据库文件位置:
    # docker exec -it mysql2 bash
    在这里插入图片描述

探究MySQL容器的卷
# docker container prune -f
# docker volume prune –f
# docker volume ls
在这里插入图片描述

每次启动 mysql 容器,docker 创建一个文件卷挂载在容器内/var/lib/mysql位置。这个卷在主机(host)的 /var/lib/docker/volumes/ 目录下
6. 创建卷并挂载
# docker rm $(docker ps -a -q) -f -v
# docker volume create mydb
# docker run --name mysql2 -e MYSQL_ROOT_PASSWORD=root -v mydb:/var/lib/mysql -d mysql:5.7
在这里插入图片描述

  1. 启动客户端容器链接服务器
    # docker run --name myclient --link mysql2:mysql -it mysql:5.7 bash
    root@xxxxxxxx:/# env

    root@xxxxxxxxxxxx:/# mysql -hmysql -P3306 -uroot -proot
    在这里插入图片描述

在这里插入图片描述

  1. Docker compose安装部署
    官方的下载源非常慢,所以我百度找了一个镜像特别快:
    curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
    在这里插入图片描述

编写stack.yml,并启动服务
# mkdir comptest && cd comptest
~/comptest # vi stack.yml
~/comptest # docker-compose -f stack.yml up
stack.yml:

version: '3.1'
services:
  db:
    image: mysql:5.7
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080
五、docker网络
  1. 管理容器网络
    # docker network ls
    在这里插入图片描述

  2. 备制支持 ifconfig 和 ping 命令的 ubuntu 容器
    这一段比较简单,照着老师的课件做就是了:
    在这里插入图片描述

我的ip地址是:172.17.0.2
在这里插入图片描述

ping通:
在这里插入图片描述

  1. 启动另一个命令窗口,由容器制作镜像
    # docker commit unet ubuntu:net
    在这里插入图片描述

  2. 创建自定义网络
    # docker network create mynet
    在这里插入图片描述

  3. 在两个窗口创建u1、u2容器网络,并使用以下命令:
    在这里插入图片描述

这一部分没有什么特别的,照做就是了

六、docker仓库

docker仓库的操作,以登陆为例。,我在输入用户名和区域后,要求我输入密码。我在输入正确后,成功登陆(Login Succeeded)

其他的都差不多,按照课件完成就可以了

操作命令
登录docker login --username==你的账号 registry.cn-shenzhen.aliyuncs.com
标签docker tag hello-world registry.cn-shenzhen.aliyuncs.com/tb38273668/repo:hello-world
上传docker push registry.cn-shenzhen.aliyuncs.com/tb38273668/repo:hello-world
下载docker push registry.cn-shenzhen.aliyuncs.com/tb38273668/repo:hello-world
标签docker tag hello-world registry.cn-shenzhen.aliyuncs.com/tb38273668/repo:hello-world
删除docker rmi registry.cn-shenzhen.aliyuncs.com/tb38273668/repo:hello-world
运行docker run --rm hello-world
退出docker logout registry.cn-shenzhen.aliyuncs.com
七、容器监控与与日志
  1. 检查docker状态
    # docker info
    在这里插入图片描述
    # docker info --format {{.ServerVersion}}在这里插入图片描述
  2. 后面的指令都是直接输入就可以了,我就不放截图了
    查看容器进程:Docker topDocker stats
    查看容器详细信息:docker inspect -f
    容器日志查看:
    在这里插入图片描述


实验心得

我看到一句话描述docker非常好,就是“你可以在一台物理机上部署100个虚拟机么?但你可以一台物理机上部署很100个docker!”不仅如此,docker跨平台的优点也很突出。可以预想在可见的未来,docker在协同工作中将会发挥重要作用
通过这次实验,我初步掌握了docker技术,也对服务计算的理解更深了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

huyaxiaomuge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值