1.容器

1.1什么是容器

容器是在隔离的环境中运行一个进程。
这个隔离的环境有自己的系统目录文件,有自己的ip地址,主机名等
容器是一种轻量级的虚拟化技术。

1.2容器的好处

1.容器能提供接近宿主机的性能,因为共用宿主机的内核。KVM由于需要模拟CPU,硬件资源,所以会会消耗部分资源。
2.同样硬件配置,宿主机最多启动10个虚拟机,但可以启动100+个容器。
3.启动KVM虚拟机,要完成整个Linux开机启动流程。启动容器不要要,直接启动服务,中间流程全部精简,只需要一秒钟就能启动。
4.KVM需要硬件CPU的支持,容器不需要。
5.KVM虚拟机每个有独立的操作系统,容器共用操作系统,共用内核。
linux开机启动流程:
bios开机硬件自检
根据bios设置的优先启动项
读取mbr引导
加载内核
启动第一个进程/sbin/init
执行系统初始化脚本/etc/rc.d/rc.sysinit完成系统初始化
运行想要的服务sshd

1.3容器的发展史

1)chroot技术
chroot,即change root directory(更改root目录),在linux操作系统中,系统默认以‘/’为根目录。
使用chroot后,系统的目录结构将会以指定的位置作为根目录。

2)lxc容器
全称:linux container,通过namespace命名空间实现资源隔离,cgroups实现资源的限制,提供类似虚拟机的体验。

3)docker容器
早期的docker容器底层就是调用lxc,后期才换成了libcontainer。

2 docker容器

2.1docker容器

Docker是通过内核虚拟化技术(namespace及cgroups)实现资源的隔离与资源限制。
由于Docker通过操作系统层的虚拟化实现隔离,对操作系统内核有要求,所以Docker容器运行时,不需要类似KVM额外的系统开销,因而比KVM虚拟机更轻量。

2.2docker理念

docker主要目标是"Build,Ship and Run any App,Angwhere",构建,运输,处处运行

构建:制作docker镜像,打包容器的所有系统目录文件
运输:下载docker镜像
运行:基于docker镜像提供的rootfs,启动容器

总结:只要能运行docker容器,那么docker镜像中已经安装好的软件也可以运行,所以说docker是一种软件的打包技术。

2.3docker优点

1:解决了操作系统和软件运行环境的依赖
nginx  openssl
git   openssl
2:对于开发人员来说,再也不用担心不会部署开发环境
3:开发环境,测试环境和生产环境高度一致。
4:让用户体验产品新特性的又一种思路。

2.4docker安装与启动

需要3.10的内核
[root@m03 ~]# cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core) 
[root@m03 ~]# uname -r
3.10.0-693.el7.x86_64
[root@m03 ~]# 

安装
yum install -y docker-io

启动docker
systemctl start docker
systemctl enable docker

查看状态
[root@m03 cgroup]# systemctl sta
start   status  
[root@m03 cgroup]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-08-27 11:15:12 CST; 1h 50min ago
     Docs: http://docs.docker.com
 Main PID: 1775 (dockerd-current)
   CGroup: /system.slice/docker.service
           ├─1775 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-cur...
           └─1781 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-cont...

Aug 27 11:15:11 m03 dockerd-current[1775]: time="2019-08-27T11:15:11.804737630+08:00" level=warning ...tem"
Aug 27 11:15:11 m03 dockerd-current[1775]: time="2019-08-27T11:15:11.845641952+08:00" level=info msg...nds"
Aug 27 11:15:11 m03 dockerd-current[1775]: time="2019-08-27T11:15:11.846422068+08:00" level=info msg...rt."
Aug 27 11:15:11 m03 dockerd-current[1775]: time="2019-08-27T11:15:11.945520598+08:00" level=info msg...lse"
Aug 27 11:15:12 m03 dockerd-current[1775]: time="2019-08-27T11:15:12.090572937+08:00" level=info msg...ess"
Aug 27 11:15:12 m03 dockerd-current[1775]: time="2019-08-27T11:15:12.158684880+08:00" level=info msg...ne."
Aug 27 11:15:12 m03 dockerd-current[1775]: time="2019-08-27T11:15:12.171561097+08:00" level=info msg...ion"
Aug 27 11:15:12 m03 dockerd-current[1775]: time="2019-08-27T11:15:12.171604104+08:00" level=info msg...13.1
Aug 27 11:15:12 m03 systemd[1]: Started Docker Application Container Engine.
Aug 27 11:15:12 m03 dockerd-current[1775]: time="2019-08-27T11:15:12.183700012+08:00" level=info msg...ock"
Hint: Some lines were ellipsized, use -l to show in full.

