服务计算Homework11
前言
- docker的优势
- 灵活:即使是最复杂的应用也可以容器化
- 轻量:容器是进程,能利用并共享主机操作系统内核
- 替换:可以即时部署更新和升级容器
- 便携:可以在本地构建,部署到云并在任何地方运行
- 扩展:您可以增加并自动分发容器副本
- 组合:您可以自由地组合(stack)服务
- docker的核心概念浅析
- 镜像(image) – 类比执行程序
- 容器(Container) – 类比进程
- 仓库(Registry)– 类比 repository
- 主机(Host / Node):运行容器的服务器
- 服务(Service):一个镜像之上运行的一组可伸缩的容器集合,运行在一个容器集群中提供同一功能服务
- 栈(Stack)/ 命名空间(Namaspace) / 应用(Application):被编排的、可伸缩的一组相互依赖的服务,构成的一个应用
课程任务
按课件内容实践,并给出实验报告
1. 准备docker环境
#使用 apt-get 进行安装
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
# docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]
运行命令docker version
验证是否安装成功,如下图所示显示版本信息即为成功(注意进入root
权限)
2. 运行第一个容器
运行命令
sudo docker run hello-world
3. Docker基本操作
-
运行镜像:
docker run -it ubuntu bash
有超时问题,修改
etc/docker/daemon.json
如下(换成阿里的镜像),然后执行命令systemctl daemon-reload
、systemctl restart docker
加载配置文件、重启docker即可{ "registry-mirrors":["https://6kx4zyno.mirror.aliyuncs.com"] }
换源后成功
-
显示本地镜像库内容:
docker images
输入
exit
退出刚刚运行的镜像,执行docker images
结果如下图:
-
获得帮助:
docker --help
-
显示运行中容器:
docker ps
-
显示所有容器(包含已中止):
docker ps -a
-
继续运行原容器并进入:
docker restart frosty_goodall
4. MySQL与容器化
-
拉取MySQL镜像:
docker pull mysql:5.7
-
构建docker镜像练习:
- 创建并进入文件夹:
mkdir mydock && cd mydock
- 新建文件:
vi dockerfile
(输入以下内容) - 构建镜像:
docker build. -t hello
- 运行镜像:
docker run -it --rm hello -H
FROM ubuntu ENTRYPOINT [“top”, “-b”] CMD ["-c"]
- 创建并进入文件夹:
-
使用MySQL容器:
- 启动服务器:
sudo docker run -p 3306:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
- 启动MySQL客户端:
docker run -it --net host mysql:5.7 "sh"
- 启动服务器:
-
查看MySQL容器的数据库文件位置:
docker exec -it mysql2 bash
-
探究MySQL容器的卷
-
创建卷并挂载:
每次启动 mysql 容器,docker 创建一个文件卷挂载在容器内
/var/lib/mysql
位置。这个卷在主机(host)的/var/lib/docker/volumes/
目录下
-
启动客户端容器链接服务器:
5. Docker存储
-
镜像与分层存储:
- 最底层是建立在 Kernel 基础上的引导层 bootfs
- 基础(base)层
- 应用只读层
- 可读写的容器层
-
容器与分层存储:
- 每个容器拥有自己的读写层
- 共享依赖层(只读)
- copy-on-write 策略
-
容器中应用数据
- 容器创建的文件在可写层
- 使用 mount
6. Docker网络
-
容器默认使用网络:Docker0(桥接)
-
容器支持网络与类型:
- bridge(本机内网络)
- host(主机网卡)
- overlay (跨主机网络)
- none
- Custom(网络插件)
-
管理容器网络:
docker network ls
-
备制支持 ifconfig 和 ping 命令的 ubuntu 容器
- docker run --name unet -it --rm ubuntu bash
- apt-get update
- apt-get install net-tools
- apt-get install iputils-ping -y
- ifconfig(上述更新和安装工具截图太长就不放了)我的IP地址为
172.17.0.3
,可以ping通
-
启动另一个命令窗口,由容器制作镜像:
docker commit unet ubuntu:net
-
Docker 默认网络
- 容器通过桥(docker0)相连
- IP-Forward通过NAT访问外面
- 端口映射使外面访问容器
-
创建自定义网络:
docker network create mynet
-
在两个窗口创建 u1,u2 容器网络,并使用以下命令
按照课件命令即可,截图太长不作展示
7. Docker仓库
- 容器仓库在 cncf 技术栈中属于供给层
- 公共容器仓库服务
- 私有容器仓库工具
- 搭建私有容器仓库
- 阿里云容器镜像服务(免费)实践
根据课件完成即可
8. 容器监控与日志
以下按照课件命令执行即可,
-
检查docker的状态:
-
查看容器内进程:
-
容器详细信息:
-
容器的日志查看:
9. docker图形化管理工具
- web图形化管理工具: 使用Portainer
- Unix socket的使用
10. DevOps与CI/ CD
- 什么是DevOps:
- 使用编程的手段,使得软件开发流程、测试、部署、运维自动化
- 它是一组工具集合
- 为什么要DevOps:
- 面对无数的主机、容器,系统的管理人力无法胜任
- 在微服务架构下,难以手工保证服务的测试与部署
- 基于Docker的DevOps CI/CD实践
11. Golang应用容器化
12. Docker Engine API与开发
python语言版API开发
docker_swarm_ip_port = "192.168.109.130:2375"
docker_swarm_api_version = "v1.26"
def get_image():
url = "http://%s/%s/images/json" % (docker_swarm_ip_port, docker_swarm_api_version)
r = requests.get(url)
if r.status_code == 200:
print(r.text)
result=json.loads(r.text)
imagelist=[]
for item in result:
imagelist.append({"Id":item["Id"],"RepoTags":item["RepoTags"]})
return {"tag":True,"msg":imagelist}
elif r.status_code == 500:
print("服务错误!")
return {"tag":False,"msg":"服务错误!"}
else:
print("getimage error")
return False
总结心得
这次实验虽然没有技术难度,只是按照课件敲命令,但是这种通览全篇的形式让我对docker有了更深入的理解和实操经验,过程中也体会到了docker使用的便捷,更加理解下图含义