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. 【Struts2】拦截器

    一.概述 二.在Struts2中使用拦截器 2.1 步骤 2.2 分析拦截器原理 2.3 关于interceptor与Filter区别: 三.案例 一.概述 介绍拦截器: struts2拦截器使用的是 ...

  2. springboot升级2.0 fastjson报错? 2.0以上应该怎么整合fastjson?

    SpringBoot2.0如何集成fastjson?在网上查了一堆资料,但是各文章的说法不一,有些还是错的,可能只是简单测试一下就认为ok了,最后有没生效都不知道.恰逢公司项目需要将JackSon换成 ...

  3. Python3.5环境安装及使用 Speech问题解决(转)

    修改speech.py line59 修改import thread,改成import threading line157 修改print prompt,改成print(prompt) 对最后的函数_ ...

  4. CDQ 分治解决和点对有关的问题

    具体可以去这篇博客学习: https://oi-wiki.org/misc/cdq-divide/

  5. TensorFlow 拾遗

     1..Here None in placeholder means that a dimension can be of any length.   2..   3.. 4.. 5.. tf.mul ...

  6. R的数据结构--数组

    数组:可以认为数组是矩阵的扩展,它将矩阵扩展到2维以上.如果给定的数组是1维的则相当于向量,2维的相当于矩阵. R语言中的数组元素的类型也是单一的,可以是数值型,逻辑型,字符型或复数型 参数解释 ar ...

  7. mac系统 flutter从安装到第一个应用

    mac系统 安装flutter 分三步: 1. 安装flutter sdk 2. flutter环境变量配置 3. 建立flutter应用 Flutter SDK下载 打开终端执行命令 git clo ...

  8. 前端自动化构建工具 Webpack—— 2 webpack最基本的使用方式

    Webpack可以做什么事情? 1.webpack能够处理JS文件的互相依赖关系: 2.webpacck能够处理JS的兼容问题,把高级的.浏览器不识别的语法,转为 低级的,浏览器能正常识别的语法 we ...

  9. Jmeter设置集合点(并发测试)

    什么是集合点? 让所有请求在不满足条件的时候处于等待状态. 如何实现? 使用jmeter中的同步计时器Synchronizing Timer来实现 集合点的位置 因为集合点是在取样器sampler(例 ...

  10. 面试必会之ArrayList源码分析&手写ArrayList

    简介 ArrayList是我们开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据,ArrayList是线程不安全的,非常适合用于对元素进行查找,效率非常高. 线程 ...