Docker
Posted kz2017
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker相关的知识,希望对你有一定的参考价值。
Docker简介[集装箱]
主要部件:1.Docker 2.Docker Hub(https://hub.docker.com/explore/)
使用客户端-服务器(C/S)架构模式。Docker客户端会与Docker守护进程进行通信。
它们之间通过socket或者RESTful API进行通信。
用户通过Docker客户端(docker的二进制程序)间接和Docker守护进程进行通信。
Docker内部
1. 仓库:用来保存镜像。分为公有(Docker Hub)和私有的。
2. 镜像:是Docker容器运行时的只读模板,每一个镜像都是由一系列的层组成(轻量的关键)。不用替换原先的镜像或者重新建立,只要一个新的层被添加或者升级,就无需重新发布整个镜像。
3. 容器:和文件夹类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个Docker容器都是从Docker镜像创建的。是独立和安全的应用平台,是Docker的运行部分。可以运行 开始 停止 移动和删除。
免sudo使用docker命令
https://www.jianshu.com/p/95e397570896
命名空间
Pid namespace
Net namespace
Ipc namespace
Mnt namespace
Uts namespace
User namespace
有了以上6种namespace从进程 网络 IPC 文件系统 UTS和用户角度的隔离,一个container(容器)就可以对外展现出一个独立计算机的能力,并且不同container从OS层面实现了隔离。然而不同namespace之间资源还是相互竞争的,仍然需要类似ulimit来管理每个container所能使用的资源-cgroup。
资源配额[cgroups]
http://tiewei.github.io/devops/howto-use-cgroup/
Docker安装
http://blog.csdn.net/qq_36892341/article/details/73918672
Docker基础用法
https://www.jianshu.com/p/922705fa1a1f 简书-学习笔记1
Dockerfile
Docker可以通过Dockerfile的内容来自动构建镜像。Dockerfile 是一个包含创建镜像所有命令的文本文件,通过 docker build 命令可以根据 Dockerfile 的内容构建镜像,在介绍如何构建之前先介绍下 Dockerfile 的基本语法结构。
Dockerfile指令选项(略)
Dockerfile最佳实践(略)
Docker端口映射
https://www.jianshu.com/p/e601bbf12572 简书-学习笔记3
# 通过容器 id 获取 ip
sudo docker inspect <container_id> | grep IPAddress | cut -d ’"’ -f 4
无论如何,这些ip是基于本地系统的并且容器的端口非本地主机是访问不到的。此外,除了端口只能本地访问外,对于容器的另外一个问题是这些ip在容器每次启动的时候都会改变。
Docker通过端口绑定主机系统的接口,允许非本地客户端访问容器内部运行的服务。==》解决了上面的容器两个问题
4. 自动映射端口
-p 使用时需要指定 --expose选项,指定需要对外提供服务的端口
sudo docker run -t -P --expose 22 --name server ubuntu:14.04
使用docker run -p 自动绑定所有对外提供服务的容器端口,映射的端口将会从没有使用的端口池中(49000..49900)自动选择,可以通过docker ps 、docker inspect <container_id> 或者 docker port <container_id> <port> 来确定具体的绑定信息。
5. 绑定端口到指定接口
基本语法
sudo docker run -p [([<host_interface>:[host_port]])|(<host_port>):]<container_port>[/udp] <image> <cmd>
默认不指定绑定ip则监听所有网络接口
绑定TCP端口(略)
绑定UDP端口(略)
Docker网络配置:
Docker通过使用Linux桥接提供容器之间的通信,docker0 桥接接口的目的就是方便Docker管理。
当Dcoker daemon(守护进程)启动时需要做以下操作:
Docker四种网络模式
docker run 创建Docker容器时,可以用 -net 选项指定容器的网络模式,Docker有以下4种网络模式:
host模式
如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。
container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
none模式
这个模式和前两个不同。在这种模式下,Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等。
bridge 模式
bridge 模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace 设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。接下来就是为容器分配IP了,一般Docker会使用172.17.0.0/16这个网段,并将172.17.42.1/16分配给docker0网桥(在主机上使用ifconfig命令可以看到docker0,可以认为他是网桥的管理接口,在宿主机作为一块虚拟网卡使用)。
7. 列出当前主机网桥
sudo brctl show # brctl 工具依赖 bridge-utils 软件包
8. 查看当前docker0 ip
sudo ifconfig docker0
在容器运行时,每个容器都会分配一个特定的虚拟机口并桥接到docker0。每个容器都会配置同docker0 ip相同网段的专用ip地址,docker0的IP被用于所有容器的默认网关。
9. 运行一个容器
sudo docker run -t -i -d ubuntu /bin/bash
sudo brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.fef213db5a66 no vethQCDY1N
以上, docker0 扮演着 52f811c5d3d6 container 这个容器的虚拟接口 vethQCDY1N interface 桥接的角色。
使用特定范围的IP:
Docker允许用户管理docker0桥接或者通过-b 选项自定义桥接网卡,需要安装bridge-utils软件包。
# 停止Docker并移除docker0。
sudo service docker stop
sudo ip link set dev docker0 down
sudo brctl delbr docker0
# 创建自己的桥
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并重新启动。 (on Ubuntu)
echo ‘DOCKER_OPTS="-b=bridge0"‘ >> /etc/default/docker
$ sudo service docker start
10. 不同主机间容器通信
可以借助于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
桥接网络(略)
容器数据管理
https://www.jianshu.com/p/a43b39dfffa4 简书-学习笔记2
Docker管理数据的方式有两种:
11. 数据卷
数据卷是一个或多个容器专门指定绕过 Union File System 的目录,为持续性或共享数据提供一些有用的功能:
数据卷可以在容器间共享和重用
数据卷数据改变是直接修改的
数据卷数据改变不会被包括在容器中
数据卷是持续性的,直到没有容器使用它们
12. 数据卷容器
如果你有一些持久性的数据并且想在容器间共享,或者想用在非持久性的容器上,最好的方法是创建一个数据卷容器,然后从此容器上挂载数据。
链接容器
docker 允许把多个容器连接在一起,相互交互信息。docker 链接会创建一种容器父子级别的关系,其中父容器可以看到其子容器提供的信息。
构建私有库(略)
https://www.jianshu.com/p/784bdffcc469 简书-学习笔记4
https://www.jianshu.com/p/54b1b0a098c3 简书-学习笔记5
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html 阮一峰入门
以上是关于Docker的主要内容,如果未能解决你的问题,请参考以下文章