15、docker
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的更多相关文章
- CI Weekly #3 | 关于微服务、Docker 实践与 DevOps 指南
CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...
- Docker入门教程(六)另外的15个Docker命令
Docker入门教程(六)另外的15个Docker命令 [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第六篇,继续介绍Docker命令.之前的第二篇文章 ...
- 基于.net core微服务(Consul、Ocelot、Docker、App.Metrics+InfluxDB+Grafana、Exceptionless、数据一致性、Jenkins)
1.微服务简介 一种架构模式,提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(RESTfu ...
- 三、Docker镜像的相关操作
原文:三.Docker镜像的相关操作 一.查看本地镜像: docker images 二.使用某个镜像来运行容器: docker run -t -i xxxx(镜像名):xx.xx(版本,不带即最新) ...
- 8、Docker常用安装:tomcat、mysql、redis
1.总体步骤 搜索镜像 拉取镜像 查看镜像 启动镜像 停止容器 移除容器 2.安装tomcat 1.docker hub上面查找tomcat镜像 docker search tomcat 2.从doc ...
- Drools 7.15.0 docker容器方式部署
关于drools的相关介绍就不再赘述了,关于drools网上的资料都很少,或者都有些老了,最近折腾了一下,记录下安装部署的过程,希望能节省下大家的时间. 一.快速部署 1.拉取基础镜像,命令如下: d ...
- 七、docker镜像私有仓库
在Docker中,当我们执行 docker pull xxx 的时候 ,它实际上是从 hub.docker.com 这个地址去查找,这就是 Docker 公司为我们提供的公共仓库.在工作中,我们不可能 ...
- 四、docker容器管理
一.docker容器管理 1.1 容器查看-ps命令 显示本地容器列表,但是默认不显示关闭的容器,只显示运行中的容器,除非加上命令选项 -a 用法:docker ps [-a 显示所有容器,默认只显示 ...
- ABP(现代ASP.NET样板开发框架)系列之15、ABP应用层——应用服务(Application services)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之15.ABP应用层——应用服务(Application services) ABP是“ASP.NET Boiler ...
随机推荐
- Linux_LVM管理
一.Ivm的应用场景及其弊端 1.应用场景: 随着公司的发展,数据增长较快,最初规划的磁盘容量不够用了 2.弊端: 数据不是直接存放在硬盘上,而是在硬盘的.上面又虚拟出来--层逻辑卷存放数据,故而增加 ...
- php-round()四舍六入
今天被问到了四舍六入的问题,好吧,第一次听说.后来查询之后说是银行家算法用的 摘自PHP官方文档.http://php.net/manual/zh/function.round.php (PHP 4, ...
- 027. Python面向对象的__init__方法
__init__魔术方法(构造方法) 触发时机:实例化对象,初始化的时候触发 功能:为对象添加成员 参数:参数不固定,至少一个self参数 返回值:无 基本用法,至少含有一个参数 class MyCl ...
- 云计算OpenStack环境搭建(4)
准备工作: 准备3台机器,确保yum源是可用的,分别为控制节点(192.168.11.3).计算节点(192.168.11.4)和存储节点(192.168.11.5) 控制节点:OpenStack日常 ...
- flink-cdc读取postgres报异常,没有发布表
异常信息 must be superuser to create FOR ALL TABLES publication 必须是超级用户才能为所有发布表创建 网上搜索了一天,都毫无头绪,后面搜索到了一个 ...
- WPF 2D图形 Shape入门(一)--Shape
本文是篇WPF Shape的入门文章 Shape 首先看看shape的继承链关系: 一个Shape具有哪些重要属性: 属性 说明 DefiningGeometry 默认的几何形状 RenderedGe ...
- 关于Python闭包的一切
任何把函数当做一等对象的语言,它的设计者都要面对一个问题:作为一等对象的函数在某个作用域中定义,但是可能会在其他作用域中调用,如何处理自由变量? 自由变量(free variable),未在局部作用域 ...
- celery 简单示例
目录结构 第一步 celery_task 里面的celery文件 import time from celery import Celery # celery from celery.schedul ...
- Docker学习(14) Docker容器的数据管理
Docker容器的数据管理 Docker容器的数据卷 重要: Docker的数据卷容器 Docker数据卷的备份和还原
- MindSpore接口mindspore::api
MindSpore接口mindspore::api Context #include <context.h> Context类用于保存执行中的环境变量. 静态公有成员函数 Instance ...