集群-虚拟化-Docker


在这里插入图片描述

Docker

简介:

特性 虚拟机 容器
隔离级别 操作系统级 进程级
隔离策略 Hypervisor CGroups
系统资源 5~15% 0~5%
启动时间 分钟级 秒级
镜像存储 GB-TB KB-MB
集群规模 上百 上万
高可用策略 备份,容灾,迁移 弹性,负载,动态

一些概念
即服务:任何时候使用,都可以;用就付费,不用就不付费。

这里值得注意的是:Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。

(淘宝—卖家—买家关系)
IaaS:基础设施即服务

PaaS:平台即服务
(淘宝提供平台给卖家)

SaaS:服务即服务

在centos7环境部署docker

1. 开始安装

设置阿里源docker
[root@docker ~]# cd /etc/yum.repos.d/
[root@docker /etc/yum.repos.d]# vim docker.repo
[docker]
name=docker
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable
enabled=1
gpgcheck=0

[root@docker ~]# yum install -y docker-ce
	ce	社区版
	ee	企业版

[root@docker ~]# systemctl start docker
[root@docker ~]# systemctl enable docker

[root@docker ~]# docker version

2. 使用docker

(1)镜像管理

搜索:

[root@docker ~]# docker search centos
NAME		[仓库名/]镜像名称
DESCRIPTION	描述
STARS		下载的次数
OFFICIAL	是不是官方的
AUTOMATED	是不是支持自动下载
	在gocker hub上下载镜像,下载官方镜像+下载次数多的

下载:

docker pull 镜像名称
[root@docker ~]# docker pull centos

[root@docker ~]# lftp 172.16.0.99
lftp 172.16.0.99:~> cd Docker-images/
lftp 172.16.0.99:/Docker-images> get centos7.tar.xz centos6.tar.xz nginx.tar.xz 

[root@docker ~]# unxz centos6.tar.xz 
[root@docker ~]# unxz centos7.tar.xz 
[root@docker ~]# unxz nginx.tar.xz 

导入镜像:

[root@docker ~]# docker load < centos6.tar 
[root@docker ~]# docker load < centos7.tar
[root@docker ~]# docker load < nginx.tar

查看镜像:

[root@docker ~]# docker images
REPOSITORY       TAG           IMAGE ID         CREATED        SIZE
[仓库名/]名字	     标签			ID号			创建时间			大小

删除镜像:

[root@docker ~]# docker rmi 881bd08c0b08(镜像ID)

(2)容器管理

查看

[root@docker ~]# docker ps
	== virsh list
CONTAINER ID	容器ID
IMAGE			用哪个镜像启动的
COMMAND			启动的命令
CREATED			创建时间
STATUS			状态
PORTS			端口
NAMES			名字,可以自定义,如果不自定义,随机分配

[root@docker ~]# docker ps -a
	== virsh list --all

[root@docker ~]# docker ps -q
	查看正在运行的容器ID

启动

1)直接在容器中执行一个命令

[root@docker ~]# docker run centos echo "hello world"
hello world
[root@docker ~]# docker run centos ls /

2)启动容器时指定容器的名字,并且给容器打开一个虚拟终端
							  自定义名称   镜像名称/ID字符
[root@docker ~]# docker run --name myC1 -it centos /bin/bash
[root@ce2b1ac04738 /]# 
	--name	指定命令
	-i	打开标准输入
	-t	给容器分派一个虚拟终端

[root@ce2b1ac04738 /]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 

连接

当连接处于退出状态的容器

[root@docker ~]# docker start myC1
	启动处于退出状态的容器
1)attach
类似于 virsh console   只允许一个终端可以连接。开多了也是那一个
[root@docker ~]# docker attach myC1
[root@ce2b1ac04738 /]# ls

只有一个终端可以连接,并且退出后容器处于退出状态。
2)nsenter (重点) (可脚本运行)
[root@docker ~]# docker start myC1

[root@docker ~]# docker inspect -f "{{.State.Pid}}" myC1
2612
	获取容器ID

[root@docker ~]# nsenter -t 2612 -m -u -i -n -p   <---(选项参考附录部分,在文章末尾)
	连接容器

