INDEX

  • §1 容器
  • §1.1 docker 容器的运行模式
  • §1.2 docker 容器的端口映射
  • §1.3 docker 容器的退出机制
  • §2 仓库
  • §2 .1 阿里云仓库
  • §2 .2 docker 私有仓库
  • §3 数据卷
  • §4 docker hub
  • 其他


§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 容器的端口映射

前端docker打包规范 docker前台运行_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前台运行_容器_02


创建命名空间

前端docker打包规范 docker前台运行_云原生_03

创建镜像仓库

前端docker打包规范 docker前台运行_docker_04


docker 阿里云仓库快速指令

下面指令可以从具体仓库的基本信息中获取,如下图

前端docker打包规范 docker前台运行_数据_05

登录阿里云仓库

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

登录后界面如图

前端docker打包规范 docker前台运行_docker_06


如 github 搜索镜像仓库

前端docker打包规范 docker前台运行_前端docker打包规范_07

镜像仓库的认证

前端docker打包规范 docker前台运行_前端docker打包规范_08


docker 的镜像仓库有 4 种认证(上图的三种和无认证)

  • Docker Official Image:docker 官方镜像
  • Verified Publisher:经认证的发布者,这里的发布者通常是指一些商业实体
  • Sponsored OSS:docker 赞助

进入仓库后可见下图,红框处是 TAG 清单和最新版本拉取指令的快速复制

前端docker打包规范 docker前台运行_docker_09



可以在每个 TAG 上找到快速拉取指令

前端docker打包规范 docker前台运行_前端docker打包规范_10

其他

docker 指令嵌套
docker 的指令可以嵌套引用,引用时使用 ${} 包裹,如

docker rmi -f ${docker images -qa}