Docker
Docker 是开源的应用容器引擎。Docker 可以让你将所有应用软件以及它的以来打包成软件开发的标准化单元。Docker 是一种“容器即服务”(Docker Containers as a Service ,简称 CaaS),使得开发和IT运营团队可以对于应用的构建、发布、运行更加敏捷和可控。Docker 容器将软件以及它运行安装所需的一切文件(代码、运行时、系统工具、系统库)打包到一起...
Docker 是开源的应用容器引擎。
Docker 可以让你将所有应用软件以及它的以来打包成软件开发的标准化单元。
Docker 是一种“容器即服务”(Docker Containers as a Service ,简称 CaaS),使得开发和IT运营团队可以对于应用的构建、发布、运行更加敏捷和可控。
Docker 容器将软件以及它运行安装所需的一切文件(代码、运行时、系统工具、系统库)打包到一起,这就保证了不管是在什么样的运行环境,总是能以相同的方式运行。就好像 Java 虚拟机一样,“一次编写,到处运行,而 Docker 是“一次构建,到处运行。
即服务:任何时候使用,都可以;用就付费,不用就不付费。
IaaS:基础设施即服务
PaaS:平台即服务
SaaS:服务即服务
虚拟机,类似于“子电脑”:
在“子电脑”里,你可以和正常电脑一样运行程序,例如开QQ。如果你愿意,你可以变出好几个“子电脑”,里面都开上QQ。“子电脑”和“子电脑”之间,是相互隔离的,互不影响。
虚拟机属于虚拟化技术。
而Docker这样的容器技术,也是虚拟化技术,属于轻量级的虚拟化。
虚拟机虽然可以隔离出很多“子电脑”,但占用空间更大,启动更慢,虚拟机软件可能还要花钱(例如VMWare)。
而容器技术恰好没有这些缺点。它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境(类似“沙箱”)。
它启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个Docker容器)。此外,它占的空间很小,虚拟机一般要几GB到几十GB的空间,而容器只需要MB级甚至KB级。
docker启动:docker有镜像和容器,镜像是不能修改的,但是镜像启动后变为容器,就可以修改了,然后做出的修改后可以再存储成镜像。
注意:生成这个新的镜像后旧的镜像也不能删除,因为新镜像会依赖旧镜像。
首先明确几点:
1、docker镜像启动成容器,镜像不可改,容器可改。
2、docker的容器就是个进程。不能保存数据,进程杀死就会丢失数据。
3、docker要相保存数据就要存成镜像或者挂载在宿主机上。
CentOS7 环境使用docker:
1、准备yum源:
[root@docker 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
或者直接在阿里云上根据教程下载源。
2、直接安装:
有了源就可以直接yum安装了
[root@docker ~]# yum install -y docker-ce
ce 社区版
ee 企业版
安装时可能报的错误汇总:https://blog.csdn.net/n_u_l_l_/article/details/103871756
然后直接启动就好了:
[root@docker ~]# systemctl restart docker
[root@docker ~]# systemctl enable docker
查看版本
[root@docker ~]# docker version
使用docker
【1】镜像管理
搜索可用的镜像
[root@docker ~]# docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 5756 [OK]
ansible/centos7-ansible Ansible on Centos7 126 [OK]
NAME [仓库名/]镜像名称
DESCRIPTION 描述
STARS 下载的次数
OFFICIAL 是不是官方的
AUTOMATED 是不是支持自动下载
在gocker hub上下载镜像,下载官方镜像+下载次数多的
下载:
[root@docker ~]# docker pull centos
我已经准备了几个镜像:
[root@docker ~]# ls
anaconda-ks.cfg centos6.tar centos7.tar nginx.tar
解压
[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
nginx latest 881bd08c0b08 10 months ago 109MB
centos latest 1e1148e4cc2c 13 months ago 202MB
lemonbar/centos6-ssh latest efd998bd6817 5 years ago 297MB
REPOSITORY 仓库名称
TAG 标签
IMAGE ID 镜像ID
CREATED 创建时间
SIZE 大小
删除镜像:
[root@docker ~]# docker rmi 881bd08c0b08(镜像ID)
【2】容器管理
因为docker的容器是根据进程来计算的,所以查看类似于查看进程来查看容器。
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
CONTAINER ID 容器ID
IMAGE 用哪个镜像启动的
COMMAND 启动的命令
CREATED 创建时间
STATUS 状态
PORTS 端口
NAMES 名字,可以自定义,如果不自定义,随机分配
类似于KVM中的--virsh list
查看所有容器
[root@docker ~]# docker ps -a
类似 KVM 中的 virsh list --all
启动容器:
1、直接运行命令
[root@docker ~]# docker run centos ls /
docker run 关键字
centos 容器名字
ls / 命令
[root@docker ~]# docker run centos ls /tmp
ks-script-h2MyUP
yum.log
[root@docker ~]# ls /tmp
systemd-private-9b5bf96e274a4a59b50de509a25d29b2-vgauthd.service-Hy31i6
systemd-private-9b5bf96e274a4a59b50de509a25d29b2-vmtoolsd.service-XWFAVu
2、启动容器时指定容器的名字,并且给容器打开一个虚拟终端
[root@docker ~]# docker run --name mytty1 -it centos /bin/bash
--name 指定命令 如果不指定名字会随机创建一个名字
-i 打开标准输入
-t 给容器分派一个虚拟终端
[root@5d7f4a0d0201 /]#
推出终端
[root@5d7f4a0d0201 /]# exit
exit
退出终端后发现再进进不去了,这时查看docker状态
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5d7f4a0d0201 centos "/bin/bash" 2 minutes ago Exited (0) 48 seconds ago mytty1
这个终端是未启用的状态,退出自动关闭容器。
如果想再次连接的话就要启动容器
启动容器:
[root@docker ~]# docker start mytty1
mytty1
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5d7f4a0d0201 centos "/bin/bash" 3 minutes ago Up 4 seconds mytty1
其实这时可以查进程,ps -ef | grep docker
就可以看到启动的容器了
连接容器有3种方式:
1、attach
类似KVM
的virsh console
[root@docker ~]# docker attach mytty1
[root@5d7f4a0d0201 /]#
这个连接方式只能创建1 个终端,哪怕开两个也会发现这两个容器是同步的。并且退出后容器处于退出状态。
2、nsenter
先拿到它的PID
[root@docker ~]# docker inspect -f "{{.State.Pid}}" mytty1
12674
[root@docker ~]# nsenter -t 12674 -m -u -i -n -p
-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 mytty1
3、exec
[root@docker ~]# docker exec myC1 ls /
让容器直接执行一个命令
[root@docker ~]# docker exec -it myC1 /bin/bash
[root@ce2b1ac04738 /]#
停止容器:
[root@docker ~]# docker stop mytty1
删除容器:
删除容器的前提是容器已经停止了。
[root@docker ~]# docker rm mytty1
mytty1
可以根据名字和ID删除
容器的访问
1、应用的访问:
容器启动的服务可以被外边直接访问到。
因为不知道容器的IP所以要和宿主机进行端口绑定。
[root@docker ~]# docker run --name mytty2 -d -P nginx
-d 让容器在后台运行
-P 将容器的端口与宿主机的某个随机端口进行绑定
nginx镜像名字
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ad8af231d06 nginx "nginx -g 'daemon of…" 59 seconds ago Up 58 seconds 0.0.0.0:32769->80/tcp mytty2
dc3108379ede centos "/bin/bash" 10 minutes ago Up 10 minutes mytty1
可以看到mytty2的80 和 32769 端口绑定了。
[root@docker ~]# iptables -L -n -t nat
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:32769 to:172.17.0.3:80
可以看到是做了DNAT来实现的
浏览器访问宿主机IP+32769端口,看到nginx测试页
启动的第一个容器,分到的IP是172.17.0.2,依次类推,我的是第二个就是0.3。
172.17.0.1在宿主机上
[root@docker ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
指定宿主机的端口与容器的端口进行映射:
-p 本机端口:容器端口
-p 本机IP:本机端口:容器端口
-p 本机IP::容器端口
上面3个,默认的协议是TCP
-p 本机端口:容器端口/udp
协议是UDP
-p 本机端口:容器端口 -p 本机端口:容器端口
可以进行多端口映射
[root@docker ~]# docker run --name mynginx1 -d -p 8000:80 nginx
[root@docker ~]# docker run --name mynginx2 -d -p 172.16.12.137:8001:80 nginx
[root@docker ~]# docker run --name mynginx3 -d -p 172.16.12.137::80 nginx
[root@docker ~]# docker run --name mynginx4 -d -p 8003:80/udp nginx
[root@docker ~]# docker run --name mynginx5 -d -p 8004:80 -p 8005:80 nginx
查看状态:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7eb2b1680fdf nginx "nginx -g 'daemon of…" 5 seconds ago Up 4 seconds 0.0.0.0:8004->80/tcp, 0.0.0.0:8005->80/tcp mynginx5
3c6370b79072 nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 80/tcp, 0.0.0.0:8003->80/udp mynginx4
91a4c97d182b nginx "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 172.16.12.137:32768->80/tcp mynginx3
87894411fad5 nginx "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 172.16.12.137:8001->80/tcp mynginx2
c91f6f52610e nginx "nginx -g 'daemon of…" 9 minutes ago Up 9 minutes 0.0.0.0:8000->80/tcp mynginx1
5ad8af231d06 nginx "nginx -g 'daemon of…" 17 minutes ago Up 17 minutes 0.0.0.0:32769->80/tcp mytty2
注:
镜像的初始化:
centos7镜像
centos6镜像
配置网络:联网
不用配,自动的
主机名
不用配,不能改
/etc/hosts
不用配置,不用改
安装工具
同步时间
ntpdate不好使?
-v /etc/localtime:/etc/localtime:ro
创建容器的时候指定启动参数,挂载localtime文件到容器内,保证两者所采用的时区是一致的。
关闭selinux和防火墙
不用配置,没有
查看正在运行的容器ID
[root@docker ~]# docker ps -q
关闭正在运行的容器
[root@docker ~]# docker kill $(docker ps -q)
删除正在运行的容器
[root@docker ~]# docker rm $(docker ps -a -q)
脚本批量删除容器:
#!/bin/bash
# 删除当前所有的容器
docker kill $(docker ps -q)
docker rm $(docker ps -a -q)
容器里配置SSH
准备个容器:
[root@docker ~]# docker run --name mytty3 -it centos /bin/bash
安装软件
[root@3cff617e5ff2 /]# yum install vim-enhanced net-tools ftp lftp wget ntpdate setuptool authconfig ntsysv acpid gpm openssh-server openssh-clients net-tool ftp lftp wget ntpdate -y
启动sshd报错:
[root@3cff617e5ff2 /]# systemctl restart sshd
Failed to get D-Bus connection: Operation not permitted
生成需要的公钥和私钥:
[root@3cff617e5ff2 /]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
[root@3cff617e5ff2 /]# ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
[root@3cff617e5ff2 /]# ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''
启动服务:
[root@3cff617e5ff2 /]# /usr/sbin/sshd -D &
[root@3cff617e5ff2 /]# netstat -antlup | grep sshd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 193/sshd
tcp6 0 0 :::22 :::* LISTEN 193/sshd
这时在宿主机
已经可以ssh连接容器了。
[root@docker yum.repos.d]# ssh 172.17.0.9
The authenticity of host '172.17.0.9 (172.17.0.9)' can't be established.
ECDSA key fingerprint is SHA256:pf1D4zHWlKwzmp+qP49vXf5xKtuSXDrdZwD07D++zxA.
ECDSA key fingerprint is MD5:9c:b7:78:e3:a5:bb:2c:15:4b:ac:cc:aa:9b:2f:00:17.
Are you sure you want to continue connecting (yes/no)? no
Host key verification failed.
但是不知道密码,所以要设置密码:passwd
命令
提交镜像:
先关闭容器然后提交镜像
[root@docker ~]# docker commit -m "centos7 install ssh and init" 3cff617e5ff2 c7ssh:ssh
sha256:9dcc677b706a54d57e77d7ba4dfab8f0776111a20d8bbcd82e820c914e0371a9
-m 描述
c7ssh 名字
ssh 标签 TAG
名字要是小写的
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
c7ssh ssh 9dcc677b706a About a minute ago 407MB
启动镜像–创建容器
[root@docker ~]# docker run -d --name myC7ssh1 -v /etc/localtime:/etc/localtime:ro -p 2333:22 c7ssh:ssh /usr/sbin/sshd -D
2c7e14cd6a232fd57f35e6b0b77cb1bf1d904f735c21c9f7377dbeaa7869834c
连接容器:
xshell:
[C:\~]$ ssh root@172.16.12.137 2333
虚拟机:
[root@varnish ~]# ssh -p 2333 root@172.16.12.137
访问的是宿主机IP加绑定的端口。
查时间:
[root@2c7e14cd6a23 ~]# date
Wed Jan 8 03:38:04 CST 2020
和宿主机是一样的。
容器启动服务:
centos7:ssh
--> nginx
--> tomcat
--> mysql
必须的要求:
如果要容器在启动的时候就提供服务,那么要求进程必须处于前台运行。
在容器中,只有进程号1在运行时,服务才会正常运行。
[root@docker ~]# docker run -d --name c7nginx /etc/localtime:/etc/localtime:ro -p 2333:22 centos7:ssh /usr/sbin/sshd -D
[root@docker ~]# docker run -d --name c7tomcat /etc/localtime:/etc/localtime:ro -p 2444:22 centos7:ssh /usr/sbin/sshd -D
[root@docker ~]# docker run -d --name c7mysql /etc/localtime:/etc/localtime:ro -p 2444:22 centos7:ssh /usr/sbin/sshd -D
[c:\~]$ ssh root@172.16.12.137 2333 安装nginx
[c:\~]$ ssh root@172.16.12.137 2444 安装tomcat
[c:\~]$ ssh root@172.16.12.137 2555 安装mariadb
将nginx的服务启动置于前台:
[root@59f26eeb32cd ~]# cd /usr/local/nginx/
[root@59f26eeb32cd nginx]# vim conf/nginx.conf
user www;
worker_processes 1;
...
pid logs/nginx.pid;
daemon off; <--将nginx的进程置于前台
events {
worker_connections 1024;
use epoll;
}
...
[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 c7nginx
[root@docker ~]# docker stop c7tomcat
[root@docker ~]# docker stop c7mysql
保存:
[root@docker ~]# docker commit -m "install nginx_tar" 59f26eeb32cd c7nginx:nginx
[root@docker ~]# docker commit -m "install tomcat8" db2ab3209f5c c7tomcat:tomcat8
[root@docker ~]# docker commit -m "install mariadb_rpm" 34a20cebce7c c7mysql:mariadb
-m 描述
后边是名字和标签
[root@docker ~]# docker images
c7mysql mariadb b3837f714a1a 9 hours ago 625MB
c7tomcat tomcat bdc31d77375a 9 hours ago 859MB
c7nginx nginx d5d582a80c74 9 hours ago 684MB
启动测试:
nginx
创建容器是就启动服务
[root@docker ~]# docker run -d --name mynginx1 -v /etc/localtime:/etc/localtime:ro -p 8000:80 c7nginx:nginx /usr/local/nginx/sbin/nginx
浏览器访问:http://172.16.12.137:8000/
tomcat
创建容器,进入容器然后再启动服务
[root@docker ~]# docker run -d --name mytomcat -v /etc/localtime:/etc/localtime:ro -p 8081:8080 -p 2221:22 c7tomcat:tomcat8 /usr/sbin/sshd -D
[c:\~]$ ssh root@172.16.12.137 2221
[root@c5a4891c896e ~]# startup.sh
浏览器访问:http://172.16.12.137:8081/
mariadb
yum install -y mariadb-server
systemctl start mariadb
第一次启动,进行初始化操作 /var/lib/mysql 若干数据库和文件等
手动初始化和启动服务?
数据的保存,在容器中是不保存数据?
[root@docker ~]# docker run -d --name mymariadb1 -v /etc/localtime:/etc/localtime:ro -p 3306:3306 -p 2224:22 c7mysql:mysql57 /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql
容器的网络管理:
[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-ens33 ifcfg-br0
[root@docker /etc/sysconfig/network-scripts]# vim ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens33
DEVICE=ens33
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.12.137
NETMASK=255.255.0.0
GATEWAY=172.16.0.254
DNS1=8.8.8.8
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.12.137
[root@docker ~]# vim /etc/sysconfig/docker
other_args="-b=br0"
让所有容器走br0网桥而不是走docker0网桥。
然后重启docker
[root@docker ~]# systemctl restart docker
下载pipework-master
[root@docker pipework-master]# cp -a pipework /bin/
启动容器:
[root@docker ~]# docker run -d --name mytty4 --net=none -p 2221:22 c7ssh:ssh /usr/sbin/sshd -D
使用pipenetwork绑定IP:
[root@docker ~]# pipework br0 mytty4 172.16.12.222/16@172.16.0.254
IP子网@网关
然后xshell直连就好了,端口绑定就没啥用了
[c:\~]$ ssh root@172.16.12.222
批量创建容器的脚本
[root@docker ~]# vim Container_file
myC1 172.16.12.231
myC2 172.16.12.232
myC3 172.16.12.233
myC4 172.16.12.234
myC5 172.16.12.235
myC6 172.16.12.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
容器的数据管理:
容器 可写,不保存数据
镜像 不可写
内核
容器想要将数据保存下来,需要提交成为镜像。
在容器中,想要将数据实现持久化的保存,需要将
【1】将宿主机的目录挂载到容器中
[root@docker ~]# docker run -d --name mynginx1 -v /data c7nginx:nginx
[root@docker ~]# CC mynginx1
[root@80f9554af848 /]# df -h
/dev/mapper/centos-root 20G 7.7G 13G 39% /data
[root@80f9554af848 /]# cd /data/
这个就是创建容器时输入的那个/data
[root@80f9554af848 data]# ls
[root@80f9554af848 data]# touch file1
文件在宿主机的保存位置:
[root@docker ~]# find / -name file1 -type f
/var/lib/docker/volumes/ce1230db5df528b0fad59fc417dff80867fbd0ecd7c00f75be6e25276f3d83d8/_data/file1
【2】指定宿主机的目录,将其挂载到容器中
构建一个2层的目录树:
1)LV共享使用
2)LV单独使用
底层的raid用哪种级别,根据实际数据(完整性、一致性;还是速度)决定
[root@docker ~]# mkdir -p /data/mynginx{1,2,3}
[root@docker ~]# tree /data/
/data/
├── mynginx1
├── mynginx2
└── mynginx3
[root@docker ~]# docker run -d --name mynginx1 -v /data/mynginx1:/data c7nginx:nginx
[root@docker ~]# CC myN1
[root@ad98c1b82a56 /]# cd /data/
[root@ad98c1b82a56 data]# ls
[root@ad98c1b82a56 data]# touch file1
[root@docker ~]# cd /data/myN1/
[root@docker /data/myN1]# ls
file1
挂载到nginx的目录
[root@docker ~]# docker run -d --name mynginx2 -v /data/mynginx2:/usr/local/nginx/html c7nginx: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/mynginx2]# echo "/data/mynginx2--mynginx2" > index.html
[root@7a6c099b914a ~]# cd /usr/local/nginx/html/
[root@7a6c099b914a html]# ls
index.html
[root@7a6c099b914a html]# cat index.html
/data/mynginx2--mynginx2
[root@docker ~]# docker run -d --name mynginx3 -v /etc/localtime:/etc/localtime:ro -v /data/mynginx3:/usr/local/nginx/html --net=none c7nginx:nginx /usr/local/nginx/sbin/nginx
[root@docker ~]# pipework br0 mynginx3 172.16.12.221/16@172.16.0.254
[root@docker /data/mynginx3]# echo "mynginx3" > index.html
[root@docker ~]# curl 172.16.12.221
mynginx3
(3)在容器之间,使用同一个宿主机的目录
停掉3容器
[root@docker ~]# docker stop myN3
[root@docker ~]# docker run -d --name mynginx4 --volumes-from mynginx3 c7nginx:nginx
[root@docker ~]# CC mynginx4
[root@1942dc2cb18b /]# cd /usr/local/nginx/html/
[root@1942dc2cb18b html]# ls
index.html
[root@docker ~]# docker start mynginx3
[root@docker ~]# docker run -d --name mynginx5 --volumes-from mynginx3 c7nginx:nginx
[root@docker ~]# CC mynginx5
[root@83f465b9345c /]# cd /usr/local/nginx/html/
[root@83f465b9345c html]# ls
index.html
使用Dockerfile构建镜像:
[root@docker ~]# mkdir /opt/dockerfile
[root@docker ~]# cd /opt/dockerfile/
[root@docker /opt/dockerfile]# vim Dockerfile
# create nginx_rpm image
# use centos7:ssh
FROM centos7:ssh
MAINTAINER test@163.com 这个可省略
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]# docker build -t centos7:nginx_rpm .
用dockerfile自动创建镜像
[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
centos7_nginx_tar 这个就是镜像文件的名字,可以直接把这个文件拷走
查看容器的连接数:
[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}."
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)