一、什么是镜像和容器

我们不做过深的解读,直接可以把他看做一个样板原型,容器就是根据这个样本实现出来一个产品,同时这个容器又可以进行一下包装或者二次加工,反过来做一个新的样板原型
**

二、获取一个镜像

通过docker pull 拉取仓库里面镜像

  1. # 语法
  2. # docker pull [OPTIONS] NAME[:TAG|@DIGEST]
  3. # OPTOINS
  4. # -a 拉取相关所有与NAME相关的镜像
  5. # -q 禁止详情输出
  6. #
  7. # :TAG 表示镜像具体的标签,默认值为latest,表示最新的
  8. # 例子
  9. docker pull centos #拉取一个centos latest镜像
  10. docker pull centos:7 #拉取centos 7镜像

测试
image.png
我们拉取用一个centos镜像,他的标签是latest

查看镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]
image.png

三、启动一个镜像为容器

通过docker run 启动镜像为一个容器

  1. # 语法
  2. # docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  3. # OPTIONS(常用)
  4. # -d 后台运行容器,并返回容器ID;
  5. # -i 以交互模式运行容器,通常与 -t 同时使用;
  6. # -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  7. # --name 为容器指定一个名称;
  8. # -v,-volume 绑定一个卷(做数据持久化)
  9. # --volumes-from
  10. # -p 指定端口映射,格式为:主机(宿主)端口:容器端口
  11. #
  12. # IMAGE 指代 [镜像名|镜像ID]
  13. # [COMMAND] [ARG...] 后面可以跟上一些shell命令 如果不写默认是 /bin/bash
  14. # 例子
  15. docker run -dit -p 8080:80 -v /root/docker/volumeData:/tmp/data --name test centos
  16. # 解释
  17. # 我们启动一个cento容器,他的名字叫test, 他是以交互式的方式运行,并且分配一个伪终端并进入,同时,
  18. # 映射了一个主机8080到容器的80端口,另外原主机的/root/docker/volumeData目录和宿主的/tmp/data
  19. # 目录建立了一个共享机制来共享数据

1、启动一个容器并进入容器

  1. docker run -it --name testCentos centos

image.png
可以看到这里多了一串hash,此时我们启动了容器并进入到了容器内部

2、启动一个容器,让他在后台运行
普通的启动一个镜像,然后我们通过 docker ps 查看容器
image.png
这时我们发现容器列表为空,是因为没有启动起来?其实不然,实际上容器是启动起来了,第二行,我们可以看到返回了一个hash串。
以下是参考原因:
① docker容器运行必须有一个前台进程, 如果没有前台进程执行,容器认为空闲,就会自行退出
② 容器运行的命令如果不是那些一直挂起的命令( 运行top,tail、循环等),就是会自动退出
③ 这个是 docker 的机制问题

解决办法**:

  1. # 法1
  2. docker run -d centos /bin/sh -c "while true; do echo 1; sleep 1; done"
  3. # 法2
  4. docker run -d centos tail -f /dev/null
  5. # 法3
  6. docker run -dit centos
  7. # 法4
  8. # 我们先启动容器docker run -it cetnos ,然后进入容器 docker attach [容器id/容器名], 按键盘 ctrl + p + q的方式退出,这里不能是ctrl + d,后者是直接把容器杀了 法4

总体思路前两个就是让他挂一个命令一直执行,但是有问题是,当我们docker attach [容器id/容器名] 的时候会卡界面
image.png
后两种是通过挂伪终端的方式让docker容器保持活跃

四、提交一个容器为一个新的镜像

一般来说,我们启动一个容器后,我们可以在这个容器里面安装各种自己自定义的软件,此后,我们可以将这个容器保留一个新的镜像作为一个新的蓝本。

提交一个容器成为一个新的镜像

  1. # 语法
  2. # docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
  3. # OPTIONS
  4. # -a 作者
  5. # -m 提交的信息
  6. # -p 提交期间暂停容器(默认是true)
  7. # -c 使用Dockerfile指令来创建镜像
  8. # CONTAINER [容器名/容器ID]
  9. # TAG 标签,默认latest
  10. # 例子
  11. docker commit -a 'zhenbo' -m '测试提交容器为一个镜像' testCentos newcentos
  12. # 解释 把容器testCentos 提交为 一个作者为'zhenbo' 信息为 '测试提交容器为一个镜像' 名字为 newcentos的一个新镜像

image.png

五、总

镜像与容器 - 图7