一.Docker
docker 是一个应用容器引擎,让开发者可以打包安装他们的应用,以及依赖包到一个可移植容器中去,然后发布到任何Linux容器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间没有任何接口。
基于go语言并遵循Apache2.0开源协议。
Docker面向对象
容器对象
镜像类
docker在本质上是一个附加系统使用文件系统的不同层构建一个应用层是有可能的
Docer实例是无状态的他们不应该承担任何交易数据,所有的数据应该保存在数据库服务器中。
Docker基于LXC的高级容器引擎,其隔离性主要来自于namespace
Docker所提供的功能:
1、Images(镜像):Docker可以通过Pull和Push命令构建对象到服务中心
2、Containers(容器):Docker可以通过Start/Stop命令管理容器的生命周期
3、Logging(日志):Docker可以通过stdout,stderro捕获输出所有的容器内部信息
4、Volumes(存储):Docker可以创建和管理容器的相关文件存储
5、Networking(网络):Docker可以创建管理虚拟的接口和内部所有容器之间的网络桥接
5、RPC:Docker服务器提供允许外部程序去控制所有容器的行为的API
@http://www.docker.org.cn/docker/70.html
首先在系统上安装docker服务,docker在rhel7.2系统上运行良好,在低版本的系统上有些问题。镜像去网上down
镜像的创建和销毁:
查看本地镜像:docker images
查看本地镜像详情:docker inspect +镜像名称
导入本地镜像:docker load -i +镜像名称
导出本地镜像:docker save rhel >rhel.tar
更新本地镜像:docker commit 适用于对基础镜像做一些公共性的操作,然后重新打包。
删除本地镜像:docker rmi +镜像名称 前提:该镜像没有被占用
容器的销毁和重建:
docker run -it --name vm1 +镜像名称 bash 交互式方法创建一个容器
rhel系列的容器创建必须要有bash
docker run -d --name vm1+镜像名称 后台运行一个容器。
docker ps -a 查看所有容器状态
docker pa 查看当前正在运行的容器状态
docker attach vm1 连接容器
docker logs vm1 查看容器指令输出 -f 可以实时查看
docker inspect vm1 查看容器详情
docker stats vm1 查看容器资源使用率(实时)
docker diff vm1 查看容器修改
docker run -d --name vm1 rhel7 bash -c "while true; do echo westos; sleep 1; done创建后台运行并执行指令的容器
docker stop vm1 停止容器
docker start vm1 启动容器
docker kill vm1 强制中止容器
docker restart vm1 重起容器
docker pause/unpause 暂停/恢复容器。
docker export vm1 > vm1.tar 导出容器
docker import vm1.tar image 导入容器为镜像image
docker数据卷管理:
docker run 在创建容器时使用 -v 参数可以挂载一个或多个数据卷到当前运行的容器中,-v
的作用是将宿主机上的目录作为容器的数据卷挂载到容器中,使宿主机和容器之间可以共
享一个目录。
挂载数据卷到新创建的容器上:
# docker run -it --name westos -v /tmp/data1:/data1 -v /tmp/data2:/data2 rhel7 /bin/bash
-v 参数可以重复使用,挂载多个数据卷到容器中,冒号前面的是宿主机的目录(本地目录
不存在 docker 会自动创建),冒号后面的是容器中的挂载目录。
注:docker commit 时卷的数据不会被保存。
默认挂载可以读写数据卷,也可以只读挂载:
# docker run -it --name westos2 -v /tmp/data2:/data2:ro
rhel /bin/bash
挂载宿主机文件:
#
docker
run
-it
--name
westos3
/etc/yum.repos.d/rhel-dvd.repo:/etc/yum.repos.d/rhel-dvd.repo:ro rhel7 /bin/bash
-v
数据卷容器:
# docker create --name data -v /tmp/sharedata:/sharedata rhel7 /bin/true
# docker run -it --name vm1 --volumes-from data rhel7 /bin/bash
# docker run -it --name vm2 --volumes-from data rhel7 /bin/bash
# docker attach vm1
bash-4.2# cd /sharedata/
bash-4.2# touch vm1file
# docker attach vm2
bash-4.2# ls
passwd vm1file
bash-4.2# touch vm2file
[root@foundation0 ~]# ls /tmp/sharedata/
passwd vm1file vm2file
备份数据卷: 要预先封装tar 工具进去
# docker run --rm --volumes-from data -v /tmp/backup:/backup rhel7 tar cf
/sharedata /backup/test.tar
Dockerfile编写:
首先对基础镜像操作:
bash-4.2# cat /etc/yum.repos.d/rhel7.repo
[rhel7.1]
name=rhel7.0
baseurl = http://172.25.254.33/rhel7.2
#baseurl=file:///var/www/html/rhel7.2
gpgcheck=0
13 yum install -y iputils-20121221-7.el7.x86_64
14 yum install -y net-tools-2.0-0.17.20131004git.el7.x86_64
15 yum install -y procps-ng-3.3.10-3.el7.x86_64
16 ps -ax
17 yum install -y openssh-server openssh-clients
18 yum install -y openssh-client
19 yum install -y openssh-clients
使用ctrl +p+q 退出。
提交修改过的容器:并加上tag 后缀。
[root@foundation33 ~]# docker commit vm1 rhel7:yum
cat Dockerfile
FROM rhel7:yum
MAINTAINER [email protected]
ENV HOSTNAME server1
EXPOSE 22
RUN yum install -y openssh-server openssh-clients && yum clean all
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -q -N ""
RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -q -N ""
RUN ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519 -q -N ""
RUN echo root:westos|chpasswd
CMD ["/usr/sbin/sshd","-D"]
此时,在docker images 中可以发现该镜像。可以使用该镜像创建容器。
二.安装docker
<a href="https://s3.51cto.com/oss/201710/25/8ee7a88fd0b71b0b0e94ca8cc27c8f20.png" target="_blank"></a>
<a href="https://s3.51cto.com/oss/201710/25/17382193424b0e2007000f969ad2b5d5.png" target="_blank"></a>
ip:
<a href="https://s4.51cto.com/oss/201710/25/4c5289bd36d46b277388a8594636f55b.png" target="_blank"></a>
三.docker的使用
1.加载镜像
<a href="https://s2.51cto.com/oss/201710/25/2f733c67e7e309c2da1db9e3739b249f.png" target="_blank"></a>
2.创建容器启动镜像
<a href="https://s2.51cto.com/oss/201710/25/8757d88e988b58c39c60c87e1f758d82.png" target="_blank"></a>
3.保存
<a href="https://s1.51cto.com/oss/201710/25/88f9f8a6fdc5255f679997b6719b6fb5.png" target="_blank"></a>
4.查看容器
<a href="https://s1.51cto.com/oss/201710/25/78c94f9588fd1a672414a322783cfa9d.png" target="_blank"></a>
5.删除容器
<a href="https://s4.51cto.com/oss/201710/25/7cc9c6a1aff178b97b10cde8e3426e40.png" target="_blank"></a>
6.加载一个小游戏
<a href="https://s1.51cto.com/oss/201710/25/fcfc90dc90b40a49207fde488e28ecc5.png" target="_blank"></a>
查看地址
<a href="https://s1.51cto.com/oss/201710/25/5e4d2a889f6551e8aafef8c94744ca93.png" target="_blank"></a>
<a href="https://s1.51cto.com/oss/201710/25/342e1c671c41071324b50eb8f64f80a3.png" target="_blank"></a>
<a href="https://s1.51cto.com/oss/201710/25/3d78312ef2d8fb25156980a55bf44b37.png" target="_blank"></a>
网络访问
<a href="https://s1.51cto.com/oss/201710/25/04d1b9aee3e486f14e5c2935e0eecad5.png" target="_blank"></a>
创建8080映射到80端口,后台运行
<a href="https://s1.51cto.com/oss/201710/25/7efd842f6087fa8503002e24dd0f3715.png" target="_blank"></a>
<a href="https://s1.51cto.com/oss/201710/25/96c191defe1ee3be1b20691121b3f9b5.png" target="_blank"></a>
<a href="https://s2.51cto.com/oss/201710/25/2f068ea7e2f86e8293f50f5015275d57.png" target="_blank"></a>
<a href="https://s3.51cto.com/oss/201710/25/66ff5408ca148abcf81519b35ed92779.png" target="_blank"></a>
<a href="https://s3.51cto.com/oss/201710/25/4eed9c972569525c6699946b3143584b.png" target="_blank"></a>
7.容器镜像里的数据与物理机共享
<a href="https://s4.51cto.com/oss/201710/25/3f617dd0d5c9110fb6d5273d3cf1ab99.png" target="_blank"></a>
<a href="https://s4.51cto.com/oss/201710/25/04e3524738d01d642b186aae30dc77bb.png" target="_blank"></a>
<a href="https://s5.51cto.com/oss/201710/25/d9551d128f7ebc30d212987df2959ece.png" target="_blank"></a>
8.镜像里的数据备份
<a href="https://s1.51cto.com/oss/201710/25/f831ecfa2f52db52695db828d9d64c47.png" target="_blank"></a>
9.用容器部署nginx
<a href="https://s1.51cto.com/oss/201710/25/53b1889db78c802596f95aaceb894254.png" target="_blank"></a>
vim index.html
<a href="https://s1.51cto.com/oss/201710/25/b5217421954bcd993b0bcc134ec57658.png" target="_blank"></a>
<a href="https://s1.51cto.com/oss/201710/25/07c91a5f6291606305f5577a86bda341.png" target="_blank"></a>
<a href="https://s2.51cto.com/oss/201710/25/3b1d858d5394c17411bbb2dea2a34669.png" target="_blank"></a>
<a href="https://s2.51cto.com/oss/201710/25/834863bd05f59dc78bca04b794a03bcd.png" target="_blank"></a>
10.Container 网络模式
容器的四种网络模式:
bridge 桥接模式、host 模式、container 模式和 none 模式启动容器时可以使用 --net 参数指定,默认是桥接模式。
(1) bridge 桥接模式下的 Docker Container 在使用时,并非为开发者包办了一切。最明显的是,
该模式下 Docker Container 不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致
的结果是宿主机以外的世界不能直接和容器进行通信。虽然 NAT 模式经过中间处理实现了
这一点,但是 NAT 模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器
内部服务的访问者需要使用服务发现获知服务的外部端口等。另外 NAT 模式由于是在三层
网络上的实现手段,故肯定会影响网络的传输效率。
(2) host 模式是 bridge 桥接模式很好的补充。采用 host 模式的 Docker Container,可以直接使用
宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公
有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换。当然,
有这样的方便,肯定会损失部分其他的特性,最明显的是 Docker Container 网络环境隔离性
的弱化,即容器不再拥有隔离、独立的网络栈。另外,使用 host 模式的 Docker Container 虽
然可以让容器内部的服务和传统情况无差别、无改造的使用,但是由于网络隔离性的弱
化,该容器会与宿主机共享竞争网络栈的使用;另外,容器内部将不再拥有所有的端口资
源,原因是部分端口资源已经被宿主机本身的服务占用,还有部分端口已经用以 bridge 网
络模式容器的端口映射。
(3) Container 网络模式:
(1) 查找 other container(即需要被共享网络环境的容器)的网络 namespace;
(2) 将新创建的 Docker Container(也是需要共享其他网络的容器)的 namespace,使用
other container 的 namespace。
Docker Container 的 other container 网络模式,可以用来更好的服务于容器间的通信。
在这种模式下的 Docker Container 可以通过 localhost 来访问 namespace 下的其他容器,传输
效率较高。虽然多个容器共享网络环境,但是多个容器形成的整体依然与宿主机以及其他
容器形成网络隔离。另外,这种模式还节约了一定数量的网络资源。但是需要注意的是,
它并没有改善容器与宿主机以外世界通信的情况。
(4) None 网络模式:
网络环境为 none,即不为 Docker Container 任何的网络环境。一旦 Docker Container 采用了
none 网络模式,那么容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。
可以说 none 模式为 Docker Container 做了极少的网络设定,但是俗话说得好“
少即是多”,在没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制
开发。这也恰巧体现了 Docker 设计理念的开放。
在 none 网络模式下分配固定 ip:
netns 是在 linux 中提供网络虚拟化的一个项目,使用 netns 网络空间虚拟化可以在本地虚拟
化出多个网络环境,目前 netns 在 lxc 容器中被用来为容器提供网络。
使用 netns 创建的网络空间独立于当前系统的网络空间,其中的网络设备以及 iptables 规则
等都是独立的,就好像进入了另外一个网络一样
配置:
使用loopback 网络设备,开启设备
<a href="https://s1.51cto.com/oss/201710/28/1e02d95fe5ab1280f30188774bcfe60a.png" target="_blank"></a>
查看设备进程,修改网卡名称,在docker启动网卡
<a href="https://s1.51cto.com/oss/201710/28/a500ff8e6ff9ebc21e5442f0b953e378.png" target="_blank"></a>
<a href="https://s3.51cto.com/oss/201710/28/e8da0f1ed86625a0cf8d860dec9147a7.png" target="_blank"></a>
局域网正常,添加网关,可以对外通信
<a href="https://s3.51cto.com/oss/201710/28/9ed15e63c0d3b14f13c0af0b69ed8f61.png" target="_blank"></a>
<a href="https://s3.51cto.com/oss/201710/28/a439d7a12a25d29d8d354dc578cb74e3.png" target="_blank"></a>
11.Dockerfile 编写介绍
(1)安装docker,加载rhel7镜像,打开i该镜像,封装rhel7:v1镜像
设置rhel7里的源
<a href="https://s1.51cto.com/oss/201710/28/028ea55cd129b5044d3702dcbcdcdd66.png" target="_blank"></a>
安装封装前的常用工具
<a href="https://s1.51cto.com/oss/201710/28/256026f1e1fdecb920bbfe93ba622cc9.png" target="_blank"></a>
<a href="https://s1.51cto.com/oss/201710/28/b5b2811a040db62eb23accc96604be92.png" target="_blank"></a>
<a href="https://s3.51cto.com/oss/201710/28/ca00458cd3095c617f2a2b3c7fc09091.png" target="_blank"></a>
提交封装好的镜像,版本为rhel:v1
<a href="https://s1.51cto.com/oss/201710/28/1dfe8f6a5ea420afd7ebf5c948b41a75.png" target="_blank"></a>
删除没用的容器vm1
<a href="https://s3.51cto.com/oss/201710/28/704d6293edb96b5283fcccd55db8342b.png" target="_blank"></a>
(2)容器间互联:创建Dockerfile
mkdir /tmp/dockerfile
cd /tmp/dockerfile
<a href="https://s1.51cto.com/oss/201710/28/e96ec6d42a012e87e98df921376ca064.png" target="_blank"></a>
vim Dockerfile
<a href="https://s3.51cto.com/oss/201710/28/cad4d362226ea0752344e8541227ce49.png" target="_blank"></a>
# vim Dcokerfile
FROM rhel7:yum
指定基础镜像
MAINTAINER [email protected]
作者信息
ENV HOSTNAME server1
设置容器主机名
EXPOSE 80
暴露容器端口
RUN yum install -y httpd && yum clean all
镜像操作命令
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
镜像启动命令,默认只能启动一条。
在rhel:v1的版本上创建rhel:v2,并自动安装启动相应的服务
<a href="https://s3.51cto.com/oss/201710/28/e73f160694e4c860c7e0933ba78b5eb8.png" target="_blank"></a>
<a href="https://s3.51cto.com/oss/201710/28/7389c391fab3271e5f1725380b3829c7.png" target="_blank"></a>
(2)启动rhel7:v2,端口正常
<a href="https://s4.51cto.com/oss/201710/28/fff08985d6da5a9b4d70b64227300f1d.png" target="_blank"></a>
打开网页测试,服务安装正常
<a href="https://s4.51cto.com/oss/201710/28/82fa2096662a78fee5563a8e481efdfe.png" target="_blank"></a>
12. 容器互联ssh
(1)配置Dockerfile,安装所需服务,修改ssh登陆密码
<a href="https://s3.51cto.com/oss/201710/28/192bb654173724d8c138f9b7ca5365a5.png" target="_blank"></a>
(2)创建rhel:v3
<a href="https://s3.51cto.com/oss/201710/28/4abc28f12c38739cde641acaf0ddf24f.png" target="_blank"></a>
<a href="https://s3.51cto.com/oss/201710/28/413a9dd01fc7b406116eae47b2fbd22d.png" target="_blank"></a>
(3)用容器打开镜像rhel:v3,端口映射,服务正常
<a href="https://s3.51cto.com/oss/201710/28/70253d81c3f2a380d06445ba5e64c70f.png" target="_blank"></a>
(4)2222端口ssh登陆正常
<a href="https://s3.51cto.com/oss/201710/28/77ccb4cb2d5dc7ecbc065c238c8d66c6.png" target="_blank"></a>
13.使用 Supervisord
CMD 如果只有一个命令,那如果我们需要运行多个服务怎么办呢?最好的办法是分别在不同的容器中运行,通过 link 进行连接,比如先前实验中用到的 web,app,db 容器。如果一定要在一个容器中运行多个服务可以考虑用 Supervisord 来进行进程管理,方式就是将多个启动命令放入到一个启动脚本中。
首先安装 Supervisord,添加下面内容到 Dockerfile:
(1)份额古装rhel:v1镜像,在yum源中加入superisor插件
<a href="https://s2.51cto.com/oss/201710/28/23bae89c0645edbe504d5fd4267388eb.png" target="_blank"></a>
<a href="https://s2.51cto.com/oss/201710/28/914e7df1fb32e061e2f1067f2822e563.png" target="_blank"></a>
<a href="https://s2.51cto.com/oss/201710/28/2616c86f4e34e247c04a0a2b9799208a.png" target="_blank"></a>
(2)在/tmp/docker下修改Dockerfile文件、创建supervisord.conf文件和创建docker.repo文件
<a href="https://s2.51cto.com/oss/201710/28/e2ff5ee281f4cf11636dae00a8871b7c.png" target="_blank"></a>
<a href="https://s2.51cto.com/oss/201710/28/34db2d389672c5ca63f231602a9fd2ea.png" target="_blank"></a>
<a href="https://s3.51cto.com/oss/201710/28/4fdbb7e9a39067ba8401e8d354cb74ce.png" target="_blank"></a>
<a href="https://s4.51cto.com/oss/201710/28/cafbe88066db100089630628f4550381.png" target="_blank"></a>
<a href="https://s4.51cto.com/oss/201710/28/b3a9e23f87a95579af0433201108994b.png" target="_blank"></a>
<a href="https://s4.51cto.com/oss/201710/28/e798cca31d73be7fae7104de7b036f29.png" target="_blank"></a>
(3)在rhel:v1基础上创建rhel:v2,并安装相关服务
<a href="https://s2.51cto.com/oss/201710/28/fd67a907a4632970d3c6ced339162dd8.png" target="_blank"></a>
<a href="https://s2.51cto.com/oss/201710/28/11acf034c29c6e8119108f48baabf382.png" target="_blank"></a>
(4)测试ssh服务和httpd服务
映射端口:httpd8080端口 ssh2222端口
<a href="https://s4.51cto.com/oss/201710/28/61449d054c3da16a94a1bd094b3159f6.png" target="_blank"></a>
<a href="https://s5.51cto.com/oss/201710/28/2632500fc1ef04badf2dc15f54925146.png" target="_blank"></a>
<a href="https://s4.51cto.com/oss/201710/28/bd2a024b176e5e510ecfca424dd9de5f.png" target="_blank"></a>
14.拉取别人创建好的镜像
添加拉取地址
<a href="https://s2.51cto.com/oss/201710/28/c9e6383776f32d893e10d856dd2456d3.png" target="_blank"></a>
<a href="https://s1.51cto.com/oss/201710/28/e578c67f1bbfea535a69309f5af66d29.png" target="_blank"></a>
<a href="https://s1.51cto.com/oss/201710/28/71cc689d6a87718a04cd961ba4a1a1bd.png" target="_blank"></a>
15.docker安全
设置特权级运行的容器:--privileged=true
有的时候我们需要容器具备更多的权限,比如操作内核模块,控制 swap 交换分区,挂载USB 磁盘,修改 MAC 地址等。
# docker run -it --name vm1 ubuntu bash
# docker run -it --privileged=true --name vm1 ubuntu bash
本文转自一百个小排 51CTO博客,原文链接http://blog.51cto.com/anfishr/1976197:,如需转载请自行联系原作者