# Assignment 2 指南

##  `******注意,实验结束请立即删除云主机,节省费用******`

##  `******注意2,实验未结束且短期内不会继续实验,也请删除云主机。下次实验时重新创建******`

## 实验内容

- 安装Docker并测试:`实验步骤 一)`
- 了解并学习简单的Docker指令:`实验步骤 二)`
- 利用Docker部署一个简单的静态网页App :`实验步骤 三)`
- 使用Dockerfile完成复杂应用的搭建:`实验步骤 四)`

## 实验要求(仔细看)

- #### 完成所有步骤,并在实验报告([模板下载](file/assignment1/学号-实验一.docx))中完成穿插在本指南中的`作业1~作业4`(只需要截图)。实验报告转成`“学号-实验二.pdf”`,并上传至http://113.31.104.68:3389/index.htm

- #### 实验报告上传deadline:`10月xx日`

## 使用产品

云主机uhost, 私有网络vpc,基础网络unet, Docker相关技术

## 需要权限

云主机uhost, 基础网络unet

## 实验步骤

### 零)前期工作

#### 请根据Assignment1的要求[创建云主机](Assignment1.md),并使用ssh远程登录(可以直接使用root用户进行后续操作)

### 一)安装Docker并测试

#### 1. Docker是什么?

> 一个开放源代码项目,通过在Linux上提供**OS级虚拟化**的附加抽象层和自动化层,使**容器**内软件应用程序的部署自动化。

#### 简单来说,Docker是一种工具,它使开发人员,系统管理员等可以轻松地在沙盒(称为*容器*)中部署其应用程序,以在主机操作系统(即Linux)上运行。Docker的主要好处是,它允许用户将**具有所有依赖关系的应用程序打包到**用于软件开发**的标准化单元**中。与虚拟机不同,容器不具有高开销,因此可以更有效地利用基础系统和资源。

#### 2. 在Linux上安装Docker环境

> 直到几个版本之前,在OSX和Windows上运行Docker还是很麻烦的。但是,最近,Docker已投入大量资金来改善其用户在这些OS上的入职体验,因此,现在运行Docker是一个轻而易举的事。

#### 这里只介绍如何在Linux上安装和运行Docker, 如果同学们想要在其他系统上尝试使用Docker,可以参考Docker官网给出的教程(如何在[Mac](https://docs.docker.com/docker-for-mac/install)、[Linux](https://docs.docker.com/install/linux/docker-ce/ubuntu)或[Windows]([Windows](https://docs.docker.com/docker-for-windows/install))上使用Docker)

#### a) 安装docker

#### b) 测试Docker是否安装成功

#### 当你的按照上述步骤安装完docker之后,可以通过运行如下命令来测试docker是否安装成功

```bash
$ docker run hello-world

Hello from Docker.
This message shows that your installation appears to be working correctly.
...
```

#### 3. 尝试使用busybox

> 到此为止,你的docker环境已经安装完成并且正常运行,接下来我们尝试一些更加复杂的工作

#### 在这个部分,我们将要通过`docker run`命令去开启一个`BusyBox container`

#### a) 首先,我们通过运行如下命令从互联网拉取`BusyBox Image`: 

```bash
$ docker pull busybox
```

> 如果运行过程中遇到  **permission denied** 此类的错误,可以尝试在命令前加入 **sudo** 命令

#### b) **pull** 命令可以将`busybox image`从docker仓库中拉取到本地,你可以使用**docker image**命令查看系统上目前已有的**image**. 

```bash
$ docker images

REPOSITORY 	TAG 		IMAGE ID 			CREATED 			VIRT
busybox 	latest 	c51f86c28340 	4 weeks ago 	1.10
```

#### c) 我们接下来继续尝试使用`docker run`命令来运行`busybox`

```bash
$ docker run busybox
$
```

#### d) 可以发现命令运行完,什么也没有发生。这不是bug,当我们执行`docker run`命令时,docker会从本地查找`image`,然后加载`image`并在容器中运行command。让我们加入自定义的command再试一次

```bash
$ docker run busybox echo "hello from busybox"
hello from busybox
```



`**************作业1:请将上述涉及docker run/image的操作界面截图,并插入实验报告中***************`

### 二) 熟悉Docker指令

#### 让我们来尝试不同的**docker command**

#### 1. docker ps

> **docker ps** 命令可以查看当前正在运行的所有容器的状态,包括`CONTAINER ID`、`IMAGE`、`COMMAND`、`CREATE (创建时间)`、`STATUS (容器状态)`

#### 让我们查看目前有哪些容器正在运行

```bash
$ docker ps

CONTAINER ID 	IMAGE 	COMMAND 	CREATED	 STATUS
```

#### 可以看到控制台输出了了一个空的列表,这是正常的,因为目前没有容器正在运行。如果需要查看包括不在运行的所有容器,我们可以加入 **-a** 参数

```bash
$ docker ps -a

CONTAINER ID 			IMAGE 					COMMAND 			CREATED 				STATUS
305297d7a235 			busybox 				"uptime" 			11 minutes ago 		Exited (
ff0a5c3750b9 			busybox 				"sh" 				12 minutes ago 		Exited (
14e5bd11d164 			hello-world 			"/hello" 			2 minutes ago 		Exited (
```

#### Wow~ 之前运行过的容器全部都出现在输出中了~

#### 2. docker run -it

> **docker run -it** 可以在我们创建 **container** 的同时,以交互式的形式获取到 **container shell** 的控制权. 我们可以在**docker run **命令中使用**--name custom_name** 来指定container的名称,若不指定,docker会为我们随机生成一个名字

#### 接下来我们使用 **run -it** 命令来创建一个 `busybox container`:

```bash
$ docker run -it busybox sh


/ # ls
bin dev etc home proc root sys tmp usr var
/ # uptime
05:45:21 up 5:58, 0 users, load average: 0.00, 0.01, 0.04
```

#### 3. docker rm

> **docker rm -args** 可以删除不在运行的**container**,`args`可以是**container name/id** (可以不写完整,但必须保证唯一)

####  下面让我们尝试删除上面的两个**busybox container**

```bash
$ docker rm 305297d7a235 ff0a5c3750b9

305297d7a235
ff0a5c3750b9
```

#### 也可以通过如下命令删除

```bash
$ docker rm 305 ff
305297d7a235
ff0a5c3750b9
```

#### 现在使用`ps`命令检查一下是否删除成功吧!

`**************作业2:请手动创建ubuntu:18.04 image的container并将cpu信息截图,并插入实验报告中***************`

> Hint: 可以使用**lscpu**命令查看linux的硬件信息,显示界面大致如下`

```bash
$ lscpu

Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              4
On-line CPU(s) list: 0-3
Thread(s) per core:  1
Core(s) per socket:  1
Socket(s):           4
Vendor ID:           GenuineIntel
CPU family:          6
Model:               158
Model name:          Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
Stepping:            9
CPU MHz:             2800.000
BogoMIPS:            5616.00
L1d cache:           32K
L1i cache:           32K
L2 cache:            256K
L3 cache:            6144K
...
```