2.5docker的架构

docker最重要的三大组件:
镜像,容器,仓库

docker是一个cs架构:
通过docker version来查看

[root@m03 yum.repos.d]# docker version
Client:
 Version:         1.13.1
 API version:     1.26
 Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64
 Go version:      go1.10.3
 Git commit:      7f2769b/1.13.1
 Built:           Mon Aug  5 15:09:42 2019
 OS/Arch:         linux/amd64

Server:
 Version:         1.13.1
 API version:     1.26 (minimum version 1.12)
 Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64
 Go version:      go1.10.3
 Git commit:      7f2769b/1.13.1
 Built:           Mon Aug  5 15:09:42 2019
 OS/Arch:         linux/amd64
 Experimental:    false

2.6启动第一个Docker容器

配置docker镜像加速
vi /etc/docker/daemon.json
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

systemctl  restart docker

docker容器是一种软件的打包技术,接下来我们体验一下

传统编译安装nginx:
官网下载Nginx源码包wget  
tar解压源码包
创建Nginx用户 
安装依赖包
编译安装三部曲configure,make,make install
修改nginx配置文件
启动nginx

docker容器
docker run -d -p 80:80  nginx

run    (创建并运行一个容器)
-d        放在后台
-p        端口映射
nginx  docker镜像的名字

2.7docker镜像管理

2.7.1搜索镜像

[root@m03 ~]# docker search httpd
选镜像的建议:
1,优先考虑官方
2,starts数量多

[root@m03 ~]# docker search httpd
INDEX       NAME                                           DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/httpd                                The Apache HTTP Server Project                  2614      [OK]       
docker.io   docker.io/centos/httpd                                                                         24                   [OK]
docker.io   docker.io/centos/httpd-24-centos7              Platform for running Apache httpd 2.4 or b...   22                   
docker.io   docker.io/arm32v7/httpd                        The Apache HTTP Server Project                  8                    
docker.io   docker.io/armhf/httpd                          The Apache HTTP Server Project                  8                    
docker.io   docker.io/salim1983hoop/httpd24                Dockerfile running apache config                2                    [OK]
docker.io   docker.io/lead4good/httpd-fpm                  httpd server which connects via fcgi proxy...   1                    [OK]
docker.io   docker.io/rgielen/httpd-image-simple           Docker image for simple Apache httpd based...   1                    [OK]
docker.io   docker.io/alvistack/httpd                      Docker Image Packaging for Apache               0                    [OK]
docker.io   docker.io/amd64/httpd                          The Apache HTTP Server Project                  0                    
docker.io   docker.io/appertly/httpd                       Customized Apache HTTPD that uses a PHP-FP...   0                    [OK]
docker.io   docker.io/buzzardev/httpd                      Based on the official httpd image               0                    [OK]
docker.io   docker.io/dockerpinata/httpd                                                                   0                    
docker.io   docker.io/interlutions/httpd                   httpd docker image with debian-based confi...   0                    [OK]
docker.io   docker.io/itsziget/httpd24                     Extended HTTPD Docker image based on the o...   0                    [OK]
docker.io   docker.io/izdock/httpd                         Production ready Apache HTTPD Web Server +...   0                    
docker.io   docker.io/manageiq/httpd                       Container with httpd, built on CentOS for ...   0                    [OK]
docker.io   docker.io/manageiq/httpd_configmap_generator   Httpd Configmap Generator                       0                    [OK]
docker.io   docker.io/manasip/httpd                                                                        0                    
docker.io   docker.io/ppc64le/httpd                        The Apache HTTP Server Project                  0                    
docker.io   docker.io/publici/httpd                        httpd:latest                                    0                    [OK]
docker.io   docker.io/solsson/httpd-openidc                mod_auth_openidc on official httpd image, ...   0                    [OK]
docker.io   docker.io/trollin/httpd                                                                        0                    
docker.io   docker.io/tugboatqa/httpd                      The Apache HTTP Server Project                  0                    
docker.io   docker.io/waja/httpdiff                        Docker image for httpdiff: https://github....   0                    [OK]

