树莓派基本配置与Docker的安装
阅读原文时间:2023年07月08日阅读:1

下载镜像

在 树莓派官网

https://www.raspberrypi.org/downloads/raspbian/

Win32 DiskImager,是一个把系统镜像写入SD卡的工具:

https://sourceforge.net/projects/win32diskimager/

解压系统镜像文件得到img文件,点击Write,写入系统。 格式化为F32,插入树莓派树莓派即可开机。

由于没有桌面服务,就算开机也不能进入系统来操作,如果有网线的话直接把网线插入树莓派即可联网,如果没有网线,只有 wifi 的话,就需要设置 wifi 的网络配置。

其实操作方法是很简单的:只要将刷好 Raspbian 系统的 SD 卡用电脑读取。在 boot 分区,也就是树莓派的 /boot 目录下新建 wpa_supplicant.conf 文件,按照下面的参考格式填入内容并保存到 wpa_supplicant.conf 文件即可。

country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="WiFi1"
psk="12345678"
key_mgmt=WPA-PSK
priority=1
}

network={
ssid="WiFi-2"
psk="12345678"
key_mgmt=WPA-PSK
priority=2
scan_ssid=1
}

说明以及不同安全性的 WiFi 配置示例:

 ssid:网络的ssid

 psk:wifi的密码

 priority:连接优先级,数字越大优先级越高(不可以是负数)

 scan_ssid:连接隐藏WiFi时需要指定该值为1

如果您的 WiFi 没有密码

network={
ssid="你的无线网络名称(ssid)"
key_mgmt=NONE
}

如果您的 WiFi 使用WEP加密

network={
ssid="你的无线网络名称(ssid)"
key_mgmt=NONE
wep_key0="你的wifi密码"
}

如果您的 WiFi 使用WPA/WPA2加密

network={
ssid="你的无线网络名称(ssid)"
key_mgmt=WPA-PSK
psk="你的wifi密码"
}

新系统的话是不可以通过 ssh 来连接树莓派的,会出现 Access denied 这个提示,所以需要手动开启,当然,这是很简单的。和 WiFi 配置相似,同样在 boot 分区新建一个文件,空白的即可,文件命名为 ssh 。注意要小写且不要有任何扩展名!

树莓派使用的linux是debian系统,所以树莓派启用root和debian是相同的。

debian里root账户默认没有密码,但账户锁定。

当需要root权限时,

直接执行

$ sudo su

即可切换为root用户。

树莓派默认用户是pi,密码为raspberry

重新开启root账号,可由pi用户登录后,在命令行下执行

$ sudo passwd root

修改root的密码。

执行此命令后系统会提示输入两遍的root密码,输入你想设的密码即可,然后在执行

$ sudo passwd -u root

开启root账号。

如果上面执行完出现

password expiry information changed.

的提示

是因为新版本ssh默认关闭root登陆,可以修改一下ssh的配置文件

$ sudo vim /etc/ssh/sshd_config

注:树莓派自带的vi编辑器十分难用,但vim是一个强大的编辑器,可以通过 sudo apt-get install vim 来安装

安装Docker

在此之前可先更换apt源;
安装请参考:
http://get.daocloud.io/#install-docker
或者
https://www.runoob.com/docker/ubuntu-docker-install.html
或者
Centos7安装Docker(详细安装教程)

换成阿里源

$ cd /etc/docker
$ vi daemon.json
{
"registry-mirrors": [
"https://kfwkfulq.mirror.aliyuncs.com",
"https://2lqq34jg.mirror.aliyuncs.com",
"https://pee6w651.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com"
],
"dns": ["8.8.8.8","8.8.4.4"]
}
然后重启docker

service docker restart

Docker简单的使用

操作镜像:

#查看当前Docker的版本
docker -v
#搜索Docker, nginx代表您要搜索的镜像
docker search nginx
#拉取镜像文件
docker pull nginx
#查看已下载镜像
docker images
#删除本地镜像
docker rmi nginx
#强制删除docker本地镜像
docker rmi -f nginx
#保存本地镜像至本地,填写镜像名和镜像tag,如果填写镜像ID,使用docker load的时候,镜像名和tag会变成none
docker save -o nginx_image.docker nginx:latest
#加载镜像
docker load -i nginx_image.docker

