Docker

Docker架构

概念 描述
Image 一个系统的模板
Container 独立运行的一组应用,是镜像的运行时实体
Dockerfile 自动化脚本

Dockerfile

指令 描述
FROM 指定构建新Image时使用的基础Image(通常是第一个指令)
LABEL
ENV 以键值格式设定环境变量
RUN 以FROM中定义的Image为基础环境运行指定指令,生成的结果将作为新Image中的 一个镜像层,并可由后续指令所使用
CMD 基于该Dockerfile生成的Image运行Container时,CMD能够指定容器中默认运行的程序,因而其只应该定义一次
VOLUME 指定基于新生成的Image运行Container时期望作为Volume使用的目录
EXPOSE 指定基于新生成的Image运行Container时期望暴露的端口
COPY 复制主机上的文件/目录,生成新的镜像层

Docker网络模式

使用 docker network ls 来查看容器的联网方式

容器默认有三种联网方式,分别是bridge,host和none模式

bridge模式

在此模式下,容器可以单向连接外网,外网设备(宿主机这类)需要访问容器的话,则需要容器设置对应的端口映射

默认bridge联网模式就类似于一个名字为docker0,网关地址为172.14.0.1的路由器,所有容器都连接在这个路由器上,随机分配IP地址,IP地址范围为172.17.0.2到172.17.0.254

容器之间的通信可以直接通过内网IP地址进行,但是默认这个“路由器”的缺点在于,无法给容器设定固定的IP,在多个容器存在的情况下,由于启动的先后顺序,会造成容器IP地址出现变化

host模式

容器直接使用物理机网络,这种联网模式需要创建容器时手动指定参数,宿主机的IP就是容器的IP,端口也可以直接调用

none模式

容器不联网

Docker Stop失败

aa-remove-unknown可以移除unknown AppArmor profiles,它比较在/etc/apparmor.d/下的profiles和当前被加载在内核中的profiles,然后移除所有在内核中但不在/etc/apparmor.d/下的profiles

在docker stop失败后可以尝试这条指令,再重新进行docker stop

重启Docker宇宙

有的时候可能docker出问题了,需要重启一下试试

那么可以删除docker下的所有容器和镜像

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker rmi $(docker images -q)

Docker容器无法访问外网

IP转发

IP转发使linux机器像路由器一样将数据从一个网络发送到另一个网络,所以它能作为一个路由器或者代理服务器,使内部网络连接到互联网

解决问题

首先需要在 /etc/sysctl.conf 里面加入

net.ipv4.ip_forward=1

(这行代码本来就存在,不过被注释掉了)

然后运行下面的命令启用更改

sysctl -p /etc/sysctl.conf

然后docker内部就可以顺利访问外网了

Volume

Docker镜像被存储 在一系列只读层中,当创建一个新容器时,Docker会读取镜像(只读),并在其顶部添加一层读写层。如果正在运行的肉哦那个其修改了现有文件,该文件会被拷贝出底层的只读层,放在顶层的读写层中,读写层原来的旧版本文件仍然存在于镜像中

所以当Docker容器被删除后,再基于原来的镜像创建容器时,将创建一个没有任何数据更改的容器,在之前那个容器中的数据更改会丢失掉。只读层+读写层的组合被称为Union File System

为了能够持久化这些更改后的数据,并且能够很容易实现容器间共享数据,Volume被提出,Volume是外部默认的联合文件系统,或是存在于宿主文件系统中正常的文件或文件夹

查看volume在宿主机上的位置

docker volume inspect <volume-name>