2.7.2获取镜像

获取镜像:
	docker pull(push)
镜像加速器:阿里云加速器,daocloud加速器,中科大加速器,Docker 中国官方镜像加速:https://registry.docker-cn.com
	
	docker pull centos:6.8(没有指定版本,默认会下载最新版)
	docker pull daocloud.io/huangzhichong/alpine-cn:latest (私有仓库下载)

扩展:查询docker镜像所有版本https://hub.docker.com/r/library/

2.7.3docker镜像其他操作

查看镜像
	docker images
删除镜像
	docker rmi  例子:docker image rm centos:latest
导出镜像
	docker save  例子:docker image save centos > docker-centos7.4.tar.gz
导入镜像
	docker load  例子:docker image load -i docker-centos7.4.tar.gz

查看镜像
[root@m03 ~]# docker images 
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
docker.io/httpd          2.4                 7d85cc3b2d80        5 days ago          154 MB
docker.io/centos         latest              67fa590cfc1c        6 days ago          202 MB
docker.io/nginx          latest              5a3221f0137b        11 days ago         126 MB
docker.io/centos         6.8                 82f3b5f3c58f        5 months ago        195 MB
docker.io/centos/httpd   latest              2cc07fbb5000        8 months ago        258 MB
一台服务器不能联网,怎样导入docker镜像
m03服务器上导出镜像

[root@m03 ~]# docker image save httpd:2.4 >docker-httpd-2.4.tar.gz
[root@m03 ~]# ll
total 155296
-rw-------. 1 root root      1813 Mar 19 17:42 anaconda-ks.cfg
-rw-r--r--  1 root root 159015936 Aug 27 13:58 docker-httpd-2.4.tar.gz
[root@m03 ~]# scp -r docker-httpd-2.4.tar.gz 10.0.0.62:/
The authenticity of host '10.0.0.62 (10.0.0.62)' cant be established.
ECDSA key fingerprint is SHA256:Ka9BMYk6kC3Do+tYMLHVaNYdiKe8It208D+ctt/mBJE.
ECDSA key fingerprint is MD5:bb:ce:ec:f9:ce:e3:25:51:84:83:a8:29:b0:68:59:f0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.62' (ECDSA) to the list of known hosts.
root@10.0.0.62s password: 
docker-httpd-2.4.tar.gz                                                  100%  152MB  54.0MB/s   00:02    
[root@m03 ~]# 

m02服务器上导入镜像

[root@m02 /]# systemctl start docker
[root@m02 /]# docker image load -i docker-httpd-2.4.tar.gz 
1c95c77433e8: Loading layer 72.47 MB/72.47 MB
5bcb93651a74: Loading layer  2.56 kB/2.56 kB
8b16516271d6: Loading layer  36.7 MB/36.7 MB
7a0960d9b679: Loading layer  49.8 MB/49.8 MB
9e0ab3afff15: Loading layer 3.584 kB/3.584 kB
Loaded image: httpd:2.4
[root@m02 /]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
httpd                       2.4                 7d85cc3b2d80        5 days ago          154 MB

删除镜像,根据IMAGE ID删除。
[root@m02 /]# docker image rm 7d85cc3b2d80
Untagged: httpd:2.4
Deleted: sha256:7d85cc3b2d8064182718e70ca9f9601a309bb7499db680e15c3231a0b350a42e
Deleted: sha256:51d45e63b0d614f0c5f29a1d084c5e5de7172d29759779d1a4be4a6a23fe8146
Deleted: sha256:fcf8e3874f532184a2e2921b08a19fff19be0a5780ae880b5767de241fe8ab8f
Deleted: sha256:6b6b51bc4f21f666d01bf39241b7a3a80bd9eb292441a56a3e6be64f3c159fad
Deleted: sha256:d2b23cec91935d11520968e82edc529aa4cfb39a795178cd7e0a7dd117878005
Deleted: sha256:1c95c77433e8d7bf0f519c9d8c9ca967e2603f0defbf379130d9a841cca2e28e

