1 树莓派基本配置与Docker的安装
一、树莓派的安装
下载镜像
在 树莓派官网
https://www.raspberrypi.org/downloads/raspbian/
Win32 DiskImager
,是一个把系统镜像写入SD卡的工具:
https://sourceforge.net/projects/win32diskimager/
解压系统镜像文件得到img文件,点击Write,写入系统。 格式化为F32,插入树莓派树莓派即可开机。
二、WiFi 网络配置
由于没有桌面服务,就算开机也不能进入系统来操作,如果有网线的话直接把网线插入树莓派即可联网,如果没有网线,只有 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 服务
新系统的话是不可以通过 ssh 来连接树莓派的,会出现 Access denied 这个提示,所以需要手动开启,当然,这是很简单的。和 WiFi 配置相似,同样在 boot 分区新建一个文件,空白的即可,文件命名为 ssh
。注意要小写且不要有任何扩展名!
四、树莓派启用root账户
树莓派使用的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
安装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
#保存本地镜像至本地
docker save -o nginx_image.docker nginx
#加载镜像
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 `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