Docker简介
Docker 是 dotcloud 公司开源的一款产品,主要基于 PAAS ( Platfrom as a Service ) 平台为开发者提供服务。
Docker 与传统虚拟化对比各个应用程序共享库资源,节约资源,但安全性不高
Docker 的构成
Docker 仓库
Docker自身组件
Docker Client - Docker客户端
DockerService - Docker Daemon的主要组成,接受Docker Client发出的请求,并按照相应的路由规则实现路由分发
Docker 镜像 - Docker镜像运行之后变成容器
Docker 安装
配置国内yum源
http://mirrors.aliyun.com/repo/Centos-7.repo的内容覆盖/etc/yum.repos.d/CentOS-Base.repo文件
wget http://mirrors.aliyun.com/repo/Centos-7.repo -O /etc/yum.repos.d/CentOS-Base.repo
执行
yum clean all yum makecache
安装
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 18.06.3.ce-3.el7这个版本(1. 比较稳定;2. 对一些参数做了初始化而不需要配置)
yum list docker-ce --showduplicates
yum install -y docker-ce-18.06.3.ce-3.el7 -y
配置镜像加速
阿里云容器镜像服务
## 创建 /etc/docker 目录
mkdir /etc/docker
cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://proxy.1panel.live",
"https://docker.1panel.top",
"https://docker.m.daocloud.io",
"https://docker.1ms.run",
"https://docker.ketches.cn"
]
}
EOF
systemctl daemon-reload
systemctl restart docker && systemctl enable docker
docker version
Docker体验
docker安装wordpress
docker run --name db --env MYSQL_ROOT_PASSWORD=123456 --env MYSQL_DATABASE=wordpress --env MYSQL_USER=wordpress --env MYSQL_PASSWORD=123456 -d mysql:5.6
docker run --name wordpress --link db:mysql -p 8080:80 -d wordpress
Docker容器管理
Docker重要概念
仓库、镜像、容器
Docker常用命令
基本用法 docker + 命令关键词 + 参数
docker info - 查看守护进程的系统资源设置
docker search
docker pull
docker push 192.168.40.102/test/hello-world - 上传镜像到仓库
docker images - 本地docker镜像的查询
docker rmi
docker rm
docker rm -f $( docker ps -a -q) - 删除所有容器
docker ps - 查询本地运行的容器(-a 查询所有, -q只查询id)
docker run - 容器的创建和运行
docker start/stop
docker tag REPOSITORY:TAG newREPOSITORY:newTAG - 给环镜像打上标签,以及修改REPOSITORY,会新加改镜像
Docker容器管理命令
每个容器被创建后,都会分配一个 CONTAINER ID 作为容器的唯一标示- id,可通过容器名和id来进行如下操作
docker ps -no-trunc <> - 查看(包括完整128位id)
docker stop/start <> - 停止/开始容器
docker inspect <> - 查看容器或镜像所有基本信息
docker logs <> - 查看容器日志 -f 监听
docker stats <> - 监听查看容器所占用的系统资源 不跟参数查看全部
docker exec <> cmd - 容器执行命令,命令不用加什么引号
docker exec -it <> /bin/bash - 登入容器bash
docker cp src
docker cp
Run常用参数
--restart=always - 容器跟随docker服务自动启动(否则需要手动start) 和--rm冲突
--rm - 服务停止时自动删除, 使用docker stop自动删除 和--restart冲突
-h x.x.x.x - 设置容器主机名即 hostname
--ip x.x.x.x - 指定容器ip
--dns x.x.x.x - 设置容器dns服务器 即/etc/resolve中的nameserver
--dns-search - 设置容器DNS搜索设置 即/etc/resolv.conf中的search
--add-host hostname:ip 注入hostname ip解析 即/etc/hosts中的解析
-d - 在后台运行容器
-p host_port:port - 发布容器端口到主机端口
-it 有交互的运行,docker run -it --rm --name jt jdk_tomcat可做调试观察前台进程是否运行正常 与-d 最好不要一起
-link containerName - 添加和其他容器的连接,容器的/etc/hosts中添加解析如172.17.0.2 containerName 367321c189c4
-link containerName:别名 - 添加和其他容器的连接,容器的/etc/hosts中添加解析如 172.17.0.2 别名 367321c189c4 containerName
Docker-Compose
容器编排工具,允许用户在一个模板(YAML格式)中定义一组相关联的容器,会根据--link等参数,对启动的优先级进行排序。
安装
curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod o+x /usr/local/bin/docker-compose
docker-compose --version
用法
-f 指定使用的yaml文件(文件不是docker-compose.yml或docker-compose.yaml,需要指定文件名称,要放在最前面)
config -q 验证yaml配置文件是否正确
up -d 启动容器项目
ps 显示所有容器信息
pause 暂停所有容器,不是停止,容器未进入exit
restart 重新启动容器,相当与停止后启动
unpause 恢复暂停
logs 查看日志信息
rm 删除整个容器项目
stop 停止容器
start 启动容器
rm -sf 停止并删除容器,s停止容器,f强制删除,不加f,会有提示选择y/N
代码
version: '2'
services:
db:
image: mysql:5.6
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: 123456
wordpress:
depends_on:
- db
image: wordpress:latest
restart: always
ports:
- "8000:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: 123456
depends_on相当于--link参数
restart相当于--restart参数
相当与
docker run --name db --env MYSQL_ROOT_PASSWORD=123456 --env MYSQL_DATABASE=wordpress --env MYSQL_USER=wordpress --env MYSQL_PASSWORD=123456 --restart=always -d mysql:5.6
docker run --name wordpress --link db --env WORDPRESS_DB_HOST=db:3306 --env WORDPRESS_DB_USER=wordpress --env WORDPRESS_DB_PASSWORD=123456 --restart=always -p 8000:80 -d wordpress
Docker镜像管理
容器转换为镜像
docker commit mysql mysql:5.1
要求转换的容器中工作在前台的守护进程至少一个,不然这样的容器一运行就会退出(exit)
官网的centos镜像容器启动运行命令是bash,不是前台守护进程,所以一运行就会退出
网易的public centos镜像hub.c.163.com/public/centos:6.7-tools容器启动运行命令不是bash,而是/usr/bin/supervisord,且是前台守护进程,所以可以一直运行
docker pull hub.c.163.com/public/centos:6.7-tools
这样生成的镜像不能设置启动是运行的命令, 比如手动安装了其他软件,变为镜像又变为容器后,手动安装启动的是不会启动的(比如tomcat)
Dockerfile
Dockerfile 是一种被 Docker 程序解释的脚本,Docker 程序读取 Dockerfile,根据指令生成定制的 image
构建镜像
docker build -t jdk-tomcat:1.0 . 要求目录下有文件名为Dockerfile .表示以当前目录作为构建上下文
docker build -t jdk-tomcat:1.0 . -f Dockerfile
Dockerfile中的每一条命令都为分一个层,且最多分层128
常用语法
From (指定基础 image,且在其他指令前面)
FROM centos:7.2
FROM centos
MAINTAINER (用来指定镜像创建者信息)
MAINTAINER chy "chy.98@foxmail.com"
RUN(安装软件用,可以运行任何被基础image支持的命令)
RUN cd /tmp && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar -xz
RUN ["/bin/bash", "-c", "echo hello"]
CMD(设置container启动时执行的操作, 只能在文件中存在一次,如果有多个,则只执行最后一条)
CMD echo "Hello, World!"
ENTRYPOINT(设置container启动时执行的操作,可以多次设置,但是只有最后一个有效)
独自使用时,CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效
ENTRYPOINT ls -l
和CMD指令配合使用来指定ENTRYPOINT的默认参数,CMD指令是参数部分,ENTRYPOINT不能指定参数
CMD ["-l"]
ENTRYPOINT ["/usr/bin/ls"]
USER(设置启动容器的用户)
USER daemon
EXPOSE(指定容器需要映射到宿主机器的端口)
映射一个端口(docker run -p host_port1:Port1 image)
EXPOSE 22
映射多个端口( docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image)
EXPOSE port1 port2 port3
ENV(用于images设置环境变量,可通过docker inspect查看,docker run --env key=value时设置或修改环境变量)
ENV JAVA_HOME /path/jdk
ADD(从src复制文件到容器的dest路径,默认解压,src可为远程地址,src是相对于构建上下文的路径)
ADD <src> <dest>
COPY (从src复制文件到容器的dest路径,不能解压,src不可为远程地址)
COPY <src> <dest>
VOLUME(指定挂载点,使容器中的一个目录具有持久化存储数据的功能,当容器关闭后,数据也还在)
VOLUME ["/tmp/data"]
WORKDIR(切换目录,不存在会创建目录,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效)
WORKDIR /p1
WORKDIR p2
RUN vim a.txt
ONBUILD(在子镜像中执行,ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行)
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
测试
jdk+tomcat, 主机有jdk和tomcat压缩包实现容器tomcat部署
临时变量
export JAVA_HOME=/usr/local/jdk1.8.0_144 export PATH=$JAVA_HOME/bin:$PATH
catalina.sh run 是一个前台进程,运行后容器不退出,如果使用startup.sh后台的就会退出
FROM centos:6.7
MAINTAINER chy "chy.98@foxmail.com"
ADD apache-tomcat-8.5.47.tar.gz /tmp
ADD jdk-8u144-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_144
ENV PATH $JAVA_HOME/bin:$PATH
CMD /tmp/apache-tomcat-8.5.47/bin/catalina.sh run
EXPOSE 8080
镜像的导出以及导入
导出:docker save -o xx.xx.xx.tar xx.xx.xx
导入:docker load -i xx.xx.xx.tar
镜像仓库构建
官方仓库构建
harbor构建(1.2.0)
前提
python 2.7版本及以上
docker1.10版本及以上
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 18.06.3.ce-3.el7这个版本(1. 比较稳定;2. 对一些参数做了初始化而不需要配置)
yum list docker-ce --showduplicates
yum install -y docker-ce-18.06.3.ce-3.el7 -y
docker compose为1.6版本及以上
curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod o+x /usr/local/bin/docker-compose
docker-compose version
安装
下载软件包
https://github.com/vmware/harbor/releases/download/v1.2.0/harbor-offline-installer-v1.2.0.tgz
解压
tar -zxvf harbor-offline-installer-v1.2.0.tgz
创建https证书
mkdir -p /data/cert
cd /data/cert
openssl genrsa -des3 -out server.key 2048
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.cr
chmod -R 777 /data/cert
配置harbor.cfg
hostname = 192.168.40.102 目标主机名或者完全限定域名
ui_url_protocol = https http或https
db_password = root123 # 用于db_auth的mysql数据库根密码
max_job_workers = 3 #Maximum number of job workers in job service
customize_crt = on # 当此属性打开时,prepare脚本将为注册表的令牌的生成/验证创建私钥和根证书
secretkey_path = /data # The path of secretkey storage
ssl_cert = /data/cert/server.crt # ssl证书路径
ssl_cert_key = /data/cert/server.key # ssl秘钥路径
脚本安装
./install.sh
访问测试
https://192.168.40.102
默认账号
admin/Harbor12345
上传测试镜像
前提-指定仓库地址
/etc/docker/daemon.json
添加
"insecure-registries":[“https://192.168.40.102"],
重启
systemctl daemon-reload
systemctl restart docker
进行
登录验证
docker login 192.168.40.102
在项目中标记镜像
docker tag hello-world 192.168.40.102/test/hello-world:1.0 # test为项目
docker tag hello-world 192.168.40.102/test/hello-world
推送镜像到当前项目
docker push 192.168.40.102/test/hello-world:1.0
docker push 192.168.40.102/test/hello-world
下载测试镜像
前提-指定仓库地址
/etc/docker/daemon.json
添加
"insecure-registries":[“https://192.168.40.102"],
重启
systemctl daemon-reload
systemctl restart docker
进行
docker pull 192.168.40.102/test/hello-world:1.0
docker pull 192.168.40.102/test/hello-world
Docker网络
网络通讯示意
docker network ls 查看当前docker的网络
默认有一个bridge网络
cc7514897f5a bridge bridge local
docker network inspect bridge 查看详细 其实代表docker0网桥网络
如果还有其他的网桥网络,那么就会有有br-开头的网桥网卡
而vethX开头的网卡则是为每一个容器的默认bridge网络创建的网卡

Docker 中的防火墙规则
docker通过防火墙规则实现通讯
容器访问容器
直接通过docker0网桥做交换
容器访问外部网络
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -o docker0 -j MASQUERADE
外部网络访问容器
docker run -d -p 80:80 apache
iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80
Docker 容器网络修改
--dns 用于指定启动的容器的 DNS
--net 用于指定容器的网络通讯方式,有以下四个值
bridge:Docker 默认方式,网桥模式,会创建vethX网卡
none:容器没有网络栈,宿主机不会创建vethX网卡
container:使用其它容器的网络栈,Docker容器会加入其它容器的 network namespace
host:表示容器使用 Host 的网络Host有的网络容器全有,没有自己独立的网络栈。容器可以完全访问 Host 的网络,不安全
-p 端口暴露方式
<ContainerPort> 将制定的容器端口映射至主机所有地址的一个动态端口
<HostPort>:<ContainerPort> 映射至指定的主机端口
<IP>::<ContainerPort> 映射至指定的主机的 IP 的动态端口
<IP>:<HostPort>:<ContainerPort> 映射至指定的主机 IP 的主机端口
-P(大):暴露所需要的所有端口
docker run后跟
docker port ContainerName 查看容器当前的端口映射关系
自定义Docker0网桥的网络地址
配置
配置默认桥接网络即docker0的方式。 更改/etc/docker/daemon.json的内容
{
"bip": "192.168.1.1/24", # 指定 docker0 网桥的 IP 地址和子网掩码
"fixed-cidr": "192.168.1.0/24", # 指定 docker0 网桥的子网范围
"default-gateway": "192.168.1.2",
"mtu": 1500,
"dns": ["8.8.8.8", "8.8.4.4"],
"dns-search": ["example.com"]
}
systemctl daemon-reload
systemctl restart docker
改网桥下的容器重新启动后就会更改网络地址
还原
/etc/docker/daemon.json的内容进行删除
systemctl stop docker
rm -rf /var/lib/docker/network
ip link delete docker0
systemctl start docker
网络隔离
配置
docker network ls 查看当前可用的网络类型
docker network inspect 网络空间名称 查看详细
docker network create -d 类型 网络空间名称 --subnet "" --gateway
docker network create -d bridge b1
类型分为:
overlay network
bridge network
创建br-开头的网桥网卡
测试
docker network create -d bridge b1 --subnet "172.27.0.0/16" --gateway "172.27.0.1"
docker run -d --network=b1 --name test1 hub.c.163.com/public/centos:6.7-tools
docker run -d --name test2 hub.c.163.com/public/centos:6.7-tools
test1 ip属于 b1网段
test2 ip属于docker0网段
彼此不通
容器配置上独立IP进行通讯
配置真实网桥
配置真实网桥
cp ifcfg-ens33 ifcfg-br0
vi ifcfg-ens33 # 真实网卡
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0
vi ifcfg-br0
TYPE=Bridge
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=192.168.40.101
GATEWAY=192.168.40.2
NETMASK=255.255.255.0
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=br0
DEVICE=br0
ONBOOT=yes
重启网络
systemctl restart network
使用工具分配地址
即可以让容器拥有跟宿主机一个网段的ip
yum install -y git
git clone https://github.com/jpetazzo/pipework
cp pipework/pipework /usr/local/bin/
docker run --name jt --net none -d jdk_tomcat
pipework br0 jt 192.168.40.103/24 # 不是永久生效
Docker数据存储
数据卷特性
Docker 镜像由多个只读层叠加而成,启动容器时,Docker 会加载只读镜像层并在镜像栈顶部添加一个读写层
如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将会从读写层下面的的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,次即“写时复制”机制
数据卷的意义
Volume 可以在运行容器时即完成创建与绑定操作。
Volume 使得数据持久化
数据卷的类型
Bind mount volume
绑定挂载卷
绑定宿主机上的目录映射到容器中的目录
Docker-managed volume
docker自管理卷
绑定宿主机上的/var/lib/docker/volumes/下的随机目录映射到容器中的目录
Union Volume
联合使用卷
绑定宿主机上的/var/lib/docker/volumes/下的随机目录映射到多个容器中的目录
使用数据卷
Bind mount volume
docker run --name jt -v /data:/data -d jdk_tomcat
/data-/data
docker inspect显示
"Mounts": [
{
"Type": "bind",
"Source": "/data",
"Destination": "/data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
Docker-managed volume
docker run --name jt -v /data -d jdk_tomcat
/var/lib/docker/volumes/{} - /data
docker inspect显示
"Mounts": [
{
"Type": "volume",
"Name": "d3112c4b828d43cf2520ec582e227b79b705b39aa136766564f7faf9f79fd170",
"Source": "/var/lib/docker/volumes/d3112c4b828d43cf2520ec582e227b79b705b39aa136766564f7faf9f79fd170/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
删除容器时删除docker自管理卷 -v
docker rm -f -v jt
Union Volume
docker run --name jt -v /data -d jdk_tomcat
docker run --name jt1 --volumes-from jt -d jdk_tomcat
存储驱动
Docker 存储驱动 ( storage driver ) 是 Docker 的核心组件,它是 Docker 实现分成镜像的基础
device mapper ( DM ):性能和稳定性存在问题,不推荐生产环境使用 btrfs:社区实现了 btrfs driver,稳定性和性能存在问题 overlayfs:内核 3.18 overlayfs 进入主线,性能和稳定性优异,第一选择
查看存储驱动
docker info
显示
Storage Driver: overlay2
修改为 overlayfs 存储驱动
echo "overlay" > /etc/modules-load.d/overlay.conf
cat /proc/modules|grep overlay
reboot
vim /etc/systemd/system/docker.service
--storage-driver=overlay \
overlayfs存储测试

mkdir overlay
cd overlay
mkdir low
mkdir upper
mkdir work
mkdir merged
mount -t overlay overlay -olowerdir=./low,upperdir=./upper,workdir=./work ./merged
mount 显示
overlay on /root/overlay/merged type overlay (rw,relatime,seclabel,lowerdir=./low,upperdir=./upper,workdir=./work)
Docker资源限制
默认情况下,如果不对容器做任何限制,容器能够占用当前系统能给容器提供的所有资源
Docker 调整了 docker daemon 的 OOM 优先级,以免在Out Of Memory Exception(oome)下被内核关闭
Docker 限制可以从 Memory、CPU、Block I/O 三个方面
Memory
为应用做内存压力测试,理解正常业务需求下使用的内存情况,然后才能进入生产环境使用
一定要限制容器的内存使用上限
尽量保证主机的资源充足,监控发现资源不足,就进行扩容或者对容器进行迁移
如果可以(内存资源充足的情况),尽量不要使用 swap,swap 的使用会导致内存计算复杂,对调度器非常不友好
限制

-m --memory:容器能使用的最大内存大小,最小值为 4m
--memory-swap:容器能够使用的 swap 大小
--memory-swappiness:默认情况下,主机可以把容器使用的匿名页(anonymous page)swap 出来,你可以设置一个 0-100 之间的值,代表允许 swap 出来的比例
--memory-reservation:设置一个内存使用的 soft limit,设置值小于 –m 设置
--kernel-memory:容器能够使用的 kernel memory 大小,最小值为 4m。
--oom-kill-disable:启用 --oom-kill-disable 后,即使容器内存超限,OOM Killer 也不会终止容器。默认情况下,如果容器使用的内存超过其限制,OOM Killer 会终止容器进程,只有设置了 -m,可以设置该选项。
测试
docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress -vm 2
输出
stress-ng: debug: [7] stress-ng-vm: child died: 9 (instance 1)
stress-ng: debug: [7] stress-ng-vm: assuming killed by OOM killer, restarting again (instance 1)
docker run --name stress -it --rm -m 256m --oom-kill-disable lorel/docker-stress-ng:latest stress -vm 2
输出
stress-ng: debug: [6] : can't set oom_score_adj failed, errno=13 (Permission denied)
stress-ng: debug: [6] stress-ng-vm: started [6] (instance 0)
docker stats 进行观察
CPU
限制容器能利用哪些CPU,以及容器最多能使用的 CPU 时间
限制
--cpuset-cpus="" 允许使用的 CPU 集,值可以为 0-3,0,1
-c,--cpu-shares=0 CPU 共享权值(相对权重),默认值 1024
--cpuset-mems="" 允许在上执行的内存节点(MEMs)
--cpu-period=0 即可设置调度周期,CFS 周期的有效范围是 1ms~1s,对应的--cpu-period的数值范围是 1000~1000000
--cpu-quota=0 设置在每个周期内容器能使用的 CPU 时间,容器的 CPU 配额必须不小于 1ms,即 --cpu-quota的值必须 >= 1000,单位微秒
--cpus 能够限制容器可以使用的主机 CPU 个数,并且还可以指定如 1.5 之类的小数
测试
docker run --name stress -it --rm --cpu-period=50000 --cpu-quota=25000 lorel/docker-stress-ng:latest stress --cpu 8
docker run --name stress -it --rm --cpu-period=10000 --cpu-quota=20000 lorel/docker-stress-ng:latest stress --cpu 8
docker run --name stress -it --rm --cpus 2 lorel/docker-stress-ng:latest stress --cpu 8
docker run --name stress -it --rm --cpuset-cpus 0 lorel/docker-stress-ng:latest stress --cpu 8
docker stats 进行观察
补充
Docker 远程访问
cat <<EOF > /etc/docker/daemon.json
{
"hosts": ["tcp://0.0.0.0:2375","unix://var/run/docker.sock"]
}
EOF
systemctl daemon-reload
systemctl restart docker
远程访问
docker -H ip:port CMD
容器标准化结构
Open Container Initiative
由 Linux 基金会主导于 2015 年 6 月创立
旨在围绕容器格式和运行时定制一个开放的工业化标准
Contains two specifications
the Runtime Specification ( runtime-spec )
the Image Specification ( runtime-spec )
RUNC ?
是对于 OCI 标准的一个参考实现,是一个可以用于创建和运行容器的 CLI ( command-line interface )工具。runC 直接与容器所依赖的 cgroup/linux kernel 等进行交互,负责为容器配置 cgroup/namespace 等启动容器所需的环境,创建启动容器的相关进程。
为了兼容 OCI 标准,Docker 也做了架构调整。将容器运行时相关的程序从 Docker daemon 剥离出来,形成了 Containerd。Containerd 向 Docker 提供运行容器的 API,二者通过 grpc 进行交互。Containerd 最后会通过 Runc 来实际运行容器
RUNC 架构
Docker Engine
containerd
containerd-shim containerd-shim ...
runC runC ...