[root@docker ~]# nsenter -h
 -t, --target <pid>     target process to get namespaces from
 -m, --mount[=<file>]   enter mount namespace
	给容器“进程”提供一个特定的目录
 -u, --uts[=<file>]     enter UTS namespace (hostname etc)
	给容器提供独立的主机名和域名(名字随机分配的,每次启动都不一样,改不了)
 -i, --ipc[=<file>]     enter System V IPC namespace
	进程间通信
 -n, --net[=<file>]     enter network namespace
	网络
 -p, --pid[=<file>]     enter pid namespace
	进程号

连接脚本化:
[root@docker ~]# vim Concent_Container.sh
#!/bin/bash
#连接一个启动的容器

Cname="$1"
if [ $# -ne 1 ]
    then
    echo "参数不唯一."
    exit 1
fi
docker ps | grep "\<$Cname\>" &> /dev/null
if [ $? -ne 0 ]
    then
    echo "$Cname未运行."
    exit 2
fi

Cpid=$(docker inspect -f "{{.State.Pid}}" $Cname )
/usr/bin/nsenter -t $Cpid -m -u -i -n -p

[root@docker ~]# ln Concent_Container.sh /bin/CC
[root@docker ~]# CC myC1
[root@ce2b1ac04738 /]#
3)exec (备用启动方案)
跟docker run不一样,这个相当于连接并执行一条命令
[root@docker ~]# docker exec myC1 ls /
	让容器直接执行一个命令	

[root@docker ~]# docker exec -it myC1 /bin/bash
[root@ce2b1ac04738 /]# 

删除

前提:容器是关闭的!!!
[root@docker ~]# docker rm gracious_haslett(容器名)
gracious_haslett
[root@docker ~]# docker rm e8eb40bc3f8a(容器ID)
e8eb40bc3f8a

停止容器:

停止正在运行的容器
[root@docker ~]# docker stop myC1

容器的访问:

  1. 应用访问
    容器带有应用服务,启动后可以直接访问到容器提供的服务。

问题: 不知道容器的IP?
解决:
将容器的服务的端口与宿主机的端口进行绑定。

[root@docker ~]# docker run --name myN1 -d -P nginx
	-d	让容器在后台运行
	-P	将容器的端口与宿主机的某个随机端口进行绑定

[root@docker ~]# docker ps
0.0.0.0:32768->80/tcp   myN1

[root@docker ~]# docker port myN1
80/tcp -> 0.0.0.0:32768

访问测试:
[root@centos7-bj ~]# curl 172.16.0.29:32768


[root@docker ~]# iptables -L -n -t nat
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:32768 to:172.17.0.2:80

启动的第一个容器,分到的IP是172.17.0.2,依次类推。

指定宿主机的端口与容器的端口进行映射:
-p 本机端口:容器端口
-p 本机IP:本机端口:容器端口
-p 本机IP::容器端口
上面3个,默认的协议是TCP 00
-p 本机端口:容器端口:udp
协议是UDP
-p 本机端口:容器端口 -p 本机端口:容器端口
可以进行多端口映射

[root@docker ~]# docker run --name myN2 -d -p 8000:80 nginx
[root@docker ~]# docker port myN2
80/tcp -> 0.0.0.0:8000

[root@docker ~]# docker run --name myN3 -d -p 172.16.0.29:8001:80 nginx
[root@docker ~]# docker port myN3
80/tcp -> 172.16.0.29:8001
	适用于本机直连公网,并有公网地址

[root@docker ~]# docker run --name myN4 -d -p 172.16.0.29::80 nginx
[root@docker ~]# docker port myN4
80/tcp -> 172.16.0.29:32769

										将nginx默认端口指定8002  也可以将随机22端口指定2222			
[root@docker ~]# docker run --name myN5 -d -p 8002:80 -p 2222:22 nginx
[root@docker ~]# docker port myN5
22/tcp -> 0.0.0.0:2222
80/tcp -> 0.0.0.0:8002

镜像的初始化:

(1)centos7镜像
(2)centos6镜像

配置网络:联网
不用配

主机名
不用配

/etc/hosts
不用配置

安装工具

同步时间
ntpdate不好使?

关闭selinux和防火墙
不用配置

同步时间

-v /etc/localtime:/etc/localtime:ro
创建容器的时候指定启动参数,挂载localtime文件到容器内,保证两者所采用的时区是一致的。

脚本化:批量销毁正在运行的容器

正常删除容器的方式:

[root@docker ~]# docker ps -q
	查看正在运行的容器ID

[root@docker ~]# docker kill $(docker ps -q)
	关闭正在运行的容器

[root@docker ~]# docker rm $(docker ps -a -q)
	删除正在运行的容器

