Volume和Bind Mount

Docker提供三种不同方式将数据从宿主机挂载到容器中:volumes,bind mounts和tmpfs

volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)

bind mounts:可以存储在宿主机系统的任意位置

tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统

Volume     #可以多个进程公用一个volume

#创建一个卷
docker volume create nginx-vol
nginx-vol docker volume ls
DRIVER VOLUME NAME
local nginx-vol docker volume inspect nginx-vol
[
{
"CreatedAt": "2018-09-04T21:33:33-04:00", #创建时间
"Driver": "local", #驱动
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data", #挂载点
"Name": "nginx-vol", #卷名
"Options": {},
"Scope": "local"
}
]
#下载一个nginx官方镜像
docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
be8881be8156: Pull complete
65206e5c5e2d: Pull complete
8e029c3e2376: Pull complete
Digest: sha256:1b109555ad28bb5ec429422ee136c5f5ab5ee6faaeb518836a5c9a3b6436a1bd
Status: Downloaded newer image for nginx:latest docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 71c43202b8ac days ago 109MB
centos 5182e96772bf weeks ago 200MB docker run -dit --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
--name:容器的名字 --mount:挂载 src原卷的名字 dst 挂在到容器中的路径
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d86928ac689 nginx "nginx -g 'daemon of…" seconds ago Up seconds /tcp nginx-test
02e7612375e7 "/bin/bash" minutes ago Up minutes distracted_vil
#向容器中的挂载目录创建文件,查看是否挂载成功
docker exec nginx-test touch /usr/share/nginx/html/wk.html #向容器创建文件wk.html docker exec nginx-test ls /usr/share/nginx/html/         #查看文件是否创建成功
50x.html
index.html
wk.html ls /var/lib/docker/volumes/nginx-vol/_data/           #查看本地卷
50x.html index.html wk.html #如果把容器删除,本地的volumes的数据仍然存在,不清空

Bind Mounts

docker run -dit --name nginx-test3 -p : --mount type=bind,src=/var/lib/docker/volumes/nginx-vol/_data,dst=/usr/share/nginx/html nginx
#指定类型,将本地自己创建的目录挂载上去

容器部署LNMP网站平台

首先下载一个wordpress博客

wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz

创建MySQL数据库容器

docker pull mysql:5.6
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.6 1f47fade220d hours ago 256MB
nginx latest 71c43202b8ac days ago 109MB
centos 5182e96772bf weeks ago 200MB #创建一个自定义网络
docker network create lnmp
b59ca0e58388b0857e79781de00dc8d81fba77d9d9969afd06496f087c86f7ea docker network ls
NETWORK ID NAME DRIVER SCOPE
f136adf5eb39 bridge bridge local
b68e9da0b1e6 host host local
b59ca0e58388 lnmp bridge local
cf4b2d0b4394 none null local #启动MySQL数据库容器
docker run -dit --name lnmp_mysql --network lnmp -p : --mount src=mysql-vol,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD= mysql:5.6 --character-set-server=utf8
71e98322f4c2c12772d36a841b5951e8d01c77205f6d4a13d510b3a1e24cc375
自定义网络lnmp如果不提前创建的话,在启动容器进程时会报错
如果没有提前pull好mysql:5.6那么容器在启动时会自动下载对应镜像
如果没有提前docker volume create mysql-vol,那么容器启动时会自动创建
#查看容器lnmp_mysql的日志输出
docker logs lnmp_mysql
#查看容器里启动的进程
docker top lnmp_mysql

向容器里的Mysql创建一个库

docker exec lnmp_mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e"create database wp"'
Warning: Using a password on the command line interface can be insecure.

在docker宿主机上安装mysql的客户端通过端口映射访问容器内的mysql

#安装mysql客户端
yum -y install mysql
#远程方式连接docker宿主机的3306端口
mysql -h192.168.200. -P3306 -uroot -p123456

创建nginx+PHP环境容器

#创建一个网页目录
mkdir -p /www
#下载richarvey/nginx-php-fpm镜像
docker pull richarvey/nginx-php-fpm

docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.6 1f47fade220d hours ago 256MB
nginx latest 71c43202b8ac days ago 109MB
centos 5182e96772bf weeks ago 200MB
richarvey/nginx-php-fpm latest af61232ce682 weeks ago 297MB

