虚拟化-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
容器的访问:
- 应用访问
容器带有应用服务,启动后可以直接访问到容器提供的服务。
问题: 不知道容器的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