2.8docker容器管理

2.8.1运行一个容器

docker run -d -p 80:80 nginx:latest
run             (创建并运行一个容器)
-d                  放在后台
-p                  端口映射
nginx:latest   docker镜像的名字和版本
还有很多其他的参数

docker run == docker create  + docker start

[root@m03 cgroup]# docker run -d -p 80:80 nginx:latest
37df2d9d0f79bc5b5d4673fbdbb7952a1525478582b29f31e2e0036977649757
[root@m03 cgroup]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
37df2d9d0f79        nginx:latest        "nginx -g 'daemon ..."   5 seconds ago       Up 5 seconds        0.0.0.0:80->80/tcp   quizzical_wing
[root@m03 cgroup]# 

2.8.2其他命令

停止容器
	docker stop CONTAINER_ID
杀死容器
	docker kill container_name
查看容器列表
     docker ps
	docker ps –a 
删除容器
	docker rm
批量删除容器
    docker rm -f `docker ps -a -q`
-- docker stop
[root@m03 cgroup]# docker stop 37df2d9d0f79
37df2d9d0f79
[root@m03 cgroup]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
37df2d9d0f79        nginx:latest        "nginx -g 'daemon ..."   2 minutes ago       Exited (0) 10 seconds ago                       quizzical_wing

-- docker start
[root@m03 cgroup]# docker start 37df2d9d0f79
37df2d9d0f79
[root@m03 cgroup]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
37df2d9d0f79        nginx:latest        "nginx -g 'daemon ..."   2 minutes ago       Up 20 seconds       0.0.0.0:80->80/tcp   quizzical_wing

--docker kill
[root@m03 cgroup]# docker kill 37df2d9d0f79
37df2d9d0f79
[root@m03 cgroup]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
37df2d9d0f79        nginx:latest        "nginx -g 'daemon ..."   3 minutes ago       Exited (137) 2 seconds ago                       quizzical_wing

-- docker rm 
[root@m03 cgroup]# docker rm 37df2d9d0f79
37df2d9d0f79
[root@m03 cgroup]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@m03 cgroup]# 

-- docker rm -f `docker ps -a -q`
[root@m03 cgroup]# docker run -d -p 80:80 nginx
bf5d45c04de7c35317da8d40bcb12021fa2561e234c3935411f36509d5dc0d5a
[root@m03 cgroup]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
bf5d45c04de7        nginx               "nginx -g 'daemon ..."   5 seconds ago       Up 4 seconds        0.0.0.0:80->80/tcp   goofy_lalande
[root@m03 cgroup]# docker rm -f `docker ps -a -q`
bf5d45c04de7
[root@m03 cgroup]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@m03 cgroup]# 

2.8.3Docker run

docker run -it --name centos6 centos:6.8 /bin/bash
## 退出容器后,容器就停止了,状态为Exited
-it             分配交互式的终端
--name     指定容器的名字
/bin/sh      覆盖容器的初始命令

--cpus       指定cpu的数量
--memory  限定内存的大小
-h              指定容器的主机名
[root@m03 cgroup]# docker run -it --name my_centos centos /bin/bash
[root@7a186083a51d /]# ifconfig
bash: ifconfig: command not found
[root@7a186083a51d /]# ipaddr
bash: ipaddr: command not found
[root@7a186083a51d /]# ip addr
bash: ip: command not found
[root@7a186083a51d /]# hostname
7a186083a51d
[root@7a186083a51d /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@7a186083a51d /]# exit
exit
## 退出容器后,容器就停止了,状态为Exited
[root@m03 cgroup]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
7a186083a51d        centos              "/bin/bash"         46 seconds ago      Exited (0) 4 seconds ago                       my_centos
[root@m03 cgroup]# 