#启动richarvey/nginx-php-fpm镜像的容器
docker run -dit --name lnmp_web --network lnmp -p : --mount type=bind,src=/www,dst=/var/www/html richarvey/nginx-php-fpm docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba41b324a1cd richarvey/nginx-php-fpm "docker-php-entrypoi…" seconds ago Up seconds /tcp, /tcp, 0.0.0.0:->/tcp lnmp_web
71e98322f4c2 mysql:5.6 "docker-entrypoint.s…" minutes ago Up minutes 0.0.0.0:->/tcp lnmp_mysql
7c62aad40cab nginx "nginx -g 'daemon of…" hours ago Up hours 0.0.0.0:->/tcp nginx-test
02e7612375e7 "/bin/bash" hours ago Up hours distracted_villani

解压wordpress到网页目录/app/wwwroot下

tar xf wordpress-4.7.-zh_CN.tar.gz -C /www/

博客wordpress访问测试

192.168.50.169:888/wordpress

如果打不开

按顺序执行以下命令一遍
systemctl stop firewalld
systemctl stop iptables.service
iptables -F
iptables -P FORWARD ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT

网络管理

容器网络模式

Docker支持5种网络模式

bridge  ; 默认网络,Docker启动后默认创建一个docker0网桥,默认创建的容器也是添加到这个网桥中

host     :  容器不会获得一个独立的network namespace,而是与宿主机共用一个

none    :   获取独立的network namespace,但不为容器进行任何网络配置

container  :与指定的容器使用同一个network namespace,网卡配置也都是相同的

自定义  :自定义网桥,默认与bridge网络一样

bridge网络类型

