15.0、服务器使用说明:

服务器名称

ip地址

controller-node1

172.16.1.90

15.1、docker介绍:

1、Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。

2、Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

3、Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。

(1)CE版非常适合希望开始使用Docker并尝试使用基于容器的应用程序的个人开发人员和小型团队;

(2)EE版专为企业开发和IT团队而设计,他们在生产中大规模构建,发布和运行业务关键型应用程序;

4、docker官方参考文档:https://docs.docker.com/install/linux/docker-ce/centos/

5、使用docker容器能保持运行环境的一致性,多版本测试;技术持续更新,技术储备,符合业务需求,产品的快速迭代,快速占领用户;

15.2、docker架构:

1、架构图:

(1)

(2)

2、架构说明:

(1)Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器;

(2)Docker 容器通过 Docker 镜像来创建;

(3)容器与镜像的关系类似于面向对象编程中的对象与类;

(4)Docker 镜像(Images):Docker 镜像是用于创建 Docker 容器的模板;

(5)Docker 容器(Container):容器是独立运行的一个或一组应用;

(6)Docker 客户端(Client):Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与

Docker 的守护进程通信;

(7)Docker 主机(Host):一个物理或者虚拟的机器用于执行 Docker 守护进程和容器;

(8)Docker 仓库(Registry):Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库,Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用;

(9)Docker Machine:Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安

装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

3、docker的内核知识:

(1)docker本质上就是宿主机上的一个进程,docker通过namespace实现资源的隔离,通过cgroup实现了资源的限制,通过写

时复制技术(copy-on-write)实现了高效的文件操作;

(2)实际上,linux内核实现namespace的一个主要目的就是实现轻量级虚拟化(容器)服务,在同一个namespace下进程间可以感受到

彼此之间的变化,对外界进程一无所知,这样就可以让容器中进程产生错觉,仿佛自己置身在一个独立的系统环境之中;

(3)cgroup的api以一个伪文件系统的实现方式,用户态的程序可以通过文件操作是实现cgroup的组织管理,cgroup

的组织管理操作单元可以细粒度到线程的级别,另外用户可以创建和销毁cgroup,从而实现资源再分配和再利用,cgroup可以对任务执

行挂起、恢复等操作;

15.3、docker和openstack的对比图:

docker是跑应用的,不是跑数据的,如用数据需要挂载新的磁盘对数据进行存储;

15.4、安装docker:

1、安装依赖包:

yum install container-selinux -y

2、下载需要的docker rpm包:

mkdir /tools/ -p

cd /tools/

wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.0-3.el7.x86_64.rpm

wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-18.09.0-3.el7.x86_64.rpm

wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-18.09.0-3.el7.x86_64.rpm

3、安装docker:

rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.0-3.el7.x86_64.rpm

rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-18.09.0-3.el7.x86_64.rpm

rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-18.09.0-3.el7.x86_64.rpm

4、查看docker版本:

docker -v

Docker version 18.09.0, build 4d60db4

5、添加docker镜像加速器:

(1)创建一个阿里云的镜像加速器的账号:

https://cr.console.aliyun.com

(2)修改配置文件参数:

mkdir -p /etc/docker/

tee /etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": ["https://b1cx9cn7.mirror.aliyuncs.com"]

}

EOF

systemctl daemon-reload

6、启动docker并加入到开机自启动:

systemctl start docker

systemctl enable docker

15.5、docker操作:

1、docker应用常用操作:

(1)搜索docker镜像:

docker search nginx

(2)下载docker镜像:

docker pull nginx

(3)查看下载的docker镜像列表:

