整理:ubuntu 安装最新版docker、docker-compose(亲测成功)

1、安装docker

      通过Docker源安装最新版本。要安装最新的 Docker 版本,首先需要安装 apt-transport-https 支持,之后通过添加源来安装。

方法一:(已验证)

$ sudo apt-get install apt-transport-https
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
$ sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update
$ sudo apt-get install lxc-docker

方法二:

sudo apt-get purge docker.io 
curl -s https://get.docker.io/ubuntu/ | sudo sh
sudo apt-get update
sudo apt-get install lxc-docker

方法三:

以上方法所使用的源也有可能失效,如果失效则可以使用以下方法安装另一个版本:

安装以下包以使apt可以通过HTTPS使用存储库(repository):
$ sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
添加Docker官方的GPG密钥:(时间比较久,如果不成功,则需要代理)
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
使用下面的命令来设置stable存储库:
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
再更新一下apt包索引:
$ sudo apt-get update
安装最新版本的Docker CE:
$ sudo apt-get install -y docker-ce

要想在当前用户正常使用docker,还需要把当前用户加入到docker用户组下:

sudo usermod -aG docker user

重启生效。

2、安装docker-compose

1)下载docker-compose

#1)下载docker-compose
$ sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#2)授权
$ sudo chmod +x /usr/local/bin/docker-compose
#3)查看版本信息
$ docker-compose --version

3、docker常规操作

#查看docker服务是否启动:
sudo systemctl start docker
#启动docker
$ sudo service docker start  #或
$ sudo docker run hello-world
#快速停用或删除容器
(1)停用全部运行中的容器:
$ docker stop $(docker ps -q)
(2)删除全部容器:
$ docker rm $(docker ps -aq)
(3)一条命令实现停用并删除容器:
$ docker stop $(docker ps -q) & docker rm $(docker ps -aq)

4、docker使用实例(以mysql为实例说明)

(1)拉取mysql镜像

sudo docker pull mysql

(2)查看docker镜像

docker images

(3)运行一个mysql实例

$ docker run --name sampson-mysql -p 3308:3308 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
$ 5b6bf6f629bfe46b4c8786b555d8db1947680138b2de1f268f310a15ced7247a
参数:
run            运行一个容器
--name         后面是这个镜像的名称
-p 3308:3308   表示在这个容器中使用3308端口(第二个)映射到本机的端口号也为3308(第一个)
-d             表示后台运行
mysql:5.6      要启动的mysql版本
-e MYSQL_ROOT_PASSWORD=123456             mysql默认密码

(4)连接myql

         容器内连接:

         (1)通过主机命令进入sampson-mysql容器:$ docker exec -it sampson-mysql bash

         (2)连接mysql: $ mysql -uroot -p

 

5、网络处理

   用两台docker容器做datanode,当时配置Docker网络时,使用了Bridge模式,docker0网段(172.0.1.x),宿主机网段(192.1.1.x),使用外部客户端请求下载HDFS文件,去指定的datanode上拉去数据时,外部客户端无法连接到内部的docker容器,抛出的等待超时异常,并重试下载,更换请求的下载地址为可连接的宿主机datanode后, 才成功下载数据。

于是,想要对docker的网络配置进行修改,将docker容器的IP地址设置成与宿主机同网段,并且相互连通。

 

 


docker网络的四种方式:

1.Host模式:

Host 模式并没有为容器创建一个隔离的网络环境。

该模式下的Docker 容器会和Host宿主机共享同一个网络namespace, Docker Container可以和宿主机一样,使用宿主机的eth0,实现和外界的通信。

Host模式特点包括:

  • 容器没有隔离的 network namespace
  • 容器的 IP 地址同 Docker host 的 IP 地址
  • 注意:容器中服务端口号不能与Host宿主机上已经使用的端口号相冲突
  • host 模式能够和其它模式共存

2.Container模式

Container网络模式是 Docker 中一种较为特别的网络的模式。处于这个模式下的 Docker 容器会共享其他容器的网络环境,因此,至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。