脚本化删除容器的方式

[root@docker ~]# vim Delete_Container.sh
#!/bin/bash
# 删除当前所有的容器

docker kill $(docker ps -q)
docker rm $(docker ps -a -q)

[root@docker ~]# chmod +x Delete_Container.sh


[root@docker ~]# docker run -it centos /bin/bash

安装工具

yum install -y vim-enhanced net-tools ftp lftp wget ntpdate setuptool authconfig ntsysv acpid gpm
yum install -y openssh-server openssh-clients net-tool ftp lftp wget ntpdate 

配置SSH

在容器里面,配置ssh:

[root@184305c3a80b ssh]# vim sshd_config
	没改

[root@184305c3a80b ssh]# systemctl start sshd
Failed to get D-Bus connection: Operation not permitted
容器限制无法这样启动

生成需要的公钥和私钥:
[root@184305c3a80b ssh]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
[root@184305c3a80b ssh]# ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
[root@184305c3a80b ssh]# ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''

[root@184305c3a80b ssh]# /usr/sbin/sshd -D &
	启动sshd

[root@184305c3a80b ~]# netstat -antp | grep sshd
tcp    0      0 0.0.0.0:22    0.0.0.0:*    LISTEN      126/sshd
tcp6   0      0 :::22         :::*         LISTEN      126/sshd 

[root@184305c3a80b ~]# passwd

可以通过另一个虚拟机连接,暂时不能通过X-shell直接连接
[root@docker /proc]# ssh [email protected] 
[email protected]'s password: 
Last failed login: Tue Jan  7 11:26:53 UTC 2020 from gateway on ssh:notty
There were 3 failed login attempts since the last successful login.
[root@184305c3a80b ~]# 

[root@184305c3a80b ~]# exit

[root@docker ~]# docker ps -a

停止容器,下边做镜像
[root@docker ~]# docker stop exciting_jang

提交成镜像

将容器提交成镜像:

[root@docker ~]# docker commit -m "centos7 install ssh" 184305c3a80b centos7:ssh
-m 对镜像的描述


[root@docker ~]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
centos7                ssh                 938f23c835af        6 seconds ago       407MB

使用镜像:
	后台运行	-d
	指定名字	--name
	指定时区	-v 
	启动sshd	/usr/sbin/sshd -D
	端口映射	-p 2220:22

							后台运行   新名字  同步时间方式						    映射端口号    镜像名字:标签	后台运行
[root@docker ~]# docker run -d --name myC1 -v /etc/localtime:/etc/localtime:ro -p 2221:22 centos7:ssh /usr/sbin/sshd -D

连接:

在虚拟连接方法
[root@centos7-bj ~]# ssh -p 2221 [email protected]

直接用xshell连接方法
[c:\~]$ ssh [email protected] 2221

查看日期是否同步
[root@7db933341b1b ~]# date
Tue Jan  7 16:30:58 CST 2020

前台启动各项服务

模板机
centos7:ssh
–> nginx
–> tomcat
–> mysql 练习 rpm包mariadb

必须的要求:
如果要容器在启动的时候就提供服务,那么要求进程必须处于前台运行。
在容器中,只有进程号1在运行时,服务才会正常运行。

[root@docker ~]# docker run -d --name myC1 -v /etc/localtime:/etc/localtime:ro -p 2221:22 centos7:ssh /usr/sbin/sshd -D
[root@docker ~]# docker run -d --name myC2 -v /etc/localtime:/etc/localtime:ro -p 2222:22 centos7:ssh /usr/sbin/sshd -D
[root@docker ~]# docker run -d --name myC3 -v /etc/localtime:/etc/localtime:ro -p 2223:22 centos7:ssh /usr/sbin/sshd -D

[c:\~]$ ssh [email protected] 2221	安装nginx
[c:\~]$ ssh [email protected] 2222	安装tomcat
[c:\~]$ ssh [email protected] 2223	安装mariadb
	yum install -y mariadb-server

前台Nginx

将nginx的服务启动置于前台:

[root@59f26eeb32cd ~]# cd /usr/local/nginx/
[root@59f26eeb32cd nginx]# vim conf/nginx.conf
user  www;
worker_processes  1;
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;
pid        logs/nginx.pid;

daemon off;	#<--将nginx的进程置于前台