[root@controller-node1 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

nginx latest 53f3fd8007f7 13 days ago 109MB

#docker的名称 版本号(最新一版) 镜像id全局唯一 创建镜像的时间 镜像的大小

(4)docker镜像导出:

docker save nginx >/tmp/nginx.tar

ls -lh /tmp/nginx.tar

-rw-r--r-- 1 root root 108M 5月 21 14:06 /tmp/nginx.tar

补充:解压docker镜像:

tar -xf /tmp/nginx.tar

(5)删除docker镜像:

docker rmi nginx

(6)导入docker镜像:

docker load </tmp/nginx.tar

2、docker镜像存放的位置:

docker info | grep "Docker Root Dir"

Docker Root Dir: /var/lib/docker

3、启动容器:

(1)启动:

docker run -it -d --name mynginx nginx bash

参数说明:

run:启动镜像;

-it:持续的操作,显示一个终端;

-d:表示容器后台运行,如果不加该参数,容器会在前台运行,当退出前台或关闭scrt连

接后,容器就会关闭,如果没加该参数,又想容器在后台运行,需要使用ctrlt(按住不放)+p+q;

--name:表示容器的名称;

nginx:镜像名;

bash:容器运行在bash环境下;

(2)查看正在运行的docker容器:

docker ps

补充:docker ps -a #查看所有的docker容器,包括运行,还有没运行的容器;

(3)查看容器的详细信息:

docker inspect mynginx

(4)进入容器:

docker exec -it mynginx bash

提示:如果启动容器的时候使用了'-d'参数,这里进入容器可以直接出来,不影响容器的后台运行;

补充:bash表示进入容器的命令行模式,如果容器中有应用服务脚本可以直接使用,比如'docker exec -it mynginx nginx',

表示直接运行nginx服务而不进入容器命令行界面;

(5)关闭容器:

docker stop mynginx

补充:docker kill mynginx #强制杀死容器;

(6)启动容器:

docker start mynginx

补充:docker restart mynginx #重启容器;

(7)删除容器:

docker rm -f mynginx

#-f:表示如果docker容器在运行就强制删除;

15.6、制作docker镜像:

1、下载centos基础镜像,以该镜像做容器的基础:

docker pull centos

2、启动镜像:

docker run -it -d --name lc_nginx centos bash

3、安装nginx:

(1)进入容器:

docker exec -it lc_nginx bash

(2)更新yum源:

yum install wget net-tools

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

yum install epel-release

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

(3)安装nginx:

yum install nginx -y

(4)运行nginx:

nginx

补充:后台nginx前台运行参数'daemon off'

4、关闭容器:

docker stop lc_nginx

5、创建nginx镜像:

docker commit -m 'my first nginx images' lc_nginx lc/nginx:v1

参数说明:

commit -m:表示镜像描述;

lc_nginx:容器名称;

lc/nginx:v1:lc/nginx代表镜像名称,:v1表示镜像的版本号;

6、查看创建的镜像:

[root@controller-node1 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

lc/nginx v1 073700fe569f 10 seconds ago 395MB

7、验证:

(1)启动容器:

docker run -it -d --name mynginx1 lc/nginx:v1 bash

docker ps

(2)进入容器:

docker exec -it mynginx1 bash

8、将制作的docker镜像上传到hub.docker.com:

(1)在https://hub.docker.com上创建一个账户,并新建立一个仓库:

注意:仓库名称中只能使用下划线,如果使用横向,docker search会搜不到;

(2)登录:

[root@controller-node1 ~]# docker login

Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to ht

tps://hub.docker.com to create one.Username: hyjy2504164765

Password:

WARNING! Your password will be stored unencrypted in /root/.docker/config.json.

Configure a credential helper to remove this warning. See

https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

(3)给镜像打标签:

#获取镜像的id;

[root@controller-node1 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

lc/nginx v1 073700fe569f 24 minutes ago 395MB

#打标签;

[root@controller-node1 ~]# docker tag 073700fe569f hyjy2504164765/hyjy_nginx:v1

参数说明:

hyjy2504164765/hyjy_nginx #表示的是标签名称(新的镜像名称),"/"前面的内容是hub.docker的用户名,"/"后面的内容是hub.docker中的仓库名称;

:v1 #表示版本号;

#查看镜像:

[root@controller-node1 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

hyjy2504164765/hyjy_nginx v1 073700fe569f 2 minutes ago 395MB

lc/nginx v1 073700fe569f 30 minutes ago 395MB

(4)上传镜像:

1)上传:

[root@controller-node1 ~]# docker push hyjy2504164765/hyjy_nginx:v1

2)在hub.docker中查看:

(5)搜索上传的镜像仓库:

[root@controller-node1 ~]# docker search hyjy_nginx

NAME DESCRIPTION STARS OFFICIAL AUTOMATED

hyjy2504164765/hyjy_nginx 0

(6)从仓库中下载镜像:

[root@controller-node1 ~]# docker rmi hyjy2504164765/hyjy_nginx:v1

[root@controller-node1 ~]# docker pull hyjy2504164765/hyjy_nginx:v1

v1: Pulling from hyjy2504164765/hyjy_nginx

Digest: sha256:a9f1e2ee11ffe063021d4ef424838fffe8982a6e87e83963c0e1e2df97b4ea90

Status: Downloaded newer image for hyjy2504164765/hyjy_nginx:v1

15.7、docker中的网络:

1、docker网络介绍:

(1)docker中的网络类型:

[root@controller-node1 ~]# docker network ls

NETWORK ID NAME DRIVER SCOPE

6924bd4782b1 bridge bridge local

8d1697e27ce5 host host local

144b44b784a2 none null local

(2)bridge网络:

在不指定--network参数或者--network=bridge的情况下创建的容器其网络类型都是bridge;

Docker在安装时会在宿主机上创建名为docker0的网桥,所谓网桥相当于一个虚拟交换机,如果使用上述两种方式run的容器都会挂

到docker0上,而且容器的路由会指向该docker0的ip地址(默认是172.17.0.1/16),虽然所有的容器都桥接在docker0网卡上,容器路由

指向docker0网卡,所有容器能够访问宿主机的所有网络,但是由于外部网络对docker0网卡没有做路由,所以无法进行访问,所以需要

做相应的映射和路由操作;

(3)host网络:

连接到host网络的容器共享Docker宿主机的网络栈,即容器的网络配置与host宿主机完全一样,仿佛就是宿主机中添加的应用,可以

通过添加--network=host参数来指定该容器使用host网络;

(4)none网络就是什么都没有的网络,挂在这个网络下的容器除了lo,没有其他任何网卡。容器run时,可以通过添加--network=none

参数来指定该容器使用none网络;

2、桥接网络下的应用:

(1)端口映射:

使用场景:需要通过宿主机网络访问容器应用;

1)启动容器:

docker run -it -d --name mynginx2 -p 172.16.1.90:80:80 lc/nginx:v1 bash

说明:-p 172.16.1.90:80:80 #表示把宿主机的172.16.1.90:80映射到docker容器的80端口,如果不写ip地址时映射宿主机的所有网卡地址;

默认是tcp的映射,如果是udp(比如dns服务),需要改为'-p 172.16.1.90:80:80'即可;

2)在宿主机上查看映射端口:

[root@controller-node1 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

e80c1e8a1762 lc/nginx:v1 "bash" 13 minutes ago Up 13 minutes 172.16.1.90:80->80/tcp mynginx2

[root@controller-node1 ~]# netstat -tunlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp 0 0 172.16.1.90:80 0.0.0.0:* LISTEN 8208/docker-proxy

3)进入到docker容器中:

[root@controller-node1 ~]# docker exec -it mynginx2 bash

[root@e80c1e8a1762 /]# nginx

[root@e80c1e8a1762 /]# netstat -tunlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 29/nginx: master pr

4)从浏览器中访问nginx服务:

(2)容器之间的交互:

使用场景:因为容器的ip是dhcp分配的,不固定,链接可以将被连接的容器加入到需要链接容器的/etc/hosts下面,可以使用容器名连接被连接的容器;

好处:Docker 会在两个互联的容器之间创建了一个安全的隧道,且不用映射它们的端口到宿主主机上,从而避免了暴露应用端口到外部网络上,增加了容器的安全性;

缺点:启动链接端的docker容器需要被链接端的docker容器是启动的状态,否则链接端也无法启动(如果在使用过程中被链接端docker容器挂掉,链接端的docker容器不会挂掉);

1)启动一个mysql容器:

docker run -it -d --name mysql centos bash

2)启动一个mynginx3(web服务器)容器链接容器mysql(需要启动):

docker run -it -d --name mynginx3 -p 172.16.1.90:8080:80 --link mysql lc/nginx:v1 bash

说明:--link mysql #表示mynginx3容器链接mysql容器;

补充:--link mysql:db #表示使用别名;

3)查看:

[root@controller-node1 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

cb96127b7a2d lc/nginx:v1 "bash" 3 seconds ago Up 2 seconds 172.16.1.90:8080->80/tcp mynginx3

37fdb71ce903 centos "bash" 2 minutes ago Up 2 minutes mysql

4)进入mynginx3容器:

[root@controller-node1 ~]# docker exec -it mynginx3 bash

[root@cb96127b7a2d /]# nginx

[root@cb96127b7a2d /]# cat /etc/hosts

127.0.0.1 localhost

::1 localhost ip6-localhost ip6-loopback

fe00::0 ip6-localnet

ff00::0 ip6-mcastprefix

ff02::1 ip6-allnodes

ff02::2 ip6-allrouters

172.17.0.3 mysql 37fdb71ce903

172.17.0.4 cb96127b7a2d

说明:mysql容器中的host记录只有自己的;

5)访问nginx:

(3)docker容器之间跨服务器互联:

1)环境准备:

新添加一台服务器:

服务器名称

ip地址

slave-node1

172.16.1.91

安装docker容器,下载centos基础镜像;

2)修改controller-node1和slave-node1服务器中docker0的网段地址:

因为默认都是172.17.0.0/16的网段,无法使用路由进行连接;

A、controller-node1:

[root@controller-node1 ~]# vim /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd --bip=172.16.2.1/24 -H unix://

#说明:修改后所有的容器在从新启动后都会获得一个新的网段ip;

[root@controller-node1 ~]# systemctl daemon-reload

