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>