2.8.4docker进入容器

进入容器的目的:排错,调试

进入容器的方法:
	docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
	例子:	
    docker exec -it  容器id或容器名字 /bin/bash
	推荐该方法,exit退出容器后,容器状态不会改变

	docker attach [OPTIONS] CONTAINER
	例子:
	docker attach  容器id或容器名字
	不推荐使用,exit退出容器后,容器就停止了
	
	nsenter(安装yum install -y util-linux 弃用)

-- docker exec -it

[root@m03 cgroup]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
7a186083a51d        centos              "/bin/bash"         46 seconds ago      Exited (0) 4 seconds ago                       my_centos
[root@m03 cgroup]# docker start 7a186083a51d
7a186083a51d
[root@m03 cgroup]# docker exec -it 7a186083a51d
"docker exec" requires at least 2 argument(s).
See 'docker exec --help'.

Usage:  docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Run a command in a running container
[root@m03 cgroup]# docker exec -it 7a186083a51d /bin/bash
[root@7a186083a51d /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@7a186083a51d /]# ifconfig
bash: ifconfig: command not found
[root@7a186083a51d /]# exit
exit
[root@m03 cgroup]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7a186083a51d        centos              "/bin/bash"         12 minutes ago      Up 35 seconds                           my_centos
[root@m03 cgroup]# 

--  docker attach

[root@m03 cgroup]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7a186083a51d        centos              "/bin/bash"         15 minutes ago      Up 3 minutes                            my_centos
[root@m03 cgroup]# docker attach 7a186083a51d 
[root@7a186083a51d /]# exit
exit
[root@m03 cgroup]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
7a186083a51d        centos              "/bin/bash"         16 minutes ago      Exited (0) 6 seconds ago                       my_centos
[root@m03 cgroup]# 

2.8.5docker容器的核心理念

docker的本质是:在隔离的环境运行的一个进程

所以:docker容器内的第一个进程必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态!
nginx -g 'daemon off'由于创建一个nginx容器,会在容器中运行nginx -g 'daemon off命令,该命令会一直在容器中运行,所以创建后,容器是Up状态
[root@m03 cgroup]# docker run -d nginx
306c620d3736be79b1b4bcd9e00c987b11cf338ba107eb5eab11a6667273754f
[root@m03 cgroup]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
306c620d3736        nginx               "nginx -g 'daemon off"   4 seconds ago       Up 4 seconds        80/tcp              xenodochial_hawking

创建centos容器,会在容器内部运行/bin/bash命令,不会一直在容器中的前台运行,所以创建容器后,容器处于Exit状态。
[root@m03 cgroup]# docker run -d centos
4c71e36149c8b8900d8e1e29e70f7a51a454a4f249b66e095cb2d686e54755fd
[root@m03 cgroup]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
4c71e36149c8        centos              "/bin/bash"              4 seconds ago       Exited (0) 3 seconds ago                       cranky_bohr
306c620d3736        nginx               "nginx -g 'daemon ..."   15 seconds ago      Up 14 seconds              80/tcp              xenodochial_hawking

可以自己设置一个一直处于运行的命令,tail -F 不管后面的文件是否存在,都不会报错。这样创建的容器也是处于Up状态
[root@m03 cgroup]# docker run -d centos tail -F /var/log/messages
a24f4f2131aed27d81d038bbdaadd335cf9040535c667e6329adf05bd89c4a62
[root@m03 cgroup]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
a24f4f2131ae        centos              "tail -F /var/log/..."   5 seconds ago       Up 4 seconds                                    kickass_mayer
4c71e36149c8        centos              "/bin/bash"              43 seconds ago      Exited (0) 41 seconds ago                       cranky_bohr
306c620d3736        nginx               "nginx -g 'daemon ..."   54 seconds ago      Up 53 seconds               80/tcp              xenodochial_hawking
[root@m03 cgroup]# 

2.9docker容器的网络访问

2.9.1端口映射