[root@controller-node1 ~]# systemctl restart docker

B、slave-node1:

[root@slave-node1 tools]# vim /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd --bip=172.16.3.1/24 -H unix://

[root@slave-node1 tools]# systemctl daemon-reload

[root@slave-node1 tools]# systemctl restart docker

3)在controller-node1和slave-node1服务器中分别添加对端静态路由:

A、controller-node1:

[root@controller-node1 ~]# route add -net 172.16.3.0/24 gw 172.16.1.91 dev eth1

[root@controller-node1 ~]# route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

0.0.0.0 10.0.0.253 0.0.0.0 UG 100 0 0 eth0

10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0

172.16.1.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1

172.16.2.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0

172.16.3.0 172.16.1.91 255.255.255.0 UG 0 0 0 eth1

#将静态路由信息加入到开机自启动中:

[root@controller-node1 ~]# chmod +x /etc/rc.d/rc.local

[root@controller-node1 ~]# echo 'route add -net 172.16.3.0/24 gw 172.16.1.91 dev eth1' >>/etc/rc.local

B、slave-node1:

[root@slave-node1 tools]# route add -net 172.16.2.0/24 gw 172.16.1.90 dev eth1

[root@slave-node1 tools]# route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

0.0.0.0 10.0.0.253 0.0.0.0 UG 100 0 0 eth0

10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0

172.16.1.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1

172.16.2.0 172.16.1.90 255.255.255.0 UG 0 0 0 eth1

172.16.3.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0

#将静态路由信息加入到开机自启动中:

[root@slave-node1 tools]# chmod +x /etc/rc.d/rc.local

[root@slave-node1 tools]# echo 'route add -net 172.16.2.0/24 gw 172.16.1.90 dev eth1' >>/etc/rc.local

4)ping测试:

A、controller-node1:

[root@controller-node1 ~]# ping 172.16.3.1 -c 2

PING 172.16.3.1 (172.16.3.1) 56(84) bytes of data.

64 bytes from 172.16.3.1: icmp_seq=1 ttl=64 time=2.04 ms

64 bytes from 172.16.3.1: icmp_seq=2 ttl=64 time=0.460 ms

--- 172.16.3.1 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1001ms

rtt min/avg/max/mdev = 0.460/1.252/2.044/0.792 ms

B、slave-noed1:

[root@slave-node1 tools]# ping 172.16.2.1 -c 2

PING 172.16.2.1 (172.16.2.1) 56(84) bytes of data.

64 bytes from 172.16.2.1: icmp_seq=1 ttl=64 time=1.29 ms

64 bytes from 172.16.2.1: icmp_seq=2 ttl=64 time=0.911 ms

--- 172.16.2.1 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1002ms

rtt min/avg/max/mdev = 0.911/1.100/1.290/0.192 ms

C、通过以上步骤就完成了容器之间跨服务器的互相访问;

D、补充:tcp抓包:

[root@slave-node1 ~]# yum install tcpdump

[root@slave-node1 tools]# tcpdump -i eth1 -vnn icmp

[root@controller-node1 ~]# ping 172.16.3.1 -c 2

PING 172.16.3.1 (172.16.3.1) 56(84) bytes of data.

64 bytes from 172.16.3.1: icmp_seq=1 ttl=64 time=1.17 ms

64 bytes from 172.16.3.1: icmp_seq=2 ttl=64 time=0.543 ms

--- 172.16.3.1 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1002ms

rtt min/avg/max/mdev = 0.543/0.859/1.176/0.317 ms

[root@slave-node1 tools]# tcpdump -i eth1 -vnn icmp

tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes

02:10:26.536736 IP (tos 0x0, ttl 64, id 17866, offset 0, flags [DF], proto ICMP (1), length 84)

172.16.1.90 > 172.16.3.1: ICMP echo request, id 5554, seq 1, length 64

02:10:26.536867 IP (tos 0x0, ttl 64, id 17688, offset 0, flags [none], proto ICMP (1), length 84)

172.16.3.1 > 172.16.1.90: ICMP echo reply, id 5554, seq 1, length 64

02:10:27.538608 IP (tos 0x0, ttl 64, id 18328, offset 0, flags [DF], proto ICMP (1), length 84)

172.16.1.90 > 172.16.3.1: ICMP echo request, id 5554, seq 2, length 64

02:10:27.538676 IP (tos 0x0, ttl 64, id 17794, offset 0, flags [none], proto ICMP (1), length 84)

172.16.3.1 > 172.16.1.90: ICMP echo reply, id 5554, seq 2, length 64

15.8、docker数据管理:

1、数据卷:

(1)什么是数据卷:

数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount操作;

用于数据共享;

(2)数据卷的特点:

1)数据卷可以在容器之间共享和重用,容器间传递数据将变得高效方便;

2)对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作;

3)对数据卷的更新不会影响镜像,解耦了应用和数据;

5)写时复制,用多少,占多数;

(3)在容器中创建数据卷:

[root@controller-node1 ~]# mkdir /data/ -p

[root@controller-node1 ~]# echo "liuchang" >/data/test.txt

[root@controller-node1 ~]# docker run -it -d --name web01 -v /data/:/data/ centos bash

参数说明:-v /data/:/data/ #表示将宿主机中的/data/目录挂载到web01容器的/data/目录(也可以挂载文件,不推荐),默认权限是可以读写;

补充:-v /data/:/data/:ro #表示挂载到容器中的宿主机目录为只读模式;

(4)进入容器中查看数据卷:

[root@controller-node1 ~]# docker exec -it web01 bash

[root@f288cbdcf546 /]# cat /data/test.txt

liuchang

(5)磁盘的使用情况:

1)宿主机磁盘:

[root@controller-node1 ~]# df -hT

文件系统 类型 容量 已用 可用 已用% 挂载点

/dev/sda3 xfs 58G 2.9G 55G 5% /

devtmpfs devtmpfs 2.9G 0 2.9G 0% /dev

tmpfs tmpfs 3.0G 0 3.0G 0% /dev/shm

tmpfs tmpfs 3.0G 12M 2.9G 1% /run

tmpfs tmpfs 3.0G 0 3.0G 0% /sys/fs/cgroup

/dev/sda1 xfs 197M 102M 95M 52% /boot

tmpfs tmpfs 596M 0 596M 0% /run/user/0

overlay overlay 58G 2.9G 55G 5% /var/lib/docker/overlay2/b33bea4804dfdf9dbae6bf580db6da

0e3da15e541efe09159fe79873bd7acbb4/mergedshm tmpfs 64M 0 64M 0% /var/lib/docker/containers/f288cbdcf546cfbd7fa927eed019

fd6351f4cee58b48918ec67b0f82e3694e02/mounts/shm

2)docker容器磁盘情况:

[root@f288cbdcf546 /]# df -hT

Filesystem Type Size Used Avail Use% Mounted on

overlay overlay 58G 2.9G 55G 5% /

tmpfs tmpfs 64M 0 64M 0% /dev

tmpfs tmpfs 3.0G 0 3.0G 0% /sys/fs/cgroup

/dev/sda3 xfs 58G 2.9G 55G 5% /data

shm tmpfs 64M 0 64M 0% /dev/shm

tmpfs tmpfs 3.0G 0 3.0G 0% /proc/acpi

tmpfs tmpfs 3.0G 0 3.0G 0% /proc/scsi

tmpfs tmpfs 3.0G 0 3.0G 0% /sys/firmware

2、数据卷容器:

(1)什么是数据卷容器:

数据卷容器是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载;

用于数据共享;

(2)创建数据卷容器:

[root@controller-node1 ~]# docker run -it -d --name web02 -v /data/:/data/ centos bash

(3)连接数据卷容器:

[root@controller-node1 ~]# docker run -it -d --name web03 --volumes-from web02 centos bash

(4)进入连接数据卷的容器:

[root@controller-node1 ~]# docker exec -it web03 bash

[root@503a3b343698 /]# cat /data/test.txt

liuchang

3、删除数据卷、数据卷容器、挂载了数据卷容器的容器:

[root@controller-node1 ~]# docker rm -f -v web01

[root@controller-node1 ~]# docker rm -f -v web02

[root@controller-node1 ~]# docker rm -f -v web03

说明:宿主机本地映射到容器数据卷的目录及内容不会被删除;

4、总结:

(1)删除挂载了数据卷的容器、数据卷容器、挂载了数据卷容器的容器需要使用-v参数,但是不会删除本地目录;

(2)挂载了数据卷容器的容器指向的是本地的目录,即是数据卷容器被删除或停止,也能查看数据;

(3)备份数据卷和数据卷容器只要备份本地目录即可,还原只需将数据还原到相同的目录下即可,如果目录被删除,需要

重新建立目录,并重启容器;

15.9、使用Dockerfile创建镜像:

Dockerfile是自动构建docker镜像的工具;

相同版本号的镜像多次构建时,会覆盖上一个版本,已经构建的部分不会再次构建,如果镜像已经被容器使用,需要删除容器,如果

不想删除容器就给新建的镜像加版本号;

1、创建Dockerfile工具:

[root@controller-node1 ~]# mkdir -p /docker/

[root@controller-node1 ~]# cd /docker/

