Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

Vinllen Chen


烛昭

Linux下安装docker

  其实一直都听过docker,但没用过,今天参考几篇文档把docker搞定了。果然起的速度比一般虚拟机快很多。
  这个总结主要是整理工作,大部分内容都在文章最后的文档里已经有说明。

  我的电脑是ubuntu14.04 安装的话用包源进行安装。

$ 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

  然后根据文章末尾给定的文章搞的。

  我一开始下的fedora21,问题好多,比如yum源的问题,命令缺少的问题,搞到最后还是换成了ubuntu。ubuntu命令比较齐全,routeifconfig等一些基本命令都已经有了。
  接下来碰到一个问题:没有iptables,我安装完之后报错:

root@fc9caf09dbaa:/# iptables -nL
iptables v1.4.21: can't initialize iptables table 'filter': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.

解决方案就是在启动docker的时候添加下面这个参数:

--privileged=true
docker run --privileged=true -t -i ubuntu_2 /bin/bash

因为有些功能被禁用了。。。一开始我还以为需要重新编译内核,看来不需要。
  下面这个是docker的网络拓扑图:
docker

  多台虚拟机都是连接在docker0这个虚拟交换机上,再通过port(这个名词好像应该叫interface)连接在宿主机上。这个拓扑不复杂。登录两台虚报机相互ping一下,检查是否连通。实践证明一切OK。
  再检查是否可以连通外网,事实证明也可以,看来docker已经帮我们设置好数据包NAT转发了。
  其实docker的拓扑可以修改,添加网桥,划分网络等一些二层的功能,但不具备三层添加路由器的功能。
  比如,重新新建网桥并删除原网桥:
  除了默认的 docker0 网桥,用户也可以指定网桥来连接各个容器。
  在启动 Docker 服务的时候,使用 -b BRIDGE或--bridge=BRIDGE 来指定使用的网桥。
  如果服务已经运行,那需要先停止服务,并删除旧的网桥。

$ sudo service docker stop
$ sudo ip link set dev docker0 down
$ sudo brctl delbr docker0

  然后创建一个网桥 bridge0。

$ sudo brctl addbr bridge0
$ sudo ip addr add 192.168.5.1/24 dev bridge0
$ sudo ip link set dev bridge0 up

  查看确认网桥创建并启动。

$ ip addr show bridge0
4: bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default
link/ether 66:38:d0:0d:76:18 brd ff:ff:ff:ff:ff:ff
inet 192.168.5.1/24 scope global bridge0
valid_lft forever preferred_lft forever

  配置 Docker 服务,默认桥接到创建的网桥上。

$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
$ sudo service docker start

  启动 Docker 服务。 新建一个容器,可以看到它已经桥接到了 bridge0 上。
  可以继续用 brctl show 命令查看桥接的信息。另外,在容器中可以使用 ip addr 和 ip route 命令来查看 IP 地址配置和路由信息。

  有一个比较恶心的就是,每次用完虚拟机如果更新过资源,记得退出时候把虚拟机commit一下,否则虚拟机不会保存下来。
  命令:

$ sudo docker commit -m "Changed some resource" -a "myUsrname" 0b2616b0e5a8 newVirt

  其中各个参数含义如下:

Create a new image from a container's changes

-a, --author="" Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-m, --message="" Commit message
-p, --pause=true Pause container during commit


0b2616b0e5a8为刚退出container ID,可以通过docker ps -l -q获取

  这些命令和git有些类似。

  还有一个小问题就是每次输入都要sudo权限,神烦,可以通过添加用户组来解决:

# 添加docker用户组
$ sudo groupadd docker
# 把自己加到docker用户组中
$ sudo gpasswd -a myusername docker
# 重启docker后台服务
$ sudo service docker restart
# 注销,然后再登陆
$ exit

  其余基本命令:
  移除镜像:

$ sudo docker rmi training/sinatra
Untagged: training/sinatra:latest
Deleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d
Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f
Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0

  删除所有停止运行的容器:

docker ps -a -q | xargs docker rm

  删除某个image:

docker images查看后docker rmi [id]

  外部访问容器:

直接docker run [id|name] [command]即可

  再还有别的问题可以参考文档。以下为本文参考文档:

http://yeasy.gitbooks.io/docker_practice/content/image/create.html
https://docker.cn/p/docker-15-tips/
http://ikarishinjieva.github.io/tachikoma-blog/post/2014-07-10-docker-some-error/


About the author

vinllen chen

Beijing, China

格物致知


Discussions

comments powered by Disqus