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
类似KVMvirsh 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的8032769 端口绑定了。
[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}."
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