运行容器为什么要使用端口映射?
       默认,情况下,容器使用的ip是172.17.0.0/16网段的,外界的用户只能访问宿主机的10.0.0.0/24网段,无法访问172.17.0.0/16网段。
	   我们运行容器的目的:是希望运行在容器中的服务,能够被外界访问,这里就涉及到了外网10.0.0.0/24到容器内网172.17.0.0/16网段的转换,所以需要做端口映射。
-p hostPort:containerPort

[root@m03 cgroup]# docker ps -a -q
[root@m03 cgroup]# docker run -d -p 80:80 nginx
188958c08e0dc4055c8f7d86c226bc0f9b6f825fb2304715af7e2709bfec1810
[root@m03 cgroup]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
188958c08e0d        nginx               "nginx -g 'daemon ..."   5 seconds ago       Up 4 seconds        0.0.0.0:80->80/tcp   eager_colden

-- 自动添加iptables规则
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:80

[root@m03 cgroup]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0           
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:80

Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.2:80

--查看容器信息
[root@m03 cgroup]# docker container inspect 188958c08e0d
[
    {
        "Id": "188958c08e0dc4055c8f7d86c226bc0f9b6f825fb2304715af7e2709bfec1810",
        "Created": "2019-08-27T07:26:32.841177491Z",
        "Path": "nginx",
        "Args": [
            "-g",
            "daemon off;"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 5901,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2019-08-27T07:26:33.010641251Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:5a3221f0137beb960c34b9cf4455424b6210160fd618c5e79401a07d6e5a2ced",
        "ResolvConfPath": "/var/lib/docker/containers/188958c08e0dc4055c8f7d86c226bc0f9b6f825fb2304715af7e2709bfec1810/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/188958c08e0dc4055c8f7d86c226bc0f9b6f825fb2304715af7e2709bfec1810/hostname",
        "HostsPath": "/var/lib/docker/containers/188958c08e0dc4055c8f7d86c226bc0f9b6f825fb2304715af7e2709bfec1810/hosts",
        "LogPath": "",
        "Name": "/eager_colden",
        "RestartCount": 0,
        "Driver": "overlay2",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "journald",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {
                "80/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "80"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "docker-runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": null,
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DiskQuota": 0,
            "KernelMemory": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": -1,
            "OomKillDisable": false,
            "PidsLimit": 0,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0
        },
        "GraphDriver": {
            "Name": "overlay2",
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/13e745a873308d509df42f30dd6e45e9f6983540d73275cc9a6dc07356fdae8d-init/diff:/var/lib/docker/overlay2/43b1a03284cf713dde01a409ee94e34dd4063bd65771108f47a32d4f1f0dc4a0/diff:/var/lib/docker/overlay2/26cc92d5f67e41b39fe1041a37ef4541e3b9e9f777c6e5587651e0e2a9d97a2c/diff:/var/lib/docker/overlay2/638ccce05954d221feececeff185decd98c16cad615ed56117078f92c8deb7b0/diff",
                "MergedDir": "/var/lib/docker/overlay2/13e745a873308d509df42f30dd6e45e9f6983540d73275cc9a6dc07356fdae8d/merged",
                "UpperDir": "/var/lib/docker/overlay2/13e745a873308d509df42f30dd6e45e9f6983540d73275cc9a6dc07356fdae8d/diff",
                "WorkDir": "/var/lib/docker/overlay2/13e745a873308d509df42f30dd6e45e9f6983540d73275cc9a6dc07356fdae8d/work"
            }
        },
        "Mounts": [],
        "Config": {
            "Hostname": "188958c08e0d",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.17.3",
                "NJS_VERSION=0.3.5",
                "PKG_RELEASE=1~buster"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "ArgsEscaped": true,
            "Image": "nginx",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGTERM"
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "e9f1b8b31d8609b92479c5bc64d2c539d9289d4a5c299624ae3086e25f5611a4",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "80/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "80"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/e9f1b8b31d86",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "03d54b2dee1683609c98b095580b24d9d48a47101ca5570fe1c8e2fddaab27c5",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "b4e25627913f0b002b9bf37077d83ee75381ebc2d36b8b05a2ae7701db67b0ee",
                    "EndpointID": "03d54b2dee1683609c98b095580b24d9d48a47101ca5570fe1c8e2fddaab27c5",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02"
                }
            }
        }
    }
]