events {
    worker_connections  1024;
    use epoll;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;
    sendfile        on;
    tcp_nopush     on;
    keepalive_timeout  65;
    gzip  on;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        #error_page  404              /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

[root@59f26eeb32cd nginx]# ./sbin/nginx -s stop
[root@59f26eeb32cd nginx]# ./sbin/nginx 
	终端没有释放,进程在前台

前台启动tomcat:

/opt/apache-tomcat-8.0.50/bin/catalina.sh run	(此方法启动镜像时无效)

mariadb不可以。

制作二代模板机

[root@docker ~]# docker stop myC1
[root@docker ~]# docker stop myC2
[root@docker ~]# docker stop myC3

保存成镜像:

									描述					镜像ID		镜像名
[root@docker ~]# docker commit -m "install nginx_tar" 59f26eeb32cd centos7:nginx
[root@docker ~]# docker commit -m "install tomcat8" db2ab3209f5c centos7:tomcat8
[root@docker ~]# docker commit -m "install mariadb_rpm" 34a20cebce7c centos7:mariadb 

[root@docker ~]# docker images

启动测试:

nginx

[root@docker ~]# docker run -d --name myN1 -v /etc/localtime:/etc/localtime:ro -p 8000:80 centos7:nginx /usr/local/nginx/sbin/nginx

浏览器访问:http://172.16.0.29:8000/

tomcat 暂时还只能进容器启动才可以用

[root@docker ~]# docker run -d --name myT1 -v /etc/localtime:/etc/localtime:ro -p 8081:8080 -p 2221:22 centos7:tomcat8 /usr/sbin/sshd -D

[c:\~]$ ssh [email protected] 2221
[root@c5a4891c896e ~]# startup.sh

浏览器访问:http://172.16.0.29:8081/

mariadb
yum install -y mariadb-server
systemctl start mariadb
第一次启动,进行初始化操作 /var/lib/mysql 若干数据库和文件等
手动初始化和启动服务?
数据的保存,在容器中是不保存数据?

[root@docker ~]# docker run -d --name myM1 -v /etc/localtime:/etc/localtime:ro -p 3306:3306 -p 2224:22 centos7:mysql57 /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql

容器的网络管理:

查看docker的默认网络类型

[root@docker ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1d202ba4f61e        bridge              bridge              local
9789d9ece2ef        host                host                local
5886f53e4381        none                null                local

bridge:默认的,== kvm’s virbr0 NAT模式
网卡 docker0 172.17.0.1
容器的IP分配,从172.17.0.2开始

host:没有自己的网络环境,使用的是宿主机的IP和端口
none:不给容器配置网络

给容器做一个网桥:
桥接模式,给容器绑定一个172.16.0.0/16地址。

[root@docker ~]# yum install -y bridge-utils

[root@docker /etc/sysconfig/network-scripts]# cp ifcfg-ens32 ifcfg-br0

[root@docker /etc/sysconfig/network-scripts]# vim ifcfg-ens32
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens32
DEVICE=ens32
ONBOOT=yes
BRIDGE=br0

[root@docker /etc/sysconfig/network-scripts]# vim ifcfg-br0
TYPE=Bridge
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=172.16.0.29
NETMASK=255.255.0.0
GATEWAY=172.16.0.254
DNS1=211.137.32.178
DNS2=202.96.64.68

[root@docker ~]# /etc/init.d/network restart

[root@docker ~]# ifconfig br0
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.0.29

[root@docker ~]# vim /etc/sysconfig/docker
other_args="-b=br0"

[root@docker ~]# systemctl restart docker

安装网络管道 pipenetwork

[root@docker ~]# lftp 172.16.0.99
lftp 172.16.0.99:~> cd tar          
cd ok, cwd=/tar                     
lftp 172.16.0.99:/tar> get master.zip 

[root@docker ~]# yum install -y unzip

[root@docker ~]# unzip master.zip

[root@docker ~/pipework-master]# cp -a pipework /bin/     <---a 保留文件属性  拷贝pipework 命令,到/bin下

启动容器:

[root@docker ~]# docker run -d --name myC1 --net=none -p 2221:22 centos7:ssh /usr/sbin/sshd -D

使用pipenetwork绑定IP:

[root@docker ~]# pipework br0 myC1 172.16.0.231/[email protected]

[c:\~]$ ssh [email protected]

思考:
批量创建容器的脚本?

[root@docker ~]# vim Create_Container.sh

指定容器名字
	--name
后台运行
	-d
指定时区同步
	-v /etc/localtime:/etc/localtime:ro	
指定网络配置
	--net=none
[root@docker ~]# vim Container_file
myC1    172.16.0.231
myC2    172.16.0.232
myC3    172.16.0.233
myC4    172.16.0.234
myC5    172.16.0.235
myC6    172.16.0.236

[root@docker ~]# vim Create_Container.sh
#!/bin/bash
#批量创建容器

image="centos7:ssh"
GW="172.16.0.254"
dir=`pwd`
file="${dir}/Container_file"
while read line
do
    Cname=$(echo $line | awk '{print $1}')
      Cip=$(echo $line | awk '{print $2}')
    docker ps -a | grep $Cname &> /dev/null
    if [ $? -eq 0 ]
        then
        echo "$Cname已存在."
        continue
    else
#docker run -d --name $Cname --net=none -v /etc/localtime:/etc/localtime:ro $image /usr/sbin/sshd -D
        ping -W 1 -c 1 $Cip &> /dev/null
        if [ $? -eq 0 ]
            then
            echo "$Cip已经使用."
            continue
        else
docker run -d --name $Cname --net=none -v /etc/localtime:/etc/localtime:ro $image /usr/sbin/sshd -D &> /dev/null && echo "create $Cname success."
            pipework br0 $Cname ${Cip}/16@${GW}
        fi
    fi
done < $file
sleep 3
docker ps -a

[root@docker ~]# vim createdocker_images.sh   <---自己写的
#!/bin/bash
# 一键创建指定数量的容器
read -p "请输入需要创建的容器数量:" num

if [ ${num} -gt 0 ]
    then
    for ((i=1;i<=${num};i++))
        do
            docker run -d --name myD${i} -v /etc/localtime:/etc/localtime:ro -p 222${i}:22 centos:ssh /usr/sbin/sshd -D
    done
fi

容器的数据管理:

容器 可写,不保存数据
镜像 不可写
内核

容器想要将数据保存下来,需要提交成为镜像。
但是不能每次都提交镜像,所以需要实现持久化保存数据该怎么做呢?

在容器中,想要将数据实现持久化的保存,需要将

(1)将宿主机的目录挂载到容器中

[root@docker ~]# docker run -d --name myN1 -v /data centos7:nginx


[root@docker ~]# CC myN1
[root@80f9554af848 /]# df -h
/dev/mapper/centos-root   20G  7.7G   13G  39% /data

[root@80f9554af848 /]# cd /data/
[root@80f9554af848 data]# ls
[root@80f9554af848 data]# touch file_xxs

文件在宿主机的保存位置:
[root@docker ~]# find / -name file_xxs -type f
/var/lib/docker/volumes/ce1230db5df528b0fad59fc417dff80867fbd0ecd7c00f75be6e25276f3d83d8/_data/file_xxs

(2)指定宿主机的目录,将其挂载到容器中

构建一个2层的目录树:
1)LV共享使用(可以创建存储,自己做实验)
2)LV单独使用
底层的raid用哪种级别,根据实际数据(完整性、一致性;还是速度)决定

