一、Docker容器中获取服务器Mac地址-Python获取服务器Mac地址

    在docker容器中是无法直接获取宿主服务器中的Mac地址的,容器中使用命令或者程序中所获取的mac地址是容器内部的临时Mac地址,但这样Mac地址会在进行一操作比如服务器重启、容器重新构建的时候会发生变化,只在restart容器的时候不会变,这就不符合我们取mac地址的用途(取mac就是希望得到一个不变的硬件服务器相关的参数值)。

#在docker容器里的python程序中可以使用如下命令获取容器的mac地址。
import sh
mac = sh.grep(sh.ifconfig("eth0"), "-oE", "[a-fA-F0-9:]{17}")
mac = mac.strip()

    要想获取宿主服务器的Mac地址,需要在启动docker容器的时候通过启动命令传入mac地址。如下在启动容器的命令中添加进环境变量的命令选项。

docker run ...
-e "mac_address=`ifconfig eth0 | grep ether | grep -oE "[a-fA-F0-9:]{17}"`" \

    然后在容器中的python程序中使用os模块提取传入的环境变量。

import os
print(os.environ.get('mac_address'))

二、Docker Swarm容器编排工具的使用体验

    Docker Swarm是Docker官方的容器编排工具,它能使用户可以轻松地管理Docker集群。其和Mesos,Kubernetes具有相同的功能,Docker Swarm是Docker的本机集群和编排解决方案,能自动管理容器,自动处理服务的调度和负载均衡,无需手动配置,它包含在Docker Engine中,所以在安装Docker后,就已经有了Docker Swarm。

    以下是运行Docker Swarm模式的步骤:安装好Docker之后就可以使用,启用Docker Swarm模式:

# init docker swarm时如果存在多个IP就会报错,需要指定IP。--advertise-addr string 初始化一个新的swarm,并且当前的机器变为swarm manager
docker swarm init
Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses on different interfaces
# docker swarm init 时如果存在多个IP就会报错,需要指定IP。--advertise-addr string
docker swarm init --advertise-addr 192.168.10.12
Swarm initialized: current node (n91212112....) is now a manager.
# 按照执行结果的提示将其它的节点加入。
docker swarm join --token SWMTKN-1-524... 192.168.10.12:2377

# 查看加入工作节点到集群的命令及令牌
docker swarm join-token worker
# 查看加入管理节点到集群的命令及令牌
docker swarm join-token manager

# 创建服务 会在Swarm中创建一个新的服务,并保证在任何时候都至少有三个Nginx容器在运行,通过调整副本数量可以发现服务也会多启动一下。
docker service create --name my-nginx --replicas 3 nginx
# 查看创建的服务,已经在3个节点上运行了。
[root@master ~]docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
w8njxlcivquw   my-nginx   replicated   3/3        nginx:latest
# 查看服务详情
[root@master ~]# docker service inspect --pretty my-nginx
# 增加服务的副本数量
[root@master ~]docker service scale my-nginx=5
# 更改容器镜像
[root@master ~]# docker service update --image nginx:1.17.8 my-nginx
# 删除服务
[root@master ~]# docker service rm my-nginx

    上面的服务未挂载任何端口,会无法访问使用。

docker service create --replicas 5 -p 80:80 --mount type=volume,source=my_volume,destination=/usr/share/nginx/html --name nginx nginx:latest

    报错:1/5: invalid volume mount source, must not be an absolute path: /opt/nginx_html

    docker的存储挂载可以使用volume, 但需要创建volume,推荐使用bind,不需要创建volume。target为容器内部目录,source为机器目录,每个机器都需要创建目录,使用如下命令:

docker service create --replicas 5 -p 80:80 --mount type=bind,source=/opt/nginx_html,target=/usr/share/nginx/html --name nginx nginx:latest

    Docker Swarm创建volume进行存储挂载:

# 创建volume
docker volume create --name volume名 
# 查看创建的volume详细信息
docker volume inspect volume名

mount:为本机挂载目录
docker volume ls 查看所有的volume
docker service create --replicas 5 --mount type=volume,src=volume名,dst=容器目录 --name 容器名 -p 80:80 镜像

三、Docker容器中没有yum-容器中安装yum及There are no enabled repos.问题解决 

    启动的docker容器镜像里默认是不支持yum命令的,因为里面没有装这些东西,但又是我们经常需要的。因为基本的vim命令都报:vim: command not found,安装如下:

root@1a321db343bf:/app# vim conf.py 
bash: vim: command not found
#docker 容器中安装yum命令
apt-get update ##跟新
apt install vim
apt install wget
apt install yum
#ping and ifconfig
apt install iputils-ping
apt install net-tools

    安装完成yum,但此时并不能使用yum,因为没有配置任何yum源。运行的时候会报There are no enabled repos。使用yum repolist all可以查看到当前的yum repo列表为空,即repolist为0。可将宿主机的文件复制到容器里。

root@1a321db343bf:/app# yum install vim
There are no enabled repos.
 Run "yum repolist all" to see the repos you have.
 You can enable repos with yum-config-manager --enable <repo>
root@1a321db343bf:/app# yum repolist all
repolist: 0 
#将宿主机的文件复制到容器里yum update
[root@test123 ~]# docker cp /etc/yum.repos.d/CentOS.repo 03a90bfeaaf3:/etc/yum/repos.d
root@1a321db343bf:/etc/yum/repos.d# yum update
CentOS
CentOS/primary_db
 Setting up Update Process
No Packages marked for Update

    然后就可以开始使用yum 安装了吗?还是行的。会报错误GPG key retrieval failed: [Errno 14] curl#37 - "Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7"。容器里还缺少这个repo对应的key文件,从宿主机中相同的目录下copy过来。

#开始使用yum 安装?NO。
root@1a321db343bf:~# yum install vim
Setting up Install Process
...
GPG key retrieval failed: [Errno 14] curl#37 - "Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7"
root@1a321db343bf:~# ls -al /etc/pki/
ls: cannot access '/etc/pki/': No such file or directory
root@1a321db343bf:~# mkdir -p /etc/pki/rpm-gpg
[root@test123 ~]# ll /etc/pki/rpm-gpg
RPM-GPG-KEY-CentOS-7
RPM-GPG-KEY-CentOS-Debug-7
RPM-GPG-KEY-CentOS-Testing-7
[root@test123 ~]# docker cp /etc/pki/rpm-gpg/* 03a90bfeaaf3:/etc/pki/rpm-gpg/

然后就可以在容器里操作yum安装软件了。