#安装bridge管理工具
yum -y install bridge-utils
#查看网桥状态
brctl show
bridge name bridge id STP enabled interfaces
br-b59ca0e58388 .02427e8ae48b no veth34fc3ac
docker0 .0242e96ffd31 no vethbc1ab07
vethccc7741
#查看网络类型
docker network ls
NETWORK ID NAME DRIVER SCOPE
78188ea3507b bridge bridge local
b68e9da0b1e6 host host local
b59ca0e58388 lnmp bridge local
cf4b2d0b4394 none null
#查看容器进程
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
71e98322f4c2 mysql:5.6 "docker-entrypoint.s…" hours ago Up minutes 0.0.0.0:->/tcp lnmp_mysql
7c62aad40cab nginx "nginx -g 'daemon of…" hours ago Up minutes 0.0.0.0:->/tcp nginx-test
02e7612375e7 "/bin/bash" hours ago Up minutes distracted_villani
#查看容器lnmp_mysql的网络信息
docker inspect lnmp_mysql | grep -A "Networks"
"Networks": {
"lnmp": { #网络类型lnmp
"IPAMConfig": null,
"Links": null,
"Aliases": [
"71e98322f4c2"
],
"NetworkID": "b59ca0e58388b0857e79781de00dc8d81fba77d9d9969afd06496f087c86f7ea",
"EndpointID": "c1b8bf54ada9f7d9bb53943b2adcfdab81e33505adaff579f7357307a19dbf37",
"Gateway": "172.18.0.1", #网关172.18.0.1,这就是网桥 br-b59ca0e58388
"IPAddress": "172.18.0.2", #容器IP172.18.0.2
"IPPrefixLen": ,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": ,
"MacAddress": "02:42:ac:12:00:02",
#查看容器lnmp_web的网络信息
docker inspect lnmp_web | grep -A "Networks"
"Networks": {
"lnmp": { #网络类型lnmp
"IPAMConfig": null,
"Links": null,
"Aliases": [
"ba41b324a1cd"
],
"NetworkID": "b59ca0e58388b0857e79781de00dc8d81fba77d9d9969afd06496f087c86f7ea",
"EndpointID": "8c050c4cb67b69179316210e19fb129ebb75ae2fe0ce40b929d6d70dd3d628b6",
"Gateway": "172.18.0.1", #网关172.18.0.1,这就是网桥 br-b59ca0e58388
"IPAddress": "172.18.0.3", #容器IP172.18.0.3
"IPPrefixLen": ,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": ,
"MacAddress": "02:42:ac:12:00:03",
#查看容器nginx-test的网络信息
docker inspect nginx-test | grep -A "Networks"
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "78188ea3507be36ff03aedb3e271c3ca5739983ad12020109b7c739318fd736f",
"EndpointID": "9d9b3e2f0dcb049cabd874a91743f16a86b9dcf4c1f41b4b6d849ca7a5dc18cb",
"Gateway": "172.17.0.1", #网关172.17.0.1,这就是网桥docker0
"IPAddress": "172.17.0.2", #容器IP172.17.0.2
"IPPrefixLen": ,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": ,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}

host网络类型

#启动一个网络类型为host的容器
docker run -dit --name hehe --network host centos: /bin/bash
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0b74acb0c57d centos: "/bin/bash" seconds ago Up seconds hehe
ba41b324a1cd richarvey/nginx-php-fpm "docker-php-entrypoi…" hours ago Up minutes /tcp, /tcp, 0.0.0.0:->/tcp lnmp_web
71e98322f4c2 mysql:5.6 "docker-entrypoint.s…" hours ago Up minutes 0.0.0.0:->/tcp lnmp_mysql
7c62aad40cab nginx "nginx -g 'daemon of…" hours ago Up minutes 0.0.0.0:->/tcp nginx-test
02e7612375e7 "/bin/bash" hours ago Up minutes docker exec 0b hostname -I
192.168.50.169 172.18.0.1 172.17.0.1
#启动一个网络类型为host的容器
docker run -dit --name hehe --network host centos: /bin/bash
运行一个容器 容器名字hehe 网络类型 host 镜像名 开起一个终端
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0b74acb0c57d centos: "/bin/bash" seconds ago Up seconds hehe
ba41b324a1cd richarvey/nginx-php-fpm "docker-php-entrypoi…" hours ago Up minutes /tcp, /tcp, 0.0.0.0:->/tcp lnmp_web
71e98322f4c2 mysql:5.6 "docker-entrypoint.s…" hours ago Up minutes 0.0.0.0:->/tcp lnmp_mysql
7c62aad40cab nginx "nginx -g 'daemon of…" hours ago Up minutes 0.0.0.0:->/tcp nginx-test
e7612375e7 "/bin/bash" hours ago Up minutes
#查看容器的ip
docker exec 0b hostname -I #这就是网络类型为host的容器,ip地址和docker宿主机完全一样
192.168.50.169 172.18.0.1 172.17.0.1
docker exec hostname -I #网桥类型容器
172.17.0.3

none网络类型(用于建立与宿主机的桥接模式)

#启动一个网络类型为none的容器
docker run -dit --name xixi --network none centos:
d19a66e71c68dd54e889fde9d6efda6b1dfa69cb880a3a6fd9c24136b511856a
#查看容器IP地址
docker exec xixi hostname -I
查询后发现,什么IP地址都没有,none类型就是暂时不给容器指定网卡

container网络类型

#启动一个容器,网络类型container,使用distracted_villani容器的网卡
docker run -dit --name wawo --network container:distracted_villani centos: /bin/bash
52dc72b75e32f98c94ded4a9e491814a5e8de718ca7c5c55d4603236a91c61fb
docker inspect | grep -A "Networks"
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "78188ea3507be36ff03aedb3e271c3ca5739983ad12020109b7c739318fd736f",
"EndpointID": "90a80dfd64372423317d5d35c65b12f3e38a3751806578417190618bb173b5aa",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": ,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": ,
"MacAddress": "02:42:ac:11:00:03",
"DriverOpts": null
} docker inspect wawo | grep -A "Networks"
"Networks": {} #test4容器并没有自己的网络设置
}
}
] docker exec wawo hostname -I #test4没有网络设置却有IP地址和test容器完全一样
172.17.0.3

桥接宿主机网络与配置固定IP地址

建立网桥桥接到宿主机网络