首先创建目录树
[root@docker ~]# mkdir -p /data/myN{1,2,3}

[root@docker ~]# tree /data/
/data/
├── myN1
├── myN2
└── myN3
											将本地存储(/data/myN1)和容器(/data)关联
[root@docker ~]# docker run -d --name myN1 -v /data/myN1:/data centos7:nginx

[root@docker ~]# CC myN1			<---连接容器
[root@ad98c1b82a56 /]# cd /data/			<---进入data目录
[root@ad98c1b82a56 data]# ls				
[root@ad98c1b82a56 data]# touch file1			<---任意创建一个文件

到本地虚拟机
[root@docker ~]# cd /data/myN1/			<---进入对应容器的目录
[root@docker /data/myN1]# ls				<---文件在这里也能看到
file1
									将本地存储(/data/myN2)和nginx容器html做关联
[root@docker ~]# docker run -d --name myN2 -v /data/myN2:/usr/local/nginx/html centos7:nginx /usr/local/nginx/sbin/nginx

[root@docker ~]# CC myN2

[root@7a6c099b914a ~]# netstat -antp | grep nginx
tcp        0      0 0.0.0.0:80      0.0.0.0:*     LISTEN      1/nginx

[root@docker /data/myN2]# echo "myN2" > index.html 		<---创建页面文件,由于没有做端口映射,无法从本地访问,不做页面访问测试,只是对存储进行查看测试