3.None模式

None 网络就是什么都没有的网络。挂在这个网络下的容器除了 lo,没有其他任何网卡。需要我们自行去配置。

4.Bridge模式

Docker 容器默认使用Bridge模式的网络。

Docker的Bridge模式和VM虚拟机的Bridge模式不同,虽然也叫Bridge,但实质上类似于VM的NAT模式。

原理是在宿主机上虚出一块网卡bridge0,然后所有容器会桥接在这块网卡的网段上。默认情况下容器能访问外部网络,但外部网络无法访问容器,需要通过暴露容器端口的方式(docker run -p)让外部网络访问容器内的服务。

 


看完了上面的介绍,当前使用的Bridge模式不适合场景,修改网络配置。

写一下曾经试过的几种方法:

注意:

如果你需要宿主机与Docker容器互通,前面两种办法不要试!!!不好使!!!

如果你仅需要Docker容器与宿主机网段相同,容器与其他同网段节点相互通信,不与宿主机进行通信,可以使用第一种方法!!

第一种办法:

创建docker  macvlan

Docker官方在1.12版本之后引入了macvlan网络驱动,可以更简单的为容器配置桥接网络

介绍一下macvlan:

macvlan的原理是在宿主机物理网卡上虚拟出多个子网卡,通过不同的MAC地址在数据链路层进行网络数据转发的,它是比较新的网络虚拟化技术,需要较新的内核支持(Linux kernel v3.9–3.19 and 4.0+)

来源: http://www.louisvv.com/archives/695.html

 docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=em1 mynet

参数说明:

-d macvlan  创建macvlan网络,使用macvlan网络驱动

–subnet 指定宿主机所在网段

–gateway 指定宿主机所在网段网关

-o parent 继承指定网段的网卡

测试一下:运行容器

docker  run --net=mynet --ip=192.168.1.100 --name=test -itd centos /bin/bash

使用宿主机去ping 192.168.1.100,这时,问题出现了

[root@node1 ~]# ping 192.168.1.100
PING 192.168.1.100 (192.168.1.100) 56(84) bytes of data.
From 192.168.1.100 icmp_seq=1 Destination Host Unreachable
From 192.168.1.100 icmp_seq=2 Destination Host Unreachable
From 192.168.1.100 icmp_seq=3 Destination Host Unreachable

目的地址不可达,使用别的机器去ping 192.168.1.100,ping通了,进入容器内,也ping不通宿主机。

使用macVLAN模式的容器,无法ping通宿主机,宿主机也无法ping通该容器,对其他同网段的服务器和容器都可以联通。

第二种办法

使用pipework为docker容器配置独立IP

安装pipework

wget https://github.com/jpetazzo/pipework/archive/master.zip
unzip master.zip 
cp pipework-master/pipework  /usr/local/bin/
chmod +x /usr/local/bin/pipework 

创建两个容器实例,并不需要默认docker0网桥分配的172.17.0.1网段,设置为–net=none

docker run -itd –name test1 –net=none  -h test1 centos /bin/bash    
docker run -itd –name test1 –net=none  -h test2 centos /bin/bash

接下来,使用pipework命令为容器设置固定IP

[root@node1 ~]# pipework br0 test1 192.168.1.52/24@192.168.1.1
[root@node2 ~]# pipework br0 test2 192.168.1.53/24@192.168.1.1

pipework包含了200多行的shell脚本

通过network namespace,veth pair以及linux bridge完成容器网络的设置,执行过程大概包括:

查看主机是否包含br0网桥,如果不存在就创建,向容器实例test1添加一块网卡,并配置固定IP:192.168.1.53,若test1已经有默认的路由,则删除掉,将@后面的192.168.1.1设置为默认路由的网关,将test1容器实例连接到创建的br0上。

 

