介绍
Docker的英文本意是“搬运工”,Docker搬运的是集装箱(Container)可以成为容器,我们可以把WEB应用以及依赖库打包进一个可移植的容器里传播,解决了应用部署的平台兼容性问题,同时她也是一种轻量级的虚拟化技术可以做到秒级启动一个容器(类似小虚拟机,区别启动快、可以传播);
镜像是docker 创建、启动一个容器的文件系统,这个文件系统包含依赖包、命令工具、APP等;
安装和开启服务
yum install epel-release -y # 如果没有扩展源,需要先安装扩展源
yum install docker # 安装,由于Docker要求Linux内核版本必须在要在3.10,所以centos6.X版本需要 yum install docker-io
systemctl start docker.service # 开启服务
docker info # 查看docker信息
镜像
修改镜像源
默认源连不上,修改镜像下载源,加入以下内容
vim etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
更多国内源如下:
# Docker 官方中国区
https://registry.docker-cn.com
# 网易
http://hub-mirror.c.163.com
# ustc
https://docker.mirrors.ustc.edu.cn
注意:docker版本在1.12以下需要找到docker配置文件
目录位置为/etc/default/docker
,如果没有,那么就在/etc/sysconfig/docker
,如果还是没有,那么就去/etc/default/
下创建一个docker文件吧。
搜索镜像文件
docker search centos # 搜索centos
拉取镜像
docker pull docker.io/centos # 拉取 镜像名
删除镜像
docker rmi <镜像名|镜像ID>
容器
创建容器
进入交互式容器
docker run -i -t docker.io/centos /bin/bash # -it可以连写
- docker run 创建容器
- -t 指定镜像
- -i 交互式
进入交互式容器的/bin/bash后,可以输入常用的操作命令,比如ls
指定容器名
docker run --name <容器名> -it <镜像名> /bin/bash # --name 指定容器名
端口映射
# 使用 -p 8000:80 创建端口映射(映射docker的80端口到物理机8000)
# docker run -d -p 8000:80 -p 22:22 同时映射多个端口,比如22给ssh服务用,80给Django用,即凡是需要提供给外部访问的,都需要作端口映射。
docker run --name ssh_server -it -p 8000:80 <镜像名> /bin/bash
注意:端口映射只能在docker run时操作
通过exit
可以退出容器。
查看容器
docker ps # 正在运行的容器
docker ps -a # 所有的容器
docker ps -l # 最近一次的容器
docker ps -q # 最近一次的容器的id
查看容器详细信息
docker inspect <容器ID|容器名>
结果类似于json数据,可以通过| grep
来过滤需要的信息
启动和关闭容器
docker start <容器名|容器ID>
docker stop <容器名|容器ID>
进入容器
进入容器前需要先启动
# 这种方式可以进入正在运行的容器,但是exit退出时容器也就停止运行了
docker attach <容器名|容器ID>
# 另一种方式进入容器,退出时容器不终止运行
docker exec -it test1 /bin/bash # /bin/bash必须加
删除容器
# 删除一个容器
docker rm <容器名|容器ID>
# 强制删除一个正在运行的容器
docker rm -f <容器名|容器ID>
# 删除全部容器(使用 -f 可以强制删除正在运行的容器)
docker rm `docker ps -aq`
说明:飘号内的内容会作为命令来执行,并将结果交给rm命令
容器打包成镜像
docker save -o <导出的文件名.zip> <镜像名> # 如果要指定路径,必须先创建路径中的文件夹
# 比如:
mkdir img
docker save -o /img/vimenv.zip vimenv.img
导入镜像
docker load < <镜像文件名.zip> # < 记住别漏了重定向符号
- 导入之后使用
docker images
查看镜像 - 使用导入的镜像
docker run
来创建容器 - 新的容器内含以前打包好的项目的数据,直接运行
以上内容来自博客:https://blog.csdn.net/Ayhan_huang/article/details/78953924?utm_source=copy
一下内容来自于博客:https://blog.csdn.net/ZJin_Hua/article/details/52041757
6.5 不同主机间容器通信
不同容器之间的通信可以借助于 pipework 这个工具:
$ git clone https://github.com/jpetazzo/pipework.git $ sudo cp -rp pipework/pipework /usr/local/bin/
安装相应依赖软件
$ sudo apt-get install iputils-arping bridge-utils -y
桥接网络
桥接网络可以参考 日常问题处理 Tips 关于桥接的配置说明,这里不再赘述。
# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c291412cd no eth0 docker0 8000.56847afe9799 no vetheb48029
可以删除 docker0,直接把 docker 的桥接指定为 br0。也可以保留使用默认的配置,这样单主机容器之间的通信可以通过 docker0,而跨主机不同容器之间通过 pipework 新建 docker 容器的网卡桥接到 br0,这样跨主机容器之间就可以通信了。
- ubuntu
$ sudo service docker stop $ sudo ip link set dev docker0 down $ sudo brctl delbr docker0 $ echo 'DOCKER_OPTS="-b=br0"' >> /etc/default/docker $ sudo service docker start
- CentOS 7/RHEL 7
$ sudo systemctl stop docker $ sudo ip link set dev docker0 down $ sudo brctl delbr docker0 $ cat /etc/sysconfig/docker | grep 'OPTIONS=' OPTIONS=--selinux-enabled -b=br0 -H fd:// $ sudo systemctl start docker
pipework
不同容器之间的通信可以借助于 pipework 这个工具给 docker 容器新建虚拟网卡并绑定 IP 桥接到 br0
$ git clone https://github.com/jpetazzo/pipework.git $ sudo cp -rp pipework/pipework /usr/local/bin/ $ pipework Syntax: pipework <hostinterface> [-i containerinterface] <guest> <ipaddr>/<subnet>[@default_gateway] [macaddr][@vlan] pipework <hostinterface> [-i containerinterface] <guest> dhcp [macaddr][@vlan] pipework --wait [-i containerinterface]
如果删除了默认的 docker0 桥接,把 docker 默认桥接指定到了 br0,则最好在创建容器的时候加上--net=none,防止自动分配的 IP 在局域网中有冲突。
$ sudo docker run --rm -ti --net=none ubuntu:14.04 /bin/bash root@a46657528059:/# $ # Ctrl-P + Ctrl-Q 回到宿主机 shell,容器 detach 状态 $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a46657528059 ubuntu:14.04 "/bin/bash" 4 minutes ago Up 4 minutes hungry_lalande $ sudo pipework br0 -i eth0 a46657528059 192.168.115.10/24@192.168.115.2 # 默认不指定网卡设备名,则默认添加为 eth1 # 另外 pipework 不能添加静态路由,如果有需求则可以在 run 的时候加上 --privileged=true 权限在容器中手动添加, # 但这种安全性有缺陷,可以通过 ip netns 操作 $ sudo docker attach a46657528059 root@a46657528059:/# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 86:b6:6b:e8:2e:4d inet addr:192.168.115.10 Bcast:0.0.0.0 Mask:255.255.255.0 inet6 addr: fe80::84b6:6bff:fee8:2e4d/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:9 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:648 (648.0 B) TX bytes:690 (690.0 B) root@a46657528059:/# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.115.2 0.0.0.0 UG 0 0 0 eth0 192.168.115.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
使用ip netns添加静态路由,避免创建容器使用--privileged=true选项造成一些不必要的安全问题:
$ docker inspect --format="{{ .State.Pid }}" a46657528059 # 获取指定容器 pid 6350 $ sudo ln -s /proc/6350/ns/net /var/run/netns/6350 $ sudo ip netns exec 6350 ip route add 192.168.0.0/16 dev eth0 via 192.168.115.2 $ sudo ip netns exec 6350 ip route # 添加成功 192.168.0.0/16 via 192.168.115.2 dev eth0 ... ...
在其它宿主机进行相应的配置,新建容器并使用 pipework 添加虚拟网卡桥接到 br0,测试通信情况即可。
另外,pipework 可以创建容器的 vlan 网络,这里不作过多的介绍了,官方文档已经写的很清楚了,可以查看以下两篇文章:
--------------------- 本文来自 浪_淘_沙 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/ZJin_Hua/article/details/52041757?utm_source=copy