2.9.2docker运行容器端口映射的方法

指定映射(docker 自动添加一条iptables规则实现端口映射)
	-p hostPort:containerPort
	-p ip:hostPort:containerPort 
	-p ip::containerPort(随机端口)
	-p hostPort:containerPort:udp
	-p 81:80 -p 443:443 可以指定多个-p

随机映射
	docker run -P (随机端口)

-p hostPort:containerPort

-- 宿主机的8080端口映射到容器的80端口
[root@m03 cgroup]# docker run -d -p 8080:80 nginx
a7492f5524975b611a8f6cd9f9113e7886d90b4d2e7daa513d01e8f583d74805

-- -p ip:hostPort:containerPort 

--宿主机的多个IP映射
[root@m03 cgroup]# ifconfig eth0:1 10.0.0.111/24 up

-- 在m02上测试ip是否通
[root@m02 /]# ping 10.0.0.111
PING 10.0.0.111 (10.0.0.111) 56(84) bytes of data.
64 bytes from 10.0.0.111: icmp_seq=1 ttl=64 time=0.896 ms
64 bytes from 10.0.0.111: icmp_seq=2 ttl=64 time=0.491 ms
^C
--- 10.0.0.111 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1004ms
rtt min/avg/max/mdev = 0.491/0.693/0.896/0.204 ms
[root@m02 /]# 

[root@m03 cgroup]# docker run -d -p 10.0.0.111:82:80 nginx:latest
ddbc8ae2170dfd64ef65d7d63f6f522756ab06bafdc30b09c72af22262366a1e
[root@m03 cgroup]# docker run -d -p 10.0.0.63:82:80 nginx:latest
cd4d9a6080667636941068be22de132a97d084fb09ed476208d8e31371badd0b
[root@m03 cgroup]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
cd4d9a608066        nginx:latest        "nginx -g 'daemon ..."   3 seconds ago       Up 2 seconds        10.0.0.63:82->80/tcp    sad_wright
ddbc8ae2170d        nginx:latest        "nginx -g 'daemon ..."   7 seconds ago       Up 6 seconds        10.0.0.111:82->80/tcp   wizardly_pasteur
[root@m03 cgroup]# 

-- -p ip::containerPort(随机端口)
[root@m03 cgroup]# docker run -d -p 10.0.0.111::80 nginx:latest
68eb270e308b7f31b7bffcd51f208d5c6c0677d20b0d452d996d200b472f9766
[root@m03 cgroup]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
68eb270e308b        nginx:latest        "nginx -g 'daemon ..."   4 seconds ago       Up 3 seconds        10.0.0.111:32770->80/tcp   angry_fermi
[root@m03 cgroup]# 

--docker run -P (随机端口)

[root@m03 cgroup]# docker run -d -P nginx
b0d676c41a9f5859b5191cbde53b43196dc2443235709d16cb7775edb2e21f18
[root@m03 cgroup]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                   NAMES
b0d676c41a9f        nginx               "nginx -g 'daemon ..."   4 seconds ago       Up 3 seconds               0.0.0.0:32769->80/tcp   nifty_kilby
b07ae7c044c9        nginx               "nginx -g 'daemon ..."   11 seconds ago      Exited (0) 8 seconds ago                           vibrant_kalam
[root@m03 cgroup]# 

2.9.3 上网原理

上网功能需要开启内核转发功能
这里docker会自动开启
[root@m03 cgroup]# sysctl -a|grep ip_forward
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
net.ipv4.ip_forward = 1

2.10数据卷存储

2.10.1数据卷命令

数据卷的作用:
1:持久化容器运行过程中产生的数据文件
2:实现多个容器间的文件共享。

正常情况下,删除容器,容器中所有的文件也会被删除。
创建一个数据卷
    docker volume create
查看数据卷列表
    docker volume ls
删除一个数据卷
    docker volume rm
查看一个数据卷的属性
    docker volume inspect

2.10.2数据卷应用

docker volume create my_volume

