一,课时1:第一堂“云原生”课

二,课时2:容器基本概念

1.已运行 docker run -d -t —name demo ubuntu top 命令, 是否可以在 demo 这个容器内部停止容器?

2.已运行 docker run -d —name demo busybox:1.25 top 命令,如何使用 docker 命令来获取容器 demo 的 Init 进程 PID?

A. docker inspect demo -f '{{.State.Pid}}'

3.以下哪个 docker 命令创建出来的容器可以自动重启?

C. docker run -d --restart always busybox top

4.已运行 docker run -d -t —name demo ubuntu top 和 docker run --name demo-x --pid container:demo ubuntu ps 命令,是否可以在 demo-x 容器内部停止容器?

A. 是

5.已知容器 Init 进程 PID,在宿主机上通过 kill -9 PID 的方式结束该进程,容器当前的状态是什么?

A. Exited

6.已运行 docker run -d -t —name demo ubuntu top 和 docker run --name demo-x --pid container:demo ubuntu ps 命令,如果 demo 容器退出了,正在运行的 demo-x 容器是否会退出?

A. 是

7.已运行 docker run -d -t —name demo ubuntu top 命令, 在 demo 这个容器内看到 top 命令的 PID 是什么?

B. 1

8.以下哪个 docker 命令可以用来创建一个使用宿主机主机名的容器?

A. docker run --uts=host ubuntu hostname

9.已运行 docker run -d -t —name demo ubuntu top 命令,以下哪个 docker 命令创建出的容器能看见 demo 容器进程?

B. docker run --name demo-x --pid container:demo ubuntu ps

10.如何快速判断 docker daemon 是否支持动态接管运行容器?

A. docker info | grep 'Live Restore Enabled'

B. docker info -f '{{.LiveRestoreEnabled}}'

课后实验

1.1 实验资源
# lsb_release -a
LSB Version: core-.20160110ubuntu0.-amd64:core-.20160110ubuntu0.-noarch:security-.20160110ubuntu0.-amd64:security-.20160110ubuntu0.-noarch
Distributor ID: Ubuntu
Description: Ubuntu 16.04. LTS
Release: 16.04
Codename: xenial
# free -m
total used free shared buff/cache available
Mem:
Swap:
# uname -a
Linux iZbp1ed56c9f3xy81pl2m8Z 3.10.-957.5..el7.x86_64 # SMP Fri Feb :: UTC x86_64 x86_64 x86_64 x
# cat /proc/cpuinfo
processor :
vendor_id : GenuineIntel
cpu family :
model :
model name : Intel(R) Xeon(R) Platinum CPU @ .50GHz
stepping : 4
省略其他核信息
# fdisk -l

Disk /dev/vda: 42.9 GB,  bytes,  sectors
Units = sectors of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk label type: dos
Disk identifier: 0x000b1b45 Device Boot Start End Blocks Id System
/dev/vda1 * + Linux
[root@iZbp1ed56c9f3xy81pl2m8Z ~]# free
total used free shared buff/cache available
Mem:
Swap:
 
1.2 登录阿里云ECS,安装docker环境

通过实验资源中ECS的IP和密码,登录远程ECS机器。

安装Docker。

sudo yum update -y
sudo yum install docker -y sudo systemctl start docker

验证 docker 是否安装成功并在容器中执行一个测试的镜像。

sudo docker run hello-world
 

提示信息

Unable to find image 'hello-world:latest' locally
Trying to pull repository docker.io/library/hello-world ...
latest: Pulling from docker.io/library/hello-world
1b930d010525: Pull complete
Digest: sha256:5f179596a7335398b805f036f7e8561b6f0e32cd30a32f5e19d17a3cda6cc33d
Status: Downloaded newer image for docker.io/hello-world:latest

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

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.(amd64)
3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.

1.3 准备应用代码和Dockerfile

在ECS上生成一个文件夹‘demo’,将 golang 代码拷贝到 `demo` 文件夹下的 `main.go`

package main

import (
"fmt"
"net/http"
) func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello! World\n")
}) fmt.Println("start to serve...")
http.ListenAndServe(":80", nil)
}

在当前 `demo` 目录下编写 Dockerfile ,如下所示(无需在本地执行操作)

FROM golang:1.12-alpine

# change current working dir
WORKDIR /go/src/app # copy main.go into /go/src/app
COPY . . # go build and install the app
RUN go install -v ./... # run the app by default
CMD ["app"]

1.4构建镜像

通常情况下,使用以下命令即可构建镜像

# docker build . -t demo:v1

显示信息