[root@7a6c099b914a ~]# cd /usr/local/nginx/html/
[root@7a6c099b914a html]# ls
index.html
[root@7a6c099b914a html]# cat index.html 
myN2
																		将本地存储(/data/myN3)和nginx容器html做关联		并且设置网络				
[root@docker ~]# docker run -d --name myN3 -v /etc/localtime:/etc/localtime:ro -v /data/myN3:/usr/local/nginx/html --net=none centos7:nginx /usr/local/nginx/sbin/nginx
					设置网络	桥接模式
[root@docker ~]# pipework br0 myN3 172.16.0.221/[email protected]

[root@docker /data/myN3]# echo "myN3" > index.html

[root@docker ~]# curl 172.16.0.221		<---可以访问
myN3

(3)在容器之间,使用同一个宿主机的目录

[root@docker ~]# docker stop myN3

[root@docker ~]# docker run -d --name myN4 --volumes-from myN3 centos7:nginx 

[root@docker ~]# CC myN4
[root@1942dc2cb18b /]# cd /usr/local/nginx/html/
[root@1942dc2cb18b html]# ls
index.html

[root@docker ~]# docker start myN3

[root@docker ~]# docker run -d --name myN5 --volumes-from myN3 centos7:nginx 
[root@docker ~]# CC myN5
[root@83f465b9345c /]# cd /usr/local/nginx/html/
[root@83f465b9345c html]# ls
index.html

使用Dockerfile构建镜像:

准备工作:

创建dockerfile目录
[root@docker ~]# mkdir /opt/dockerfile
进入dockerfile工作路径
[root@docker ~]# cd /opt/dockerfile/

编写一键构建脚本

[root@docker /opt/dockerfile]# vim Dockerfile
# create nginx_rpm image
# use centos7:ssh
FROM centos7:ssh
MAINTAINER [email protected]
RUN rpm -i https://mirrors.aliyun.com/epel/7/x86_64/Packages/e/epel-release-7-12.noarch.rpm
RUN yum install -y nginx
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
ADD index.html /usr/share/nginx/html/index.html
EXPOSE 80
	##开启端口
CMD "nginx"
	##启动容器时执行的命令
ENV TZ=Asia/Shanghai
	##类似在shell脚本定义变量
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
	##同步时间和时区
[root@docker /opt/dockerfile]# echo nginx_test > index.html

[root@docker /opt/dockerfile]# docker build -t centos7:nginx_rpm .

[root@docker ~]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
centos7                nginx_rpm           1886ee55894e        2 minutes ago       608MB

镜像的导入和导出:

(1)导入

[root@docker ~]# docker load < centos7.tar	

(2)导出

[root@docker ~]# docker save -o centos7_nginx_tar centos7:nginx

查看容器的连接数:

[root@docker ~]# vim Count_Container.sh
#!/bin/bash
#统计容器的连接数
# use nsenter

Cname="$1"
if [ $# -ne 1 ]
    then
    echo "无效的参数."
    exit 1
fi
docker ps | grep $Cname &> /dev/null
if [ $? -ne 0 ]
    then
    echo "$Cname未运行."
    exit 2
fi
Cpid=$(docker inspect -f "{{.State.Pid}}" $Cname )
Ccount=$(nsenter -t $Cpid -n netstat | grep -c "ESTABLISHED")

echo "${Cname}的连接数是${Ccount}."

问题参考

nsenter命令介绍:

nsenter [options] [program [arguments]]

options:
-t, --target pid:指定被进入命名空间的目标进程的pid
-m, --mount[=file]:进入mount命令空间。如果指定了file,则进入file的命令空间
-u, --uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间
-i, --ipc[=file]:进入ipc命令空间。如果指定了file,则进入file的命令空间
-n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间
-p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间
-U, --user[=file]:进入user命令空间。如果指定了file,则进入file的命令空间
-G, --setgid gid:设置运行程序的gid
-S, --setuid uid:设置运行程序的uid
-r, --root[=directory]:设置根目录
-w, --wd[=directory]:设置工作目录

删除镜像,会报错
Error response from daemon: conflict: unable to delete f8ab12e03d53 (must be forced) - image is referenced in multiple repositories

删除时可以用repository和tag的方式来删除
docker rmi centos7:ssh

为了实现多docker镜像的分布状态,可以使用k8s

发布了57 篇原创文章 · 获赞 3 · 访问量 982

猜你喜欢

转载自blog.csdn.net/weixin_42502744/article/details/103868907