[root@controller-node1 docker]# echo "helloworld" >index.html

[root@controller-node1 docker]# vim /docker/Dockerfile

#create nginx images

FROM centos

#基础镜像;

MAINTAINER liuchang 2504164765@qq.com

#维护者的信息;

RUN rpm -ivh https://mirrors.aliyun.com/centos/7.6.1810/extras/x86_64/Packages/epel-release-7-11.noarch.rpm

RUN yum install nginx -y

#相关的操作;

ADD index.html /usr/share/nginx/html/index.html

#添加文件,文件必须在Dockerfile所在的目录;

#EXPOSE 80

#设置开放的端口;

#WORKDIR /docker/

#切换目录;

CMD ["/bin/bash"]

#docker run 执行的命令,如过再指定命令会覆盖此命令;

2、构建镜像:

[root@controller-node1 docker]# docker build -t liuchang/nginx /docker/

[root@controller-node1 docker]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

liuchang/nginx latest fde9e02c853e 7 minutes ago 417MB

3、创建容器:

[root@controller-node1 docker]# docker run -it -d --name mynginx4 -p 172.16.1.90:80:80 liuchang/nginx bash

4、查看映射信息:

[root@controller-node1 docker]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

97c0bee67827 liuchang/nginx "bash" 4 minutes ago Up 4 minutes 172.16.1.90:80->80/tcp mynginx4

5、启动nginx服务:

[root@controller-node1 docker]# docker exec -it mynginx4 nginx

6、使用浏览器进行访问:

15.10、docker私库搭建:

1、创建认证用户:

[root@controller-node1 docker]# mkdir /auth/ -p

[root@controller-node1 docker]# chmod 600 /auth/

[root@controller-node1 docker]# docker run --entrypoint htpasswd registry:2 -Bbn liuchang 123456 >/auth/htpasswd

[root@controller-node1 docker]# cat /auth/htpasswd

liuchang:$2y$05$BJKEIXa28d1mfY9.nam4TeXvokhQMD9h150O9OanGFR4rCzCeupA6

2、创建仓库:

[root@controller-node1 docker]# docker run -d -p 6000:5000 --restart=always --name docker_registry \

-v /auth/:/auth/ \

-e "REGISTRY_AUTH=htpasswd" \

-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \

-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \

registry

参数说明:--restart=always #表示docker仓库容器随docker一起启动;

说明:在实际的生产中应该用数据卷作为docker私库镜像的存储 -v /data/:/var/lib/registry/;

[root@controller-node1 docker]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

cb31ed867617 registry "/entrypoint.sh /etc…" 8 seconds ago Up 6 seconds 0.0.0.0:6000->5000/tcp docker_registry

3、上传镜像:

(1)获取镜像id:

[root@controller-node1 docker]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

liuchang/nginx latest fde9e02c853e 45 minutes ago 417MB

(2)打标签:

[root@controller-node1 docker]# docker tag fde9e02c853e 127.0.0.1:6000/liuchang/nginx

[root@controller-node1 docker]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

127.0.0.1:6000/liuchang/nginx latest fde9e02c853e About an hour ago 417MB

liuchang/nginx latest fde9e02c853e About an hour ago 417MB

(3)登录验证:

[root@controller-node1 ~]# docker login 127.0.0.1:6000

Username: liuchang

Password:

WARNING! Your password will be stored unencrypted in /root/.docker/config.json.

Configure a credential helper to remove this warning. See

https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

(4)上传 :

[root@controller-node1 ~]# docker push 127.0.0.1:6000/liuchang/nginx

The push refers to repository [127.0.0.1:6000/liuchang/nginx]

0fbeab40170e: Pushed

81cea1d9161a: Pushed

b83912a543f8: Pushed

d69483a6face: Pushed

latest: digest: sha256:eaffc30ee568439a52ead46c544eff4ae76e3573eccea3b3ea2ffca9680a7c52 size: 1159

(5)镜像在仓库中的存储位置:

[root@controller-node1 ~]# docker exec -it docker_registry sh

/ # df -hT

/dev/sda3 xfs 57.8G 3.2G 54.6G 6% /var/lib/registry

/ # ls /var/lib/registry/docker/registry/v2/repositories/liuchang/nginx/

_layers _manifests _uploads

4、在远端从仓库中下载镜像:

[root@slave-node1 ~]# docker pull 172.16.1.90:6000/liuchang/nginx

Using default tag: latest

Error response from daemon: Get https://172.16.1.90:6000/v2/: http: server gave HTTP response to HTTPS client

报错原因是:docker客户端使用https去访问仓库,但是仓库是http;

#修改客户端docker.service参数:

[root@slave-node1 ~]# vim /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd --insecure-registry=172.16.1.90:6000

[root@slave-node1 ~]# systemctl daemon-reload

[root@slave-node1 ~]# systemctl restart docker

[root@slave-node1 ~]# docker pull 172.16.1.90:6000/liuchang/nginx

Using default tag: latest

latest: Pulling from liuchang/nginx

8ba884070f61: Already exists

8f2fa3d3a0ea: Pull complete

fc6c3bddadad: Pull complete

b5e077e2ca87: Pull complete

Digest: sha256:eaffc30ee568439a52ead46c544eff4ae76e3573eccea3b3ea2ffca9680a7c52

Status: Downloaded newer image for 172.16.1.90:6000/liuchang/nginx:latest

[root@slave-node1 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

172.16.1.90:6000/liuchang/nginx latest fde9e02c853e 3 hours ago 417MB

15.11、总结:

1、运行docker info 出现如下错误:

(1)错误信息:

WARNING: bridge-nf-call-iptables is disabled

WARNING: bridge-nf-call-ip6tables is disabled

(2)解决办法:

vim /etc/sysctl.conf

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

sysctl -p

2、查看docker的存放位置:

sudo docker info | grep "Docker Root Dir"

通过软连接进行扩容磁盘;

3、Docker监听远程端口实现远程调用API:

vim /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

4、卸载docker:

yum remove docker-ce

rm -rf /var/lib/docker/

#删除镜像,容器所在的目录;

5、如何升级docker:

下载所需要的docker版本docker-ce docker-ce-cli containerd.io(清华开源镜像站可以看到);

yum -y upgrade <新版本的rpm>

升级之前最好做好相关数据的备份;

6、docker daemo参数解释(/usr/lib/systemd/system/docker.service,也可以在启动容器的时候添加);

--api-enable-cors=false #远程API调用。

-b, --bridge="" #桥接一个系统上的网桥设备到 Docker 容器里,当使用 none 可以停用容器里的网络

--bip="" #使用 CIDR 地址来设定网络桥的 IP。此参数和 -b 不能一起使用。

-D, --debug=false #开启Debug模式。例如:docker -d -D

-d, --daemon=false #开启Daemon模式。

--dns=[] #设置容器使用DNS服务器。例如: docker -d --dns 8.8.8.8

-dns-search=[] #设置容器使用指定的DNS搜索域名。如: docker -d --dns-search example.com

--exec-driver="native" #设置容器使用指定的运行时驱动。如:docker -d -e lxc

-G, --group="docker" #在后台运行模式下,赋予指定的Group到相应的unix socket上。注意,当此参数 --group 赋予空字符串时,将去除组信息

-g, --graph="/var/lib/docker" #设置Docker运行时根目录

-H, --host=[] #设置后台模式下指定socket绑定,可以绑定一个或多个 tcp://host:port, unix:///path/to/socket, fd://* 或 fd://socketfd。

#如:$ docker -H tcp://0.0.0.0:2375 ps 或者$ export DOCKER_HOST="tcp://0.0.0.0:2375"$ docker ps

-icc=true #设置启用内联容器的通信。

--ip="0.0.0.0" #设置容器绑定IP时使用的默认IP地址

--ip-forward=true #设置启动容器的 net.ipv4.ip_forward

--iptables=true #设置启动Docker容器自定义的iptable规则

--mtu=0 #设置容器网络的MTU值,如果没有这个参数,选用默认 route MTU,如果没有默认route,就设置成常量值 1500。

-p, --pidfile="/var/run/docker.pid" #设置后台进程PID文件路径。

-r, --restart=true #设置重启之前运行中的容器

-s, --storage-driver="" #设置容器运行时使用指定的存储驱动,如,指定使用devicemapper,可以这样:docker -d -s devicemapper

--selinux-enabled=false #设置启用selinux支持

--storage-opt=[] #设置存储驱动的参数

--registry-mirror=[] #设置dokcer镜像站

--insecure-registry=xxx.xxxx.xxx.xxx:port #解决私有仓库https认证失败的问题,一般配置在客户端;

unix:///var/run/docker.sock

7、docker桥接网络路由:

1、宿主机:

[root@controller-node1 ~]# route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

0.0.0.0 10.0.0.253 0.0.0.0 UG 100 0 0 eth0

10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0

172.16.1.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1

172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0

2、docker容器:

[root@f31ed0367601 /]# route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

0.0.0.0 172.17.0.1 0.0.0.0 UG 0 0 0 eth0

172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0

8、私有仓库和公库:

公有库可以搜索镜像,上传和下载镜像时需要使用的格式为:user/registry:<版本号>;

私有库不可以搜索镜像,上传和下载镜像时需要使用的格式为:ip:5000/user/registry,不能使用版本号;

15、docker的更多相关文章

  1. CI Weekly #3 | 关于微服务、Docker 实践与 DevOps 指南

    CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...

  2. Docker入门教程(六)另外的15个Docker命令

    Docker入门教程(六)另外的15个Docker命令 [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第六篇,继续介绍Docker命令.之前的第二篇文章 ...

  3. 基于.net core微服务(Consul、Ocelot、Docker、App.Metrics+InfluxDB+Grafana、Exceptionless、数据一致性、Jenkins)

    1.微服务简介 一种架构模式,提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(RESTfu ...

  4. 三、Docker镜像的相关操作

    原文:三.Docker镜像的相关操作 一.查看本地镜像: docker images 二.使用某个镜像来运行容器: docker run -t -i xxxx(镜像名):xx.xx(版本,不带即最新) ...

  5. 8、Docker常用安装:tomcat、mysql、redis

    1.总体步骤 搜索镜像 拉取镜像 查看镜像 启动镜像 停止容器 移除容器 2.安装tomcat 1.docker hub上面查找tomcat镜像 docker search tomcat 2.从doc ...

  6. Drools 7.15.0 docker容器方式部署

    关于drools的相关介绍就不再赘述了,关于drools网上的资料都很少,或者都有些老了,最近折腾了一下,记录下安装部署的过程,希望能节省下大家的时间. 一.快速部署 1.拉取基础镜像,命令如下: d ...

  7. 七、docker镜像私有仓库

    在Docker中,当我们执行 docker pull xxx 的时候 ,它实际上是从 hub.docker.com 这个地址去查找,这就是 Docker 公司为我们提供的公共仓库.在工作中,我们不可能 ...

  8. 四、docker容器管理

    一.docker容器管理 1.1 容器查看-ps命令 显示本地容器列表,但是默认不显示关闭的容器,只显示运行中的容器,除非加上命令选项 -a 用法:docker ps [-a 显示所有容器,默认只显示 ...

  9. ABP(现代ASP.NET样板开发框架)系列之15、ABP应用层——应用服务(Application services)

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之15.ABP应用层——应用服务(Application services) ABP是“ASP.NET Boiler ...

随机推荐

  1. Linux_LVM管理

    一.Ivm的应用场景及其弊端 1.应用场景: 随着公司的发展,数据增长较快,最初规划的磁盘容量不够用了 2.弊端: 数据不是直接存放在硬盘上,而是在硬盘的.上面又虚拟出来--层逻辑卷存放数据,故而增加 ...

  2. php-round()四舍六入

    今天被问到了四舍六入的问题,好吧,第一次听说.后来查询之后说是银行家算法用的 摘自PHP官方文档.http://php.net/manual/zh/function.round.php (PHP 4, ...

  3. 027. Python面向对象的__init__方法

    __init__魔术方法(构造方法) 触发时机:实例化对象,初始化的时候触发 功能:为对象添加成员 参数:参数不固定,至少一个self参数 返回值:无 基本用法,至少含有一个参数 class MyCl ...

  4. 云计算OpenStack环境搭建(4)

    准备工作: 准备3台机器,确保yum源是可用的,分别为控制节点(192.168.11.3).计算节点(192.168.11.4)和存储节点(192.168.11.5) 控制节点:OpenStack日常 ...

  5. flink-cdc读取postgres报异常,没有发布表

    异常信息 must be superuser to create FOR ALL TABLES publication 必须是超级用户才能为所有发布表创建 网上搜索了一天,都毫无头绪,后面搜索到了一个 ...

  6. WPF 2D图形 Shape入门(一)--Shape

    本文是篇WPF Shape的入门文章 Shape 首先看看shape的继承链关系: 一个Shape具有哪些重要属性: 属性 说明 DefiningGeometry 默认的几何形状 RenderedGe ...

  7. 关于Python闭包的一切

    任何把函数当做一等对象的语言,它的设计者都要面对一个问题:作为一等对象的函数在某个作用域中定义,但是可能会在其他作用域中调用,如何处理自由变量? 自由变量(free variable),未在局部作用域 ...

  8. celery 简单示例

    目录结构 第一步  celery_task 里面的celery文件 import time from celery import Celery # celery from celery.schedul ...

  9. Docker学习(14) Docker容器的数据管理

    Docker容器的数据管理 Docker容器的数据卷 重要: Docker的数据卷容器 Docker数据卷的备份和还原

  10. MindSpore接口mindspore::api

    MindSpore接口mindspore::api Context #include <context.h> Context类用于保存执行中的环境变量. 静态公有成员函数 Instance ...