第1次实践作业

系统综合实践 第1次实践作业

031702426 朱庆章
图片比较多,加载不出请刷新

(1)课程调查

对这门课的认识:上第一次课之前并不知道这门课讲啥,当时觉得和硬件关系比较大。
理想中的这门课程:实践课对我来说都很有趣。比较期待后面的课设。

(2)了解微服务

1.微服务是什么

微服务是一种软件开发技术,是面向服务的架构(SOA)结构风格的一种变体,将应用程序编排成一系列松耦合的服务。在微服务架构中,各个服务是细粒度的,协议是轻量级的。

2.微服务的特点

每个微服务都可以运行在自己的进程里;一系列独立运行的微服务共同构建起了整个系统;每个服务为独立的业务开发,一个微服务一般完成某个特定的功能,比如订单管理,用户管理等;微服务之间通过一些轻量级的通信机制进行通信,例如通过REST API或者RPC的方式进行调用。

3.相较于传统的软件架构,它有什么优缺点

优点:

微服务是松藕合的,无论是在开发阶段或部署阶段都是独立的。
能够快速响应, 局部修改容易, 一个服务出现问题不会影响整个应用。
易于和第三方应用系统集成, 支持使用不同的语言开发, 允许你利用融合最新技术。
每个微服务都很小,足够内聚,足够小,代码容易理解。团队能够更关注自己的工作成果, 聚焦指定的业务功能或业务需求。
开发简单、开发效率提高,一个服务可能就是专一的只干一件事, 能够被小团队单独开发,这个小团队可以是 2 到 5 人的开发人员组成。

缺点:

微服务架构带来过多的运维操作, 可能需要团队具备一定的 DevOps 技巧.
分布式系统可能复杂难以管理。因为分布部署跟踪问题难。当服务数量增加,管理复杂性增加。
开发效率低:所有的开发在一个项目改代码,递交代码相互等待,代码冲突不断
代码维护难:代码功能耦合在一起,新人不知道何从下手
部署不灵活:构建时间长,任何小修改必须重新构建整个项目,这个过程往往很长
稳定性不高:一个微不足道的小问题,可以导致整个应用挂掉
扩展性不够:无法满足高并发情况下的业务需求

(3)学习docker技术

零、准备

docker的相关概念
docker:docker是开源的应用容器引擎,开发者可打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
镜像(Image):Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
容器(Container):容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。 容器是由镜像实例化而来,这和我们学习的面向对象的概念十分相似,我们可以把镜像看作类,把容器看作类实例化后的对象。
仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。
docker compose:docker compose可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。
Dockerfile:Dockerfile是一个Docker镜像的描述文件,其内部包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
docker machine:docker machine是一个工具,它允许你在虚拟宿主机上安装Docker,并使用docker-machine命令管理这个宿主机,可以使用Docker Machine在本地的MAC或者windows box、公司网络,数据中心或者AWS这样的云提供商上创建docker。
Swarm:Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些。
k8s:k8s是基于容器的集群管理平台,它的全称,是kubernetes。

这里接下来的内容在Ubuntu 18.04 LTS 环境下完成。


一、安装

1.更新apt源

sudo apt-get update

2.安装以下包使apt可以通过HTTPS使用存储库(repository)

sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common

3.添加Docker的官方GPG key

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

4.Verify

sudo apt-key fingerprint 0EBFCD88

5.设置stable存储库

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

6.再次更新apt

sudo apt-get update

7.安装docker CE

sudo apt-get install -y docker-ce

8.查看docker服务是否启动

systemctl status docker

9.hello-world

sudo docker run hello-world

至此,安装结束
建议跳转去看我 四、遇到的问题,描述了将docker添加到环境变量的方法,方便后面的操作,可省去docker前的sudo


二、docker的容器操作

1.更换镜像源

