docker网络、compose(2)

[toc]html

docker网络

docker的网络比较简单,其实只要是对vmware workstation的网络有所理解的话都能很好的理解docker的网络模式。python

Docker容器的网络模式nginx

  1. bridge模式,让容器跟docker0网卡桥接。上网经过nat上网,这其实就是vmware workstation当中的NAT网络。web

  2. host模式,让容器和宿主机共享网络,这其实才是vmware当中的桥接模式。redis

  3. none,关闭容器网络docker

先说一下docker当中的bridge模式,这实际上是vmware的中NAT模式,容器的网关是物理机的docker0网卡的IP,容器上网时将数据包交给docker0网卡,docker0网卡经过nat让物理机的eth0代理上网,默认就是这种网络模式,默认是172.17网段。centos

host模式就是容器的网卡和物理机的网卡eth0处于同等地位,与vmware workstation当中的桥接差很少,可是仍是有一些不一样的,vmware workstation的桥接是和物理机地位同等,但IP不一样,而docker是容器的网络配置和物理是如出一辙的,IP也是同样的。bash

//查看网络方式docker network ls,对应三种方式
[root@docker1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
6c8ba509a90d        bridge              bridge              local
2e75dbc4f41d        host                host                local
84af08d64d0b        none                null                local

Docker默认的网络方式观察网络

docker run -d centos:nginx
docker exec -it fd415027a7bd /bin/bash
yum install bridge-utils -y
brctl show

//表示这三个网卡veth开头的三个网卡都是容器的网卡,都经过docker0网卡上网,bridge模式。
[root@docker1 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242443c94c4	no		veth9031fe3 
										vethb716c93
										vethbb7ce87

桥接docker0默认外部没法访问进去,得开通映射才能访问进去,下面就讲映射!!这特么和vmware workstation好像呀!!!!!app

桥接

桥接docker0加端口映射能够实现跟外界通信

//一对一的映射,8080指物理机的端口,后面的80指容器的端口,侦听到物理机的全部网卡上0.0.0.0
docker run -d -p 8080:80 centos:nginx
root@docker1 ~]# docker ps
0.0.0.0:8080->80/tcp

//仅侦听到物理机的某一个网卡
docker run -d -p 192.168.237.50:8080:80 centos:nginx

//多个端口同时映射操做
多端口映射docker run -d -p 8080:80 -p 6381:6379 centos:web

host

使用host模式,直接使用宿主机的网络,可直接外界通信

docker run --net=host -d centos:redis

直接就能外网通信,运行ifconfig查看网卡信息,与物理网卡的信息如出一辙,主机名都同样。

none

使用none模式,关闭容器网络,用得比较少

//进入docker容器查看时,只有127.0.0.1网卡
docker run --net=none -d centos:web

[root@docker1 ~]# docker exec -it 3e2 /bin/bash
[root@3e2502e00d39 /]# ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

文件共享

假设我咱们在容器里面跑nginx,nginx的日志和根目录固然也是存放在容器里面,咱们要想更改的话就要进入到容器里面,进行查看日志和更改站点。咱们可使用文件共享的方式,当宿主的目录映射到容器里面,这样咱们对网站进行操做时就不用再进入到容器里面了。

在宿主机上建立目录:
mkdir -pv /zhanghe/logs /zhanghe/apps

//共享网站和日志
docker run -d -v /zhanghe/logs:/usr/local/nginx/logs -v /zhanghe/apps:/usr/local/nginx/html/apps centos:nginx

特权模式

Docker使用特权的方式去启动容器,无特权不少命令没法运行,好比说更改网关。

[root@7ad3d829bb6d /]# route add default gw 192.168.80.5
SIOCADDRT: Operation not permitted

//经过--privileged=true能够启动特权模式,不多用
docker run --privileged=true -d shijiange:nginx

compose

基础

compose说明

  1. 原生docker命令操做容器比较麻烦

  2. compose能够把操做容器的命令写入到配置文件中,让咱们更方便的操做容器

//compose的安装
yum install python-pip -y;pip install --upgrade pip
yum install python-devel -y
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ docker-compose
docker-compose version
	docker-py version: 4.1.0
compose配置文件:/docker/compose/redis/docker-compose.yml
version: '2'
services:
 redis:                               #名称,进入容器的时候会用到
  image: centos:redis

compose操做容器

//后台启动容器,这种命令必须在docker-compose.yml所在的文件里面
docker-compose up -d

//进入容器,此处的redis对应上面配置文件的名字,不须要再经过ID进入那么麻烦了
docker-compose exec redis bash   

//查看容器,重复启动时会提示已经启动
docker-compose ps

//中止并删除容器
docker-compose down

//重启容器:
docker-compose stop; docker-compose start

经常使用

//compose管理多个容器docker-compose.yml

version: '2'
services:
 redis:
  image: centos:redis
 nginx:
  image: centos:nginx
//compose使用端口映射
version: '2'
services:
 redis:
  image: centos:redis
  ports:
   - "192.168.80.61:6379:6379"
 nginx:
  image: centos:nginx
  ports:
   - "192.168.80.61:8080:80"
   - "192.168.80.61:9090:80"
//compose设置网络模式

version: '2'
services:
 redis:
  image: centos:redis
 nginx:
  image: centos:nginx
  network_mode: "host"
//compose设置文件共享

version: '2'
services:
 nginx:
  image: centos:nginx
  network_mode: "host"
  volumes:
   - /shijiange/logs:/usr/local/nginx/logs
   - /shijiange/apps:/usr/local/nginx/html/apps
//compose同个镜像启动多个容器

docker-compose up -d --scale redis=3
docker-compose exec --index=2 redis bash

作上面这些实验的的时候遇到一个理解就是当把nginx设置为host模式时没法启动容器,缘由是由于宿主机也启动了nginx,占用了80端口。

相关文章
相关标签/搜索