[root@test1 ~]# ping 192.168.1.53
PING 192.168.1.53 (192.168.1.53) 56(84) bytes of data.
64 bytes from 192.168.1.53: icmp_seq=1 ttl=64 time=0.296 ms
64 bytes from 192.168.1.53: icmp_seq=2 ttl=64 time=0.131 ms


[root@test1 ~]# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.762 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.209 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.238 ms

说明上面的配置没有问题

但是这时,还没有完,宿主机是ping不同容器的

宿主机有两个网卡,em1和em2,em1作为管理口192.168.1.50,em2没有使用,现在,我们只需要将宿主机的em2网卡添加到br0网桥即可

[root@node1 ~]# brctl addif br0 em2
[root@node1 ~]# brctl show
bridge name bridge id       STP enabled interfaces  
br0     8000.02d111808f50   no      em2
                            veth1pl18006
                            veth1pl184096
                            veth1pl184872
docker0 8000.0242a42ada41   no  

然后再进行相关的测试

使用宿主机去ping 52/53

[root@node1 ~]# ping 192.168.1.52
PING 192.168.1.52 (192.168.1.52) 56(84) bytes of data.
64 bytes from 192.168.1.52: icmp_seq=1 ttl=64 time=0.109 ms
64 bytes from 192.168.1.52: icmp_seq=2 ttl=64 time=0.114 ms
64 bytes from 192.168.1.52: icmp_seq=3 ttl=64 time=0.111 ms


[root@node1 ~]# ping 192.168.1.53
PING 192.168.1.53 (192.168.1.53) 56(84) bytes of data.
64 bytes from 192.168.1.53: icmp_seq=1 ttl=64 time=0.119 ms
64 bytes from 192.168.1.53: icmp_seq=2 ttl=64 time=0.128 ms
64 bytes from 192.168.1.53: icmp_seq=3 ttl=64 time=0.131 ms

进入容器去ping宿主机

[root@test1 ~]# ping 192.168.1.50
PING 192.168.1.50 (192.168.1.50) 56(84) bytes of data.
64 bytes from 192.168.1.50: icmp_seq=1 ttl=64 time=0.035 ms
64 bytes from 192.168.1.50: icmp_seq=2 ttl=64 time=0.049 ms
64 bytes from 192.168.1.50: icmp_seq=3 ttl=64 time=0.024 ms


[root@test2 ~]# ping 192.168.1.50
PING 192.168.1.50 (192.168.1.50) 56(84) bytes of data.
64 bytes from 192.168.1.50: icmp_seq=1 ttl=64 time=0.037 ms
64 bytes from 192.168.1.50: icmp_seq=2 ttl=64 time=0.030 ms
64 bytes from 192.168.1.50: icmp_seq=3 ttl=64 time=0.033 ms

再使用window主机去测试

ping 192.168.1.52
正在 Ping 192.168.1.52 具有 32 字节的数据:
来自 192.168.1.52 的回复: 字节=32 时间=18ms TTL=64
来自 192.168.1.52 的回复: 字节=32 时间=1ms TTL=64
来自 192.168.1.52 的回复: 字节=32 时间=4ms TTL=64
192.168.1.52 的 Ping 统计信息:
    数据包: 已发送 = 3,已接收 = 3,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 1ms,最长 = 18ms,平均 = 7ms

ping 192.168.1.53
正在 Ping 192.168.1.53 具有 32 字节的数据:
来自 192.168.1.53 的回复: 字节=32 时间=20ms TTL=64
来自 192.168.1.53 的回复: 字节=32 时间=7ms TTL=64
来自 192.168.1.53 的回复: 字节=32 时间=11ms TTL=64
来自 192.168.1.53 的回复: 字节=32 时间=2ms TTL=64
192.168.1.53 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 2ms,最长 = 20ms,平均 = 10ms

到这里,问题总算解决了,在ambari上添加两台新配置的容器节点,并分配datanode角色,将原有的bridge网络节点删除即可,外部客户端请求下载HDFS文件不再抛出异常

注意:pipework目前还有缺陷,容器重启后IP设置会自动消失,需要重新设置。

 

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值