INDEX
§1 容器
§1.1 docker 容器的运行模式
docker 容器有两种运行模式
- 前台运行
- 后台运行(Detached mode)
前台运行
- 使用 docker run -it 运行容器以进入前台运行
- -t 用于给容器分配模拟终端,即从操作启动容器的终端命令行转移到操作容器启动后的其内部的命令行
- -i 用于可以与分配的模拟终端进行交互
- -it 通常配套使用
- 只有 -t 可以进入启动后的内部命令行,但不能交互(包括退出容器)
- 只有 -i 可以交互,但是并不是向虚拟终端交互,类似于在一个笔记本中写着玩(但是可以通过 exit 退出容器)
后台运行 / 守护式运行
-
使用 docker run -d 运行容器以进入后台运行
-
后台运行的容器容器启动后脱离(不再监听)启动容器时使用的终端命令行
-
后台运行的容器只能通过网络 / 共享卷组进行 I/O 数据交互
-
可以使用下面指令重新挂载容器
docker attach
-
容器无法配合 --rm 参数,在容器退出并关闭时自动清除所有该容器的信息
后台运行容器的自动退出
原因
容器需要满足下面条件之一才能后台运行
- 是一直挂起的命令,如 tail、top
- 有前台进程
解决
-
后台启动一直挂起性质的容器,比如 redis
-
后台启动的同时给一个永远执行不完的指令,比如
docker run -d --name ubuntu ubuntu /bin/bash -c "tail -f /dev/null"
§1.2 docker 容器的端口映射
如上图所示
p1-4 是 4 个 docker 容器的端口
P1-4 是物理机操作系统的端口
若 p1 端口(比如 8080),是容器中某 App / 服务(比如 Tomcat) 使用的端口
容器启动时用户实际上希望访问此端口以使用对应的 App / 服务
但是,外部访问只能直接访问物理机操作系统的端口 P1-4,
因此,需要将 容器内的 p1 端口 映射到 物理机的 P1 端口,相当于在物理机端口和容器内部端口之间架桥
端口映射后,物理机的 P1 端口 代理了 容器内的 p1 端口,访问物理机端口相当于访问容器内端口
§1.3 docker 容器的退出机制
docker 提供了两种退出容器的方式
- exit 命令,退出的同时容器终止
- ctrl+p+q 快捷键,只退出容器,但容器不停止
§2 仓库
§2 .1 阿里云仓库
创建个人实例
创建命名空间
创建镜像仓库
docker 阿里云仓库快速指令
下面指令可以从具体仓库的基本信息中获取,如下图
登录阿里云仓库
docker login --username=aliyun16 registry.cn-hangzhou.aliyuncs.com
从Registry中拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/fc-learning/ubuntu:[镜像版本号]
将镜像推送到Registry
推送前使用 tag 指令打标签,标签中指定 命名空间、库、版本
docker login --username=aliyun16 registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/fc-learning/ubuntu:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/fc-learning/ubuntu:[镜像版本号]
§2 .2 docker 私有仓库
拉取 docker 私有仓库镜像
docker pull registry
打开私有仓库 push 的 http 支持
docker 私有仓库默认不支持 http 的推送方式,如果有需要可以通过配置文件修改
vim /etc/docker/daemon.json
添加 insecure-registries 项,注意 json 格式
{
"registry-mirrors": ["https://2mkskfi4.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.3.11:5000"]
}
重启 docker 服务
systemctl restart docker
通过镜像部署私有仓库
docker run -d -p 主机端口:容器端口 -v 主机路径:容器路径 --privileged=true 私有仓库名
- 不指定 -v 挂载数据卷时,仓库默认创建在容器内的 /var/lib/registry
私有仓库的 http 请求
查看仓库
http://192.168.3.11:5000/v2/_catalog
§3 数据卷
数据卷说明
- 数据卷是一种持久化方式
- 可以通过挂载的方式保存在联合文件系统 (UnionFS) 之外,实现主机和容器的文件共享
- 对数据卷的修改实时生效
- 数据卷的挂载可以通过 docker inspect 指令,在字段 Mounts 中查看状态
- 数据卷可以被多个容器使用
- 容器停止和删除时不会删除挂载的数据卷
数据卷的挂载
容器启动时,通过下面属性挂载数据卷
-v 主机路径:容器路径[:数据卷读写模式] [--privileged=true]
示例
-v /docker_registry:/tmp/registry:rw --privileged=true
数据卷的读写模式
数据卷有两种读写模式
- rw
默认,可读可写 - ro
只读
数据卷的继承
容器之间可以通过如下参数继承数据卷
--volumes-from 继承的容器
继承数据卷后
- 容器的数据卷和继承自的容器一致
- 继承自的容器出现状态变化(如停止容器、卸载数据卷)时,容器的数据卷不受影响
数据卷的权限
CentOs 7 开始,安全模块会默认禁止不安全的操作,包括挂载数据卷
被安全模块拦截时,会出现提示
cannot open directory .: Permission denied
可以使用下面参数打开
--privileged=true
§4 docker hub
登录后界面如图
如 github 搜索镜像仓库
镜像仓库的认证
docker 的镜像仓库有 4 种认证(上图的三种和无认证)
- Docker Official Image:docker 官方镜像
- Verified Publisher:经认证的发布者,这里的发布者通常是指一些商业实体
- Sponsored OSS:docker 赞助
进入仓库后可见下图,红框处是 TAG 清单和最新版本拉取指令的快速复制
可以在每个 TAG 上找到快速拉取指令
其他
docker 指令嵌套
docker 的指令可以嵌套引用,引用时使用 ${} 包裹,如
docker rmi -f ${docker images -qa}