docker run -d -p 80:80 -v my_volume:/usr/share/nginx/html nginx:latest

cd /var/lib/docker/volumes/my_volume/_data/
rm -f *
wget https://www.qstack.com.cn/xiaoniaofeifei.zip
unzip xiaoniaofeifei.zip

docker run -d -p 81:80 -v my_volume:/usr/share/nginx/html nginx:latest
docker run -d -p 82:80 --volumes-from 51fa89744927 nginx:latest
查看数据卷
[root@m03 cgroup]# docker volume ls
DRIVER              VOLUME NAME

创建数据卷
[root@m03 cgroup]# docker volume create my_volume
my_volume
[root@m03 cgroup]# docker volume ls
DRIVER              VOLUME NAME
local               my_volume

使用数据卷
[root@m03 cgroup]# docker run -d -p 80:80 -v my_volume:/usr/share/nginx/html nginx:latest
e8e2765fafcdcb5c4f4ce3a45a599f0983538ff6be169265b2533b0cfe82ab10

查看
[root@m03 cgroup]# cd /var/lib/docker/volumes/my_volume/
[root@m03 my_volume]# ll
total 0
drwxr-xr-x 2 root root 40 Aug 27 16:01 _data
[root@m03 my_volume]# cd _data/
[root@m03 _data]# ll
total 8
-rw-r--r-- 1 root root 494 Aug 13 16:50 50x.html
-rw-r--r-- 1 root root 612 Aug 13 16:50 index.html
[root@m03 _data]# pwd
/var/lib/docker/volumes/my_volume/_data
[root@m03 _data]# 

删除容器,文件仍然存在
[root@m03 _data]# docker rm -f e8e2765fafcd
e8e2765fafcd
[root@m03 _data]# ll
total 8
-rw-r--r-- 1 root root 494 Aug 13 16:50 50x.html
-rw-r--r-- 1 root root 612 Aug 13 16:50 index.html

修改卷中的内容
[root@m03 _data]# echo "hello" > index.html

重新启动一个容器,使用改卷
[root@m03 _data]# docker run -d -p 8080:80 -v my_volume:/usr/share/nginx/html nginx
51fa89744927eb6189dace47e2891f48df0f711a4e0d68519d89759a1144970a

进入容器中,查看/usr/share/nginx/html中内容与宿主机my_volume卷对应的内容相同
[root@m03 _data]# docker exec -it 51fa89744927 /bin/bash
root@51fa89744927:/# cd /usr/
bin/     games/   include/ lib/     local/   sbin/    share/   src/     
root@51fa89744927:/# cd /usr/share/nginx/html/
root@51fa89744927:/usr/share/nginx/html# ls
50x.html  index.html
root@51fa89744927:/usr/share/nginx/html# exit
exit
[root@m03 _data]# ll
total 8
-rw-r--r-- 1 root root 494 Aug 13 16:50 50x.html
-rw-r--r-- 1 root root   6 Aug 27 16:10 index.html

 --volumes-from
 
[root@m03 _data]# docker run -d -p 82:80 --volumes-from 51fa89744927 nginx:latest
7a6b9d7900b0eb36c46da4100153877430d8c0df751bfd6c1c8581dda331d64a
[root@m03 _data]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
7a6b9d7900b0        nginx:latest        "nginx -g 'daemon ..."   7 seconds ago       Up 6 seconds        0.0.0.0:82->80/tcp     frosty_blackwell
51fa89744927        nginx               "nginx -g 'daemon ..."   9 minutes ago       Up 9 minutes        0.0.0.0:8080->80/tcp   hungry_visvesvaraya
[root@m03 _data]# 

2.10.3宿主机的目录挂载到容器中

[root@m03 opt]# mkdir my_dir
[root@m03 opt]# cd my_dir/
[root@m03 my_dir]# echo "hello my_dir" > index.html
[root@m03 my_dir]# docker run -d -p 83:80 -v /opt/my_dir:/usr/share/nginx/html/ nginx:latest
1c063420213127426bb0323cca6efb6f0e7f45e213ed342cc169e2bd98c57855
[root@m03 my_dir]#