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端口。

相關文章
相關標籤/搜索