摘要:通過(guò)從虛擬機(jī)的登錄到虛擬機(jī)安裝增加一條記錄修改的啟動(dòng)配置,指定服務(wù)器,順便加上重啟虛擬機(jī)確認(rèn)是否工作正常前面下載了虛擬機(jī)鏡像文件,如果將來(lái)不再需要了閑它占用空間,則可以清理一下
轉(zhuǎn)載請(qǐng)保留出處:
https://github.com/SixQuant/e...
??開(kāi)發(fā)環(huán)境中有時(shí)候想把 Docker 容器實(shí)例當(dāng)做正常的虛擬機(jī)來(lái)用,換句話說(shuō)就是本機(jī)和Docker容器實(shí)例處于同一個(gè)子網(wǎng)中,本機(jī)可以直接通過(guò)IP地址訪問(wèn)Docker容器實(shí)例,而不是通過(guò)中間端口映射的方式來(lái)訪問(wèn)!
??Mac和Windows操作系統(tǒng)都無(wú)法直接支持Docker,都是通過(guò)安裝虛擬機(jī)的方式來(lái)支持Docker功能,Docker Toolbox同時(shí)支持Mac和Windows操作系統(tǒng),實(shí)際上Docker Toolbox在本機(jī)的作用是安裝一套對(duì)應(yīng)的Docker命令可以間接訪問(wèn)虛擬機(jī)中真正的Docker宿主機(jī)。
在Mac下使用 Docker 可以選擇 Docker Toolbox 或 Docker for Mac,Docker for Mac 是 Docker Toolbox 的替代品,但是 Docker for Mac 對(duì)網(wǎng)絡(luò)連通性的支持比較有限,因此目前還是用Docker Toolbox。
最終效果:
MacBook、VirtualBox、Docker容器實(shí)例相互之間可以自由的用IP地址互相訪問(wèn),就像正常的虛擬機(jī)一樣。
可以給 docker 容器指定靜態(tài) IP 地址
容器實(shí)例使用統(tǒng)一的DNS服務(wù)器
前言缺省情況下安裝完Docker Toolbox的網(wǎng)絡(luò)配置如下:
Host | IP Address |
---|---|
MacBook( vboxnet1) | 192.168.33.1 |
docker(VirtualBox) | 172.17.0.1 |
c1 | 172.17.0.2 |
c2 | 172.17.0.3 |
說(shuō)明
Docker Toolbox 會(huì)自動(dòng)安裝VirtualBox虛擬機(jī)
192.168.33.1 是 VirtualBox 在 Mac 上綁定的虛擬網(wǎng)卡vboxnet1的地址
$ ifconfig vboxnet1: flags=8843mtu 1500 ether 0a:00:27:00:00:01 inet 192.168.33.1 netmask 0xffffff00 broadcast 192.168.33.255
c1 和 c2 是 Docker 容器實(shí)例,采用 bridge 模式后自動(dòng)分配的IP地址是172.17.0.2和172.17.0.3
因?yàn)樘幱诓煌木W(wǎng)絡(luò),所以很顯然MacBook無(wú)法直接訪問(wèn)容器實(shí)例c1 和 c2
解決方案:
Docker為了安全原因會(huì)讓Docker容器實(shí)例處于不同網(wǎng)段,既然因?yàn)槭翘幱诓煌W(wǎng)段造成的網(wǎng)絡(luò)不通,那么創(chuàng)建一個(gè)新的Docker網(wǎng)絡(luò),讓它和docker虛擬機(jī)處于同一個(gè)網(wǎng)段即可。
當(dāng)然也可以修改vboxnet1的IP地址使它和 docker0 處于同一網(wǎng)段,但是這種方式不能給容器指定靜態(tài)IP地址。
docker: Error response from daemon: user specified IP address is supported on user defined networks only.
Docker VM:
目標(biāo)如果直接在Linux系統(tǒng)下使用 Docker那么這個(gè)Linux就是Docker VM,如果是在Windows或Mac操作系統(tǒng)中,這個(gè)Docker VM就是VirtualBox里的虛擬機(jī),Docker Toolbox缺省使用boot2docker這個(gè)Linux系統(tǒng),當(dāng)然也可以改用ubuntu或CentOS
??本文以Mac為例,Windows上的操作也類似,因?yàn)橐惭bDNS服務(wù)器等其他服務(wù),boot2docker可能不太夠用,另外服務(wù)器上最常用的操作系統(tǒng)是Centos,因此打算把Docker VM 也換成 Centos7,這樣本機(jī)還可以同時(shí)有一個(gè)Centos環(huán)境。
最終效果:
MacBook、VirtualBox、Docker容器實(shí)例相互之間可以自由的用IP地址互相訪問(wèn),就像正常的虛擬機(jī)一樣。
Docker VM 換成 Centos7
Docker VM 同時(shí)也是DNS服務(wù)器
可以給 docker 容器指定靜態(tài) IP 地址
容器實(shí)例使用統(tǒng)一的DNS服務(wù)器
最終的混雜網(wǎng)絡(luò)配置如下:
Host | IP Address |
---|---|
MacBook | 192.168.33.253 |
docker(VirtualBox) | 192.168.33.1 |
c1 | 192.168.33.2 |
c2 | 192.168.33.3 |
說(shuō)明
192.168.33.253 是 VirtualBox 在 Mac 上綁定的虛擬網(wǎng)卡vboxnet1的新地址
為什么用192.168.33.253,因?yàn)椴捎镁W(wǎng)橋(Bridge)模式后,所有的容器實(shí)例沒(méi)有指定IP地址的時(shí)候是從最小IP開(kāi)始分配的,并且分配的時(shí)候并不知道某個(gè)IP地址已經(jīng)被外面的vboxnet1用了,為了避免容器自動(dòng)分配的IP地址和外面的vboxnet1的IP地址沖突,因此盡可能的給vboxnet1設(shè)置比較大的IP地址
預(yù)備Mac OS X 10.12.6:
VirtualBox - v5.2.2:虛擬機(jī)
Vagrant - v2.0.1:通過(guò)配置文件來(lái)快速創(chuàng)建定制的虛擬機(jī)
Docker Toolbox - v1.10.3:Docker 工具箱,包含了 VirtualBox
請(qǐng)首先下載并安裝 Vagrant 和 Docker Toolbox,Docker Toolbox中包含了VirtualBox,VirtualBox可以也多帶帶安裝最新的版本。
更改vboxnet1 IP address$ VBoxManage hostonlyif ipconfig vboxnet1 --ip 192.168.33.253 --netmask 255.255.255.0
$ ifconfig vboxnet1: flags=8943創(chuàng)建虛擬機(jī)配置文件 Vagrantfilemtu 1500 ether 0a:00:27:00:00:01 inet 192.168.33.253 netmask 0xffffff00 broadcast 192.168.33.255
注意:這里不能直接用centos/7,而是用dolbager/centos-7-docker
$ vi Vagrantfile
Vagrant.configure(2) do |config| config.vm.box = "dolbager/centos-7-docker" config.vm.hostname = "default" config.vm.network "private_network", ip: "192.168.33.1", netmask: "255.255.255.0" config.vm.provider "virtualbox" do |v| v.name = "default" v.memory = "2048" # Change the network adapter type and promiscuous mode v.customize ["modifyvm", :id, "--nictype1", "Am79C973"] v.customize ["modifyvm", :id, "--nicpromisc1", "allow-all"] v.customize ["modifyvm", :id, "--nictype2", "Am79C973"] v.customize ["modifyvm", :id, "--nicpromisc2", "allow-all"] end # Install bridge-utils config.vm.provision "shell", inline: <<-SHELL curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum clean all yum makecache yum update -y yum install bridge-utils net-tools -y SHELL end
配置說(shuō)明:
hostname:
Docker VM 主機(jī)的名稱=default
private_network:
Docker VM 主機(jī)的IP=192.168.33.1
v.memory
內(nèi)存2048M
bridge-utils
創(chuàng)建網(wǎng)橋需要的輔助工具
創(chuàng)建Docker machine default根據(jù) Vagrantfile 運(yùn)行vagrant up命令創(chuàng)建虛擬機(jī)
$ vagrant up
如果下載太慢(它是用 ruby 下載的,速度很慢),也可以用其他方式下載后讓入指定目錄
Mac OS X and Linux: ~/.vagrant.d/boxes
Windows: C:/Users/USERNAME/.vagrant.d/boxes
默認(rèn)的root密碼是vagrant你可以修改為其他密碼
$ vagrant ssh Last login: Fri Jan 13 15:50:24 2017 from 10.0.2.2 [vagrant@default ~]$ su root [root@default vagrant]# passwd [root@default vagrant]# exit [vagrant@default ~]$ exit
默認(rèn)沒(méi)有把ssh用的private_key文件復(fù)制到.vagrant目錄下,我們可以手動(dòng)復(fù)制一下:
$ vagrant ssh-config
$ scp ~/.vagrant.d/boxes/dolbager-VAGRANTSLASH-centos-7-docker/0.2/virtualbox/vagrant_private_key .vagrant/machines/default/virtualbox/private_key
如果上次創(chuàng)建失敗了,則需要先刪除上次安裝的虛擬機(jī) default
$ docker-machine rm default
然后就是讓虛擬機(jī)整合 Docker 功能(也就是在虛擬機(jī)中安裝Docker)了
# Setup the VM as your Docker machine $ docker-machine create --driver "generic" --generic-ip-address 192.168.33.1 --generic-ssh-user vagrant --generic-ssh-key .vagrant/machines/default/virtualbox/private_key --generic-ssh-port 22 default
--driver "generic"
generic表示通用的
docker-machine create --driver "generic" 意思是通過(guò)SSH登錄到已經(jīng)存在的主機(jī)后,給該主機(jī)整合Docker功能,然后據(jù)此創(chuàng)建一個(gè)docker machine。
會(huì)出現(xiàn)一個(gè)錯(cuò)誤提示,不用管它
(default) Couldn"t copy SSH public key : unable to copy ssh key: open .vagrant/machines/default/virtualbox/private_key.pub: no such file or directory
ssh-port 22 default Running pre-create checks... Creating machine... (default) Importing SSH key... (default) Couldn"t copy SSH public key : unable to copy ssh key: open .vagrant/machines/default/virtualbox/private_key.pub: no such file or directory Waiting for machine to be running, this may take a few minutes... Detecting operating system of created instance... Waiting for SSH to be available... Detecting the provisioner... Provisioning with centos... Copying certs to the local machine directory... Copying certs to the remote machine... Setting Docker configuration on the remote daemon... Checking connection to Docker... Docker is up and running! To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env default創(chuàng)建網(wǎng)橋docker1 和 docker network br
通過(guò) vagrant 從虛擬機(jī)的 eth0 登錄到虛擬機(jī)
# Log in to the VM via eth0 $ vagrant ssh Last login: Fri Dec 8 20:04:34 2017 from 10.0.2.2 [vagrant@default ~]$
[vagrant@default ~]$ ip -4 addr 1: lo:mtu 65536 qdisc noqueue state UNKNOWN qlen 1 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0 valid_lft 84972sec preferred_lft 84972sec 3: eth1: mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 inet 192.168.33.1/24 brd 192.168.33.255 scope global eth1 valid_lft forever preferred_lft forever 4: docker0: mtu 1500 qdisc noqueue state DOWN inet 172.17.0.1/16 scope global docker0 valid_lft forever preferred_lft forever
我們可以看到
Docker 在虛擬機(jī)內(nèi)創(chuàng)建了網(wǎng)橋docker0
網(wǎng)橋docker0地址范圍為172.17.0.1/16
網(wǎng)卡eth1的IP地址為192.168.33.1/24
我們接下來(lái)要做的是在虛擬機(jī)中創(chuàng)建一個(gè)新的網(wǎng)橋 docker1 ,并將虛擬機(jī)的eth1綁定到網(wǎng)橋docker0上,并且讓這些配置在虛擬機(jī)重啟也有效。
創(chuàng)建 docker network br
# Create network "br" with a bridge name "docker1" [vagrant@default ~]$ sudo docker network create --driver bridge --subnet=192.168.33.0/24 --gateway=192.168.33.1 --opt "com.docker.network.bridge.name"="docker1" br
創(chuàng)建網(wǎng)橋配置文件docker1
[vagrant@default ~]$ sudo vi /etc/sysconfig/network-scripts/ifcfg-docker1
DEVICE=docker1 TYPE=Bridge BOOTPROTO=static ONBOOT=yes STP=on IPADDR= NETMASK= GATEWAY= DNS1=
vi 保存文件并退出:按ESC鍵 跳到命令模式,然后輸入 “:wq” 回車
修改網(wǎng)卡配置 eth1 :
[vagrant@default ~]$ sudo vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1 BOOTPROTO=static HWADDR= ONBOOT=yes NETMASK= GATEWAY= BRIDGE=docker1 TYPE=Ethernet
重啟虛擬機(jī)
[vagrant@default ~]$ sudo reboot now
通過(guò) vagrant 從虛擬機(jī)的 eth0 登錄到虛擬機(jī)
# Log in to the VM via eth0 $ vagrant ssh Last login: Fri Dec 8 20:04:34 2017 from 10.0.2.2 [vagrant@default ~]$
[vagrant@default ~]$ ip -4 addr 1: lo:mtu 65536 qdisc noqueue state UNKNOWN qlen 1 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0 valid_lft 86106sec preferred_lft 86106sec 4: docker1: mtu 1500 qdisc noqueue state UP qlen 1000 inet 192.168.33.1/24 scope global docker1 valid_lft forever preferred_lft forever 5: docker0: mtu 1500 qdisc noqueue state DOWN inet 172.17.0.1/16 scope global docker0 valid_lft forever preferred_lft forever
我們可以看到已經(jīng)起作用了。
然后退出虛擬機(jī),在Mac主機(jī)里設(shè)置一下環(huán)境變量:
$ eval $(docker-machine env default) # Setup the environment
我們就可以測(cè)試是否一切正常了。
運(yùn)行Docker容器實(shí)例不指定IP啟動(dòng)容器,IP 將從192.168.33.2開(kāi)始逐個(gè)遞增:
$ docker run -d --net=br --name=c1 nginx $ docker run -d --net=br --name=c2 nginx
通過(guò)可以docker network inspect命令查看給容器分配的IP地址
$ docker network inspect bridge
"Containers": { "79e804aa864cde4c919d85ba7a9ce273055dfd827b7216787c849192f46b753d": { "Name": "c2", "EndpointID": "b7c1cf0c0169bac07f8dba37152b0ac3515117655e35a948638a59c9e8ddf841", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "192.168.33.3/16", "IPv6Address": "" }, "c95ce3c20b8fd96f1fbef513c60f3b2c0d5547f9a325a741cdffda51bf24d048": { "Name": "c1", "EndpointID": "e6db861d48f1ec20945af9dcbac6438cbc2c4c3dcdf59cac6c6e74664b6456ce", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "192.168.33.2/16", "IPv6Address": "" } },
都讓,你也可以直接指定靜態(tài)IP地址
$ docker run -d --net=br --name=c6 --ip=192.168.33.6 nginx
然后你應(yīng)該可以在Mac中直接通過(guò)IP訪問(wèn)這些容器實(shí)例了:
$ ping -c 3 192.168.33.2 $ ping -c 3 192.168.33.3 $ ping -c 3 192.168.33.6
也可以通過(guò)瀏覽器來(lái)確認(rèn)是否可以訪問(wèn)(第一次訪問(wèn)會(huì)稍微需要等一會(huì))
http://192.168.33.2 http://192.168.33.3 http://192.168.33.6DNS
因?yàn)榘踩脑?,Docker容器是不允許映射 /etc/hosts的,所以只能臨時(shí)給容器實(shí)例增加IP映射或讓容器使用統(tǒng)一的 DNS 服務(wù)器
方法一:臨時(shí)增加IP映射$ docker run -it --net=br --add-host zk:192.168.33.2 --name c4 -h c4 busybox 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 192.168.33.2 zk 192.168.33.3 c4方法二:指定DNS服務(wù)器
我采用方法二:給虛擬機(jī)安裝DNS服務(wù)器dnsmasq,并且讓所有容器實(shí)例缺省指向這個(gè)DNS服務(wù)器。
通過(guò) vagrant 從虛擬機(jī)的 eth0 登錄到虛擬機(jī)
# Log in to the VM via eth0 $ vagrant ssh Last login: Fri Dec 8 20:04:34 2017 from 10.0.2.2 [vagrant@default ~]$
安裝 dnsmasq
[vagrant@default ~]$ sudo yum -y install dnsmasq [vagrant@default ~]$ sudo systemctl start dnsmasq [vagrant@default ~]$ sudo systemctl enable dnsmasq
增加一條記錄
[vagrant@default ~]$ sudo vi /etc/hosts
192.168.33.2 zk
修改Docker的啟動(dòng)配置,指定DNS服務(wù)器,順便加上registry-mirrors
[vagrant@default ~]$ sudo vi /etc/docker/daemon.json
{ "dns" : ["192.168.33.1"], "registry-mirrors" : ["https://fnfrb3qa.mirror.aliyuncs.com"] }
dockerd document
重啟 Docker 虛擬機(jī)
[vagrant@default ~]$ sudo systemctl daemon-reload [vagrant@default ~]$ sudo systemctl restart docker [vagrant@default ~]$ exit
確認(rèn)DNS是否工作正常
$ docker run -d --net=br --name c5 busybox top $ docker exec c5 ping -c 3 zk PING zk (192.168.33.2): 56 data bytes 64 bytes from 192.168.33.2: seq=0 ttl=64 time=0.018 ms 64 bytes from 192.168.33.2: seq=1 ttl=64 time=0.042 ms 64 bytes from 192.168.33.2: seq=2 ttl=64 time=0.042 msDone
Vargrant前面下載了虛擬機(jī)鏡像文件,如果將來(lái)不再需要了閑它占用空間,則可以清理一下
$ vagrant box list $ vagrant box remove dolbager/centos-7-docker
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/27165.html
摘要:模式容器直接使用宿主機(jī)的網(wǎng)絡(luò)配置,包括網(wǎng)卡,路由等,這種方案下,從網(wǎng)絡(luò)層面來(lái)看,容器就不是容器了,只是一個(gè)宿主機(jī)上的進(jìn)程端口而已。 注:本篇僅僅是對(duì)各個(gè)網(wǎng)絡(luò)方案的簡(jiǎn)介和思考。需要深入學(xué)習(xí)如何部署和使用的同學(xué)請(qǐng)自行度娘~ 中小docker用戶的苦惱 docker的使用者十分廣泛,不止有網(wǎng)易蜂巢,daocloud,時(shí)速云這類的已經(jīng)成熟化的公有云服務(wù),許多中小型企業(yè)內(nèi)部也在試圖將docker...
摘要:模式容器直接使用宿主機(jī)的網(wǎng)絡(luò)配置,包括網(wǎng)卡,路由等,這種方案下,從網(wǎng)絡(luò)層面來(lái)看,容器就不是容器了,只是一個(gè)宿主機(jī)上的進(jìn)程端口而已。 注:本篇僅僅是對(duì)各個(gè)網(wǎng)絡(luò)方案的簡(jiǎn)介和思考。需要深入學(xué)習(xí)如何部署和使用的同學(xué)請(qǐng)自行度娘~ 中小docker用戶的苦惱 docker的使用者十分廣泛,不止有網(wǎng)易蜂巢,daocloud,時(shí)速云這類的已經(jīng)成熟化的公有云服務(wù),許多中小型企業(yè)內(nèi)部也在試圖將docker...
摘要:后面會(huì)涉及以配置文件進(jìn)行部署。的調(diào)度完成,被分配到指定上。這是的一種最終狀態(tài)。圖相較而言,除了提供的基本功能,還支持聲明式的更新和回滾。共享數(shù)據(jù)存儲(chǔ)的問(wèn)題主要分為數(shù)據(jù)臨時(shí)存儲(chǔ)與持久性存儲(chǔ)。 帶著問(wèn)題學(xué) Kubernetes 基本單元 Pod 摘要:本文屬于原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)保留出處:https://github.com/jasonGeng88/blog 文章一:帶著問(wèn)題學(xué) Kube...
摘要:后面會(huì)涉及以配置文件進(jìn)行部署。的調(diào)度完成,被分配到指定上。這是的一種最終狀態(tài)。圖相較而言,除了提供的基本功能,還支持聲明式的更新和回滾。共享數(shù)據(jù)存儲(chǔ)的問(wèn)題主要分為數(shù)據(jù)臨時(shí)存儲(chǔ)與持久性存儲(chǔ)。 帶著問(wèn)題學(xué) Kubernetes 基本單元 Pod 摘要:本文屬于原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)保留出處:https://github.com/jasonGeng88/blog 文章一:帶著問(wèn)題學(xué) Kube...
閱讀 2675·2021-11-11 16:55
閱讀 718·2021-09-04 16:40
閱讀 3109·2019-08-30 15:54
閱讀 2649·2019-08-30 15:54
閱讀 2444·2019-08-30 15:46
閱讀 431·2019-08-30 15:43
閱讀 3252·2019-08-30 11:11
閱讀 3007·2019-08-28 18:17