#构建一个永久生效的网桥br0
vim /etc/sysconfig/network-scripts/ifcfg-eth0 #在配置文件末尾加入BRIDGE=br0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=704ca798-b347-40df-a13d-c521eadd8929
DEVICE=eth0
ONBOOT=yes
IPV6_PRIVACY=no
BRIDGE=br0 vim /etc/sysconfig/network-scripts/ifcfg-br0 #添加br0配置文件
TYPE=Bridge
BOOTPROTO=static
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.50.169
NETMASK=255.255.255.0
GATEWAY=192.168.50.2
DNS1=192.168.50.2 service network restart #重启网卡 #查看网卡IP
ifconfig eth0
eth0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu      #eth0网卡已经没有IP地址了
inet6 fe80::20c:29ff:fe01:60fa prefixlen scopeid 0x20<link>
ether :0c::::fa txqueuelen (Ethernet)
RX packets bytes (799.1 KiB)
RX errors dropped overruns frame
TX packets bytes (508.3 KiB)
TX errors dropped overruns carrier collisions ifconfig br0
br0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 192.168.50.169 netmask 255.255.255.0 broadcast 192.168.50.255 #网桥br0代替了eth0
inet6 fe80::20c:29ff:fe01:60fa prefixlen scopeid 0x20<link>
ether :0c::::fa txqueuelen (Ethernet)
RX packets bytes (17.7 KiB)
RX errors dropped overruns frame
TX packets bytes (28.3 KiB)
TX errors dropped overruns carrier collisions brctl show
bridge name bridge id STP enabled interfaces
br-b59ca0e58388 .02427e8ae48b no
br0 .000c290160fa no eth0 #网桥br0,桥接在了真实的物理网卡eth0上
                                  veth1pl3506
docker0 .0242e96ffd31 no vethccc7741

通过pipework工具配置容器固定IP

pipework工具下载地址:https://github.com/jpetazzo/pipework.git

#解压安装pipework工具
yum -y install unzip unzip pipework-master.zip
Archive: pipework-master.zip
ae42f1b5fef82b3bc23fe93c95c345e7af65fef3
creating: pipework-master/
extracting: pipework-master/.gitignore
inflating: pipework-master/LICENSE
inflating: pipework-master/README.md
inflating: pipework-master/docker-compose.yml
creating: pipework-master/doctoc/
inflating: pipework-master/doctoc/Dockerfile
inflating: pipework-master/pipework
inflating: pipework-master/pipework.spec mv pipework-master /usr/local/

ln -s /usr/local/pipework-master/pipework /usr/local/bin/

#建立网络类型为none的容器,并通过pipework配置固定ip地址
docker run -dit --name gaga --net none centos:5 /bin/bash pipework br0 gaga 192.168.50.28/@192.168.50.2 #设置容器固定IP为192.168.200.199网关192.168.200.2 docker exec gaga hostname -I #查看容器gaga的IP
192.168.50.28

[root@wk ~]# docker exec -it gaga /bin/bash           #进入容器gaga 
[root@d19a66e71c68 /]# ping www.baidu.com        #在容器内ping外网能ping通
PING www.a.shifen.com (119.75.213.61) 56(84) bytes of data.
64 bytes from 127.0.0.1 (119.75.213.61): icmp_seq=1 ttl=128 time=2.94 ms
64 bytes from 127.0.0.1 (119.75.213.61): icmp_seq=2 ttl=128 time=4.95 ms

在windos上ping容器gaga

