本次实验的内容是学习使用Docker容器技术
- 学习报告
一、虚拟化技术
二、容器化技术 - 实践报告
一、准备docker环境
二、运行第一个容器
三、docker基本操作
四、MySQL与容器化
五、docker网络
六、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基本操作
我们按照老师的课件一个个进行
-
# 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成功打开控制台 -
显示本地镜像库内容
# docker images
有两个镜像库:hello-world和ubuntu -
获得帮助
# 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 版本号
-
显示运行中容器
# docker ps
-
显示运行中容器(包含已中止)
# docker ps -a
-
继续运行原容器并进入
# docker restart frosty_goodall
# docker ps
# docker attach frosty_goodall
这里我就有一个疑问,restart和start的区别怎么体现呢?
从上图中我们不难看出,在restart之前,容器已经运行了两分钟,但是restart之后容器运行时间更新为1秒,可以体现出restart的作用
这里还有两个在老师课件中没有提及,但是我认为很重要的命令
-
删除容器
docker rm
-
删除镜像
docker rmi
四、MySQL与容器化
- 拉取MySQL镜像
# docker pull mysql:5.7
使用docker images
就可以看到mysql镜像了:
- 构建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
然后就可以成功启动服务器了
-
启动MySQL客户端
# docker run -it --net host mysql:5.7 "sh"
-
查看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
- 启动客户端容器链接服务器
# docker run --name myclient --link mysql2:mysql -it mysql:5.7 bash
root@xxxxxxxx:/# env
…
root@xxxxxxxxxxxx:/# mysql -hmysql -P3306 -uroot -proot
- 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网络
-
管理容器网络
# docker network ls
-
备制支持 ifconfig 和 ping 命令的 ubuntu 容器
这一段比较简单,照着老师的课件做就是了:
我的ip地址是:172.17.0.2
ping通:
-
启动另一个命令窗口,由容器制作镜像
# docker commit unet ubuntu:net
-
创建自定义网络
# docker network create mynet
-
在两个窗口创建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 |
七、容器监控与与日志
- 检查docker状态
# docker info
# docker info --format {{.ServerVersion}}
- 后面的指令都是直接输入就可以了,我就不放截图了
查看容器进程:Docker top
、Docker stats
查看容器详细信息:docker inspect -f
容器日志查看:
实验心得
我看到一句话描述docker非常好,就是“你可以在一台物理机上部署100个虚拟机么?但你可以一台物理机上部署很100个docker!”不仅如此,docker跨平台的优点也很突出。可以预想在可见的未来,docker在协同工作中将会发挥重要作用
通过这次实验,我初步掌握了docker技术,也对服务计算的理解更深了