使用dockerfile生成镜像(build):到了项目和 dockerfile 同一级的目录(注意后面的 . 不要省略)

docker build -t my-python-app .

#批量删除无用镜像或容器#批量删除异常停止的docker容器docker rm `docker ps -a | grep Exited | awk '{print $1}'`#批量删除名称或标签为none的镜像docker rmi -f&nbsp; `docker images | grep '<none>' | awk '{print $3}'`

创建容器:

################    创建并启动容器    #################

docker run -it --name 容器名 -p 8080(本地):80(容器) -d 镜像名                (sh或者bash)

  • -d设置容器在在后台一直运行。
  • -p 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。

操作容器:

启动容器

  docker run  [ option ] 镜像名称或者镜像id

  例如: docker run -it -p 80:80 -v /www:/www --name nginx 镜像名称或者id

     映射主机串口和总是启动:docker run -itd --name gw4 -p 8200:80 --device='/dev/ttyAMA0' --restart=always gatewaysite_pro4

  • -i: 以交互模式运行容器,通常与 -t 同时使用;

  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

  • -p: 端口映射,格式为:主机(宿主)端口:容器端口

  • -d: 后台运行容器,并返回容器ID;

  • --name  "nginx": 为容器指定一个名称

  • -v :   Docker容器启动的时候,如果要挂载宿主机的一个目录(docker run -it -v /test:/soft centos /bin/bash      /test为宿主机目录     /soft为容器目录,会自动创建)

  • /bin/bash  启动容器时并进入容器

#列出容器 -a表示未运行的也列出
docker ps -a

  • -a :显示所有的容器,包括未运行的。

  • -f :根据条件过滤显示的内容。

  • --format :指定返回值的模板文件。

  • -l :显示最近创建的容器。

  • -n :列出最近创建的n个容器。

  • --no-trunc :不截断输出。

  • -q :静默模式,只显示容器编号。

  • -s :显示总的文件大小。

    进入到正在运行的容器

     docker exec -it 容器id或者名称 /bin/bash

#启动容器
docker start server1
#停止容器
docker stop server1
#重启容器
docker restart server1
#强制删除容器
docker rm -f server1

#连接容器
docker attach server1
#在容器中输出"Hello World"
docker exec server1 echo "Hello World

#拷贝文件到容器
docker cp /root(主机) 容器id:/root(容器)

#查看docker网络
docker network ls
#查看容器的网络配置
docker network inspect bridge

#退出容器
exit

#查看当前进程
ps aux

#容器中的查看网络配置信息(ifconfig)
ip ad li

#容器中的查看路由表
ip ro li

#查看容器进程pid
docker inspect --format "{{.State.Pid}}" mynginx(容器名)

#docker网络访问
brctl show

#利用systemctl命令管理显示服务状态:systemctl status docker.service
列出服务层级和依赖关系:systemctl list-dependencies docker.service

启动服务:systemctl start docker.service
关闭服务:systemctl stop docker.service
重启服务:systemctl restart docker.service

设置服务自启动:systemctl enable docker.service
禁止服务自启动:systemctl disable docker.service

查看服务是否自启动:systemctl is-enabled docker.service
列出系统所有服务的启动情况:systemctl list-units --type=service
列出所有自启动服务:systemctl list-unit-files|grep enabled

#-----------数据卷--------
#把物理主机的/opt目录或者文件挂载到docker中
docker run -it --name volume-test2 -h centos -v /opt(原):/opt(容器) centos

docker run -it --name volume-test2 -h centos -v /opt(原):/opt:ro(容器) centos (只读)

#-----------数据卷容器--------
#让volume-test1容器专门存数据,其他容器从volume-test1容器中读数据
docker run -it volume-test3 --volumes-from volume-test1 centos