docker 管理应用程序数据和网络管理的更多相关文章

  1. Docker 管理应用程序数据

    1.将Docker主机数据挂载到容器 Docker提供三种不同的方式将数据从宿主机挂载到容器中:volumes , bind mounts 和tmpfs volumes:  Docker管理宿主机文件 ...

  2. Docker进阶之七:管理应用程序数据

    管理应用程序数据:Volume Docker提供三种不同的方式将数据从宿主机挂载到容器中:volumes,bind mounts和tmpfs. volumes:Docker管理宿主机文件系统的一部分( ...

  3. Docker 基础知识 - 使用卷(volume)管理应用程序数据

    卷(volumes)是 Docker 容器生产和使用持久化数据的首选机制.绑定挂载(bind mounts)依赖于主机的目录结构,卷(volumes)完全由 Docker 管理.卷与绑定挂载相比有几个 ...

  4. Docker 基础知识 - 使用绑定挂载(bind mounts)管理应用程序数据

    绑定挂载(bind mounts)在 Docker 的早期就已经出现了.与卷相比,绑定挂载的功能有限.当您使用绑定挂载时,主机上的文件或目录将挂载到容器中.文件或目录由其在主机上的完整或相对路径引用. ...

  5. Docker 基础知识 - 使用 tmpfs 挂载(tmpfs mounts)管理应用程序数据

    卷(volumes) 和 绑定挂载(bind mounts) 允许您在主机和容器之间共享文件,这样即使在容器停止后也可以持久存储数据. 如果在 Linux 上运行 Docker,那么还有第三种选择:t ...

  6. Docker管理应用数据

    1.  Manage data in Docker 默认情况下,所有在容器内部创建的文件被存储在一个可写的容器层.这就意味着: 当容器不存在的时候,数据不能被持久化,而且在容器外部想要读取这些数据十分 ...

  7. Mesos+Zookeeper+Marathon的Docker管理平台部署记录(2)- 负载均衡marathon-lb

    之前介绍了Mesos+Zookeeper+Marathon的Docker管理平台部署记录(1)的操作,多余的废话不说了,下面接着说下在该集群环境下的负载均衡marathon-lb的部署过程: 默认情况 ...

  8. Mesos+Zookeeper+Marathon的Docker管理平台部署记录(1)

    随着"互联网+"时代的业务增长.变化速度及大规模计算的需求,廉价的.高可扩展的分布式x86集群已成为标准解决方案,如Google已经在几千万台服务器上部署分布式系统.Docker及 ...

  9. docker集群——介绍Mesos+Zookeeper+Marathon的Docker管理平台

    容器为用户打开了一扇通往新世界的大门,真正进入这个容器的世界后,却发现新的生态系统如此庞大.在生产使用中,不论个人还是企业,都会提出更复杂的需求.这时,我们需要众多跨主机的容器协同工作,需要支持各种类 ...

随机推荐

  1. 利用django 实现个人博客 全记录(二)

    上一篇文章已经把基础环境搭建好了 一  创建app D:\学习\python3.7.3\python manage.py startapp blog 修改 博客的 models.py ) ) def ...

  2. paypal支付 NVP支付 paypal 手续费 GetTransactionDetails

    主要内容: 本文章主要讲解的是NVP的对接,以最简单的接口案例,讲解一下对接NVP的方案. 先提供下paypal 官方文档的主要功能对接说明,如下 1.请求API 服务器端点 描述 https://a ...

  3. 【SpringBoot】整合日志框架

    一.日志框架概述 1.1 日志框架的产生 1.2 市面上的日志框架 二.SLF4j 使用与整合 2.1 如何在系统中使用SLF4j 2.2 如何整合日志框架 2.3 SpringBoot中的日志关系 ...

  4. redis——搭建

    https://blog.csdn.net/sinat_29699167/article/details/79699200 Django使用Redis进行缓存详细最全流程 https://blog.c ...

  5. Java攻城狮面试题录:笔试篇(1)

    1.作用域public,private,protected,以及不写时的区别答:区别如下:不写时默认为friendly 2.ArrayList和Vector的区别,HashMap和Hashtable的 ...

  6. Flutter——Padding组件

    在 html 中常见的布局标签都有 padding 属性,但是 Flutter 中很多 Widget 是没有 padding 属性.这个时候我们可以用 Padding 组件处理容器与子元素直接的间距. ...

  7. Django学习:创建admin后台管理站点

    Django自带一个后台管理站点,方便我们管理数据.这个界面只给管理员使用,并不对大众开放. 创建管理员用户 py manage.py createsuperuser 如下图所示: 用户名不填的话,默 ...

  8. redis和memcacahe、mongoDB的区别

    都是非关系型数据库,性能都非常高,但是mongoDB和memcache.redis是不同的两种类型.后两者主要用于数据的缓存,前者主要用在查询和储存大数据方面,是最接近数据库的文档型的非关系数据库. ...

  9. Selenium&Appium四种等待方式

    一.摘要 本博文主要介绍自动化测试中,无论是selenium或是Appium的四种等待方式,合理的使用等待对代码的稳定性,测试效率都有很大的提高 隐式等待:是在尝试发现某个元素的时候,如果没能立刻发现 ...

  10. anguar @input绑定的属性变化

    Intercept @Input property change in Angular Bharat TiwariFollow Mar 15, 2018 this post is good for A ...