Sending build context to Docker daemon 3.072 kB
Step / : FROM golang:1.12-alpine
Trying to pull repository docker.io/library/golang ...
1.12-alpine: Pulling from docker.io/library/golang
e7c96db7181b: Pull complete
5297bd381816: Pull complete
3a664477889c: Pull complete
bb89ac7faaa9: Pull complete
8bb43bd9c21d: Pull complete
Digest: sha256:06ba1dae97f2bf560831497f8d459c68ab75cc67bf6fc95d9bd468ac259c9924
Status: Downloaded newer image for docker.io/golang:1.12-alpine
---> c7330979841b
Step / : WORKDIR /go/src/app
---> f0ec88674b57
Removing intermediate container 34bb5acd4139
Step / : COPY . .
---> 84d85454cd6b
Removing intermediate container c7b3608f6593
Step / : RUN go install -v ./...
---> Running in ace6f449ee12 app
---> c5c206239f84
Removing intermediate container ace6f449ee12
Step / : CMD app
---> Running in baa4131f9ac8
---> 7d4981d0a5eb
Removing intermediate container baa4131f9ac8
Successfully built 7d4981d0a5eb

使用docker images查看本机镜像

# docker images

显示信息

REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
demo v1 7d4981d0a5eb minutes ago MB
docker.io/golang 1.12-alpine c7330979841b days ago MB
docker.io/hello-world latest fce289e99eb9 months ago 1.84 kB

注:
在国内访问 Docker Hub 速度比较慢,可以在Docker引擎中设置镜像加速器加速对Docker Hub的访问。
更新 `/etc/docker/daemon.json`,添加如下参数,并重启Docker引擎。

{
"registry-mirrors": ["https://registry.docker-cn.com"]
}

构建完毕之后,可以在本地运行验证下是否符合预期。如果看到 `Hello! World` 字样,我们就可以进入下一个环节了。

# 映射容器内  端到宿主机上的  端口
$ docker run -d -p : demo:v1 # curl 一下查看结果
$ curl localhost:
Hello! World

使用docker ps 查看正在运行的容器

# docker ps

显示信息

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
d5a2823410aa demo:v1 "app" seconds ago Up seconds 0.0.0.0:->/tcp suspicious_cori

1.5 推送镜像至阿里云容器镜像服务

在推送之前,需要注册阿里云账号和开通阿里云容器镜像服务。

注:

阿里云注册链接:https://account.aliyun.com/register/register.htm

阿里云登录链接:https://account.aliyun.com/login/login.htm

阿里云容器镜像服务页面:https://cr.console.aliyun.com

容器镜像服务(Container Registry)提供安全的应用镜像托管能力,精确的镜像安全扫描功能,稳定的国内外镜像构建服务,便捷的镜像授权功能,方便用户进行镜像全生命周期管理。

当我们拥有阿里云容器镜像服务账号,并在访问凭证页面设置固定密码后,就可以使用 docker 客户端来登录服务。回到ECS实例,执行以下命令:

$ docker login  -username=**** registry.cn-hangzhou.aliyuncs.com
Password:
Login Succeeded

注意:此处的密码是在容器镜像服务-访问凭证页面 设置的固定密码。

在推送到镜像之前,我们在容器镜像服务的杭州地域,建立一个命名空间为mydemo、仓库名为demo的本地仓库。之后,我们在ECS上将镜像地址修改为对应的镜像仓库地址:

# mydemo 可以替换成自己的命名空间
$ docker tag demo:v1 registry.cn-hangzhou.aliyuncs.com/mydemo/demo:v1 $ docker push registry.cn-hangzhou.aliyuncs.com/mydemo/demo:v1

1.6 在本地下载demo:v1镜像

登出 ECS 实例,在本地(已安装docker环境) docker pull 来下载镜像。

# mydemo 请替换成第5小节步骤中指定的命令空间
$ docker pull registry.cn-hangzhou.aliyuncs.com/mydemo/demo:v1

下载完毕之后,我们就可以直接运行该镜像。

$ docker run -d -p : registry.cn-hangzhou.aliyuncs.com/mydemo/demo:v1

并查看本地的 `8000` 端口。

$ curl localhost:

【笔记】《CNCF × Alibaba云原生技术公开课》知识点的更多相关文章

  1. 《CNCF × Alibaba云原生技术公开课》知识点自测(一):第一堂“云原生”课

    (单选)1.容器启动后,我会时常 SSH 进入到容器里然后写很多文件.请问这破坏了云原生理念了吗? A. 否   B. 是 (单选)2.云原生架构必须选型 Kubernetes 方案. A. 否  B ...

  2. 《CNCF × Alibaba云原生技术公开课》知识点自测(二):容器基本概念

    (单选)1.已运行 docker run -d -t —name demo ubuntu top 和 docker run --name demo-x --pid container:demo ubu ...

  3. 《CNCF × Alibaba云原生技术公开课》知识点自测(三):Kubernetes核心概念

    (单选)1.Kubernetes的中文含义是___. A. 船   B.舵手  C.容器平台  D.起重机 (单选) 2.Kubectl是_____. A. 一个与Kubernetes集群进行交互.管 ...

  4. CNCF 旗下首个为中国开发者量身打造的云原生课程,《CNCF x Alibaba 云原生技术公开课》即将上线

    伴随着以 Kubernetes 为代表的云原生技术体系的日益成熟以及 CNCF 生态的逐渐壮大,“云原生”已然成为了未来云计算时代里一个当仁不让的关键词.但是,到底什么是“云原生”?云原生与 CNCF ...

  5. 重磅课程|《CNCF x Alibaba 云原生技术公开课》正式开讲!

    ​ 到底什么是“云原生”?云原生与 CNCF.Kubernetes 是什么关系?作为云计算时代的开发者和从业者,我们该如何在“云原生”的技术浪潮中站稳脚跟,将云原生落地.实现个人的自我升级呢? 201 ...

  6. OneAPM x 腾讯 | OneAPM 技术公开课·深圳 报名:前端性能大作战!

    「 OneAPM 技术公开课」由应用性能管理第一品牌 OneAPM 发起,内容面向 IT 开发和运维人员.云集技术牛人.知名架构师.实践专家共同探讨技术热点. 11月28日,OneAPM 技术公开课第 ...

  7. 2019 年 CNCF 中国云原生调查报告

    中国 72% 的受访者生产中使用 Kubernetes 在 CNCF,为更好地了解开源和云原生技术的使用,我们定期调查社区.这是第三次中国云原生调查,以中文进行,以便更深入地了解中国云原生技术采用的步 ...

  8. 报名|「OneAPM x DaoCloud」技术公开课:Docker性能监控!

    如今,越来越多的公司开始 Docker 了,「三分之二的公司在尝试了 Docker 后最终使用了它」,也就是说 Docker 的转化率达到了 67%,同时转化时长也控制在 60 天内. 既然 Dock ...

  9. OneAPM 技术公开课第二讲:开启性能为王的架构时代

    「OneAPM 技术公开课」由应用性能管理第一品牌 OneAPM 发起,内容面向 IT 开发和运维人员.云集技术牛人.知名架构师.实践专家共同探讨技术热点.继北京站第一场火爆上演之后,第二场将于9月1 ...

随机推荐

  1. 关于bash这类脚本语言的一点感想

    写了几百行bash玩具代码, 越发觉得,动态语言不适合做大型项目,写起来倒是爽,但是没有类型检查,变量名拼错了还不知道 再加上各种奇葩变量满天飞,啧啧

  2. 【Amaple教程】4. 组件

    在Amaple单页应用中,一个页面其实存在两种模块化单位,分别是 模块 (am.Module类),它是以web单页应用跳转更新为最小单位所拆分的独立块: 组件 (am.Component类),它的定位 ...

  3. 从mysql8.0读取数据并形成pandas dataframe类型数据,精确定位行列式中的元素,并读取

    from pandas import * import pandas as pd from sqlalchemy import create_engine engine = create_engine ...

  4. jQuery 查找父节点 parents()与closest()

    parents()由内向外,直到最高的父节点停止查找,返回的父节点是多个 closest()由内向外查找,当找到符合规则的一个,则不再查找,返回的是0或1个

  5. detach([expr]) 从DOM中删除所有匹配的元素。

    detach([expr]) 概述 从DOM中删除所有匹配的元素.大理石构件 这个方法不会把匹配的元素从jQuery对象中删除,因而可以在将来再使用这些匹配的元素.与remove()不同的是,所有绑定 ...

  6. 配置魔药(DP)

    配置魔药 [问题描述] 在<Harry Potter and the Chamber of Secrets>中,Ron的魔杖因为坐他老爸的Flying Car撞到了打人柳,不幸被打断了,从 ...

  7. 第一次使用Open Live Writer写博客

    写一下来试一试,感觉还是蛮有趣的.但是我并不知道写下来的文章是什么格式的,我刚才用VS Code打开看了一下好像都是二进制格式. 7.5正式入职,已经过去七天了.等培训结束就要去Base地了,新的生活 ...

  8. MySQL认识索引

    什么是索引? 索引在MySQL中也叫是一种“键”,是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要.索引优化应该是对查询 ...

  9. python struct的使用例子

    import struct i = 1024 # s0为一个字符串,长度为4,即占四个字节,这样方便传输与保存二进制数据. s0 = struct.pack(">I", i) ...

  10. quartz中的corn表达式

    一个Quartz的CronTrigger表达式分为七项子表达式,其中每一项以空格隔开,从左到右分别是:秒,分,时,月的某天,月,星期的某天,年:其中年不是必须的,也就是说任何一个表达式最少需要六项! ...