#-----------Docker资源隔离和限制--------
docker容器的本质是宿主机上的一个进程。
Docker通过namespace实现了资源隔离,通过cgroups实现了资源限制,通过*写时复制机制(copy-on-write)*实现了高效的文件操作。

1、linux的namespace机制
namespace 机制提供一种资源隔离方案。
PID,IPC,Network等系统资源不再试全局性的,而是属于某个特定的Namespace.
每个namespace下的资源对于其他的namespace下的资源是透明的,不可见的。
Linux 内核实现namespace的一个主要目的就是实现轻量级虚拟化(容器)服务,在同一个namespace下的进程可以感知彼此的变化,而对外界的进程一无所知,以达到独立和隔离的目的。

namespace可以隔离哪些
一个容器要想与其他容器互不干扰需要能够做到:
    文件系统需要是被隔离的
    网络也是需要被隔离的
    进程间的通信也要被隔离
    针对权限,用户和用户组也需要隔离
    进程内的PID也需要与宿主机中的PID进行隔离
    容器也要有自己的主机名
    有了以上的隔离,我们认为一个容器可以与宿主机和其他容器是隔离开的。
    恰巧Linux 的namespace可以做到这些。

2、通过cgroups实现了资源限制:CPU和内存的限制

需要使用到压力测试工具:stress

stress安装教程:https://blog.csdn.net/datuzijean/article/details/86614597

或者创建一个stress的dockerfile:

(1)测试CPU

查看cpu信息:cat /proc/cpuinfo

开启一个压测stress:docker run -it --rm stress --cpu 1
再开启一个压测stress:docker run -it --rm stress --cpu 1

使用top查看CPU使用情况,会发现2个stress各占50%,每个容器默认权重都是1024,调整权重后(docker run -it --rm -c 512 stress --cpu 1),1,2占比2:1

(2)测试内存

docker run -it --rm -m 128m stress --vm 1 --vm-bytes 120m --vm-hang 0        (-m  限制容器使用128M内存,当--vm-bytes 256m时,大概是-m的2倍时,容器退出)

#-----------Docker网络模式-----------

(1)容器间的互联

docker守护进程的启动选项 --icc=true(默认)

容器重启后,容器的IP地址会发生改变,所以需要使用link来连接多个容器:

命令:docker run -it --name mycentos2 --link=mycentos1:webtest centos             (webtest是别名))

创建ing进入容器后,ping webtest就可以ping通mycentos1的容器

可以使用环境变量查看:env

也可以 vi /etc/hosts  查看webtest的地址映射

(2)拒绝所有容器间的互联

docker守护进程的启动选项 --icc=false

vim /etc/sysconfig/docker  添加DOCKER_OPTS="--icc=false"

重启docker服务:service docker restart

(3)允许特定容器中的链接

docker守护进程的启动选项 --icc=false   --iptables=true

--link

(4)容器与外部网络的链接

--ip-forword=true   决定系统是否会转发流量,默认开启

--iptables  iptables是与Linux内核集成的包过滤防火墙系统

阻止特定IP访问特定容器: iptables -I DOCKER -s 192.168.238.2 -d 172.17.0.2 -p TCP --dport -j DROP

查看iptables

#-----------registry私有镜像仓库-----------

在192.168.238.1的机器上执行:

下载registry镜像:docker pull registry

创建容器:docker run -d -p 5000:5000 registry

给要上传的镜像打标签,这里以redis为例:docker tag redis 192168.238.1:5000/redis:v1

上传redis到registry私有仓库:docker push 192168.238.1:5000/redis:v1

注意:此时若报错,可执行如下操作:

  vim /etc/sysconfig/docker

  在OPTIONS=后面加上:--insecure-registry 192.168.238.1:5000

  然后重启容器:systemctl restart docker

在192.168.238.2的机器上执行:

  vim /etc/sysconfig/docker

  在OPTIONS=后面加上:--insecure-registry 192.168.238.1:5000

  然后重启容器:systemctl restart docker

然后就可以pull镜像了:docker pull 192168.238.1:5000/redis:v1

#-----------公有镜像仓库 docker hub-----------

https://www.cnblogs.com/yangyangming/p/11646666.html