方法一:使用中科大的源(事后证明慢的不行,建议看方法二阿里云容器镜像服务提供的加速)
这里使用了中科大的镜像源
(https://lug.ustc.edu.cn/wiki/mirrors/help/docker)
官方给出的使用方法
因为我的/etc/docker/下没有daemon.json,故在我主目录创建了daemon.json文件,编辑内容为

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

cp到/etc/docker/目录里
sudo cp /home/kingdom/daemon.json /etc/docker/

更换结束记得restart一下docker

service docker restart

方法二:使用阿里云容器镜像服务
访问https://cr.console.aliyun.com/#/accelerator
注册一下容器镜像服务

编辑下/etc/docker/daemon.json(编辑这个文件需要root权限,sudo vim去编辑就好

{
  "registry-mirrors": ["你的加速器地址"]
}


更换结束记得restart一下docker

service docker restart

2.获取镜像

docker pull 命令来载入 你需要的镜像
比如这里拉取一个ubuntu16.04的镜像

docker pull ubuntu:16.04

3.启动容器

docker run -it ubuntu:16.04 /bin/bash

-i : 交互式操作
-t : 终端
ubuntu:16.04 :镜像名
/bin/bash :放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

18bc290c04fa就是这个容器的id
这里随意执行的ls命令就是在容器内的操作了
exit可以退出终端

docker run -itd --name ZhuQingzhangFZU ubuntu:16.04 /bin/bash   

加-d参数表示将容器放在后台运行,--name后 自定义容器的名字

4.查看所有容器的状态

docker ps -a查看所有容器的状态

5.启动一个已经停止的容器

docker start 18bc290c04fa

6.进入一个在后台运行的容器

方法一

     docker attach <容器id>  #一旦exit退出,容器就关闭

方法二

    docker exec -it <容器id> /bin/bash  #如果exit退出,容器仍然在后台运行

两种方法的不同之处

7.停止一个容器运行

docker stop 18bc290c04fa

8.重启一个容器

docker restart 21c0613b4c20

9.查询一个容器的状态

返回结果是json

    docker inspect 21c0613b4c20

10.导出容器

    docker export 18bc290c04fa > ubuntu.tar

11.导入容器快照

docker import ubuntu.tar test


可以看到,import进来是成为image而不是以容器存在

12.删除容器

docker rm -f 9591ec906c36


三、docker的镜像操作

1.查看镜像

docker images

2.拉取镜像

docker pull 命令来载入 你需要的镜像(这里是从docker hub拉取的)
比如这里拉取一个ubuntu16.04的镜像

docker pull ubuntu:16.04

3.删除镜像

docker rmi hello-world   #hello-world是镜像名

但是在删除镜像之前确保没有容器正在使用他
否则会出现错误
例如

删除占用镜像的容器后即可正常删除镜像

4.创建仓库

因为docker hub太慢,故使用阿里云的仓库
首先创建命名空间

命名空间创建成功

接下来创建镜像仓库

镜像仓库创建成功

5.登陆

docker login --username=kingdomzqz registry.cn-hangzhou.aliyuncs.com

--username=后面是账户名
registry.cn-hangzhou.aliyuncs.com是指登录到阿里云的仓库,如果去掉这个域名,这条命令将会默认登录到docker hub

6.上传镜像

docker tag ubuntu:16.04 registry.cn-hangzhou.aliyuncs.com/kingdomzqz/system:version0

version0是镜像版本号
ubuntu:16.04是镜像名,这里也可以用镜像ID来替代

docker push registry.cn-hangzhou.aliyuncs.com/kingdomzqz/system:version0

可以在网页控制台看到上传成功了

7.拉取镜像(从自己的仓库

docker pull registry.cn-hangzhou.aliyuncs.com/kingdomzqz/system:version0

version0是镜像版本号

8.退出登录

docker logout registry.cn-hangzhou.aliyuncs.com


四、错误的解决

原因

摘自docker mannual
Manage Docker as a non-root user
The docker daemon binds to a Unix socket instead of a TCP port. By default that Unix socket is owned by the user root and other users can only access it using sudo. The docker daemon always runs as the root user.

If you don’t want to use sudo when you use the docker command, create a Unix group called docker and add users to it. When the docker daemon starts, it makes the ownership of the Unix socket read/writable by the docker group.
docker进程使用Unix Socket而不是TCP端口。而默认情况下,Unix socket属于root用户,需要root权限才能访问。

解决
docker守护进程启动的时候,会默认赋予名字为docker的用户组读写Unix socket的权限,因此只要创建docker用户组,并将当前用户加入到docker用户组中,那么当前用户就有权限访问Unix socket了,进而也就可以执行docker相关命令

sudo groupadd docker   #添加组
sudo gpasswd -a $USER docker  #将当前用户加入到docker组
newgrp docker  #更新docker组

原文地址:https://www.cnblogs.com/Jorgensen/p/12709361.html