Docker镜像与容器的理解
在学习docker入门过程中有些时候容易把容器和镜像这两个概念记混淆;下面说下我自己的理解不对望指正!有镜像才能创建容器这是根本前提!IMAGE镜像就好比我们的Java实体工程代码;在服务器上这套Java实体代码可以运行启动多份工程。依靠Java实体代码启动的一个个工程就相当于是容器;
准备工作:
使用docker pull ubuntu命令拉取一个最新的ubuntu镜像;使用docker pull redis:6.0.8拉取一个指定版本号为6.0.8的Redis镜像,下面容器相关操作都使用这两个镜像进行学习;
作为例子;
1.新建启动容器[docker run]
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
常用的参数:
● --name:为容器指定一个名称
● -d:后台运行容器并返回容器ID,也即启动守护式容器(比如后台启动Redis、Mysql...)
● -i:以交互模式(interactive)运行容器,通常与-t同时使用
● -t:为容器重新分配一个伪输入终端(tty),通常与-i同时使用。也即启动交互式容器(前台有伪终端,等待交互)
● -e:为容器添加环境变量
● -P:随机端口映射。将容器内暴露的所有端口映射到宿主机随机端口
● -p:指定端口映射-p指定端口映射的几种不同形式:
● -p hostPort:containerPort:端口映射,例如-p 8080:80
● -p ip:hostPort:containerPort:配置监听地址,例如 -p 10.0.0.1:8080:80
● -p ip::containerPort:随机分配端口,例如 -p 10.0.0.1::80
● -p hostPort1:containerPort1 -p hostPort2:containerPort2:指定多个端口映射,例如-p 8080:80 -p 8888:3306
例:
采用交互模式启动ubuntu系统并为该容器取名为myUbuntu01;
# -i 交互模式
# -t 分配一个伪输入终端tty# --name=容器名称 为启动好的容器指定一个名称
# ubuntu 镜像名称
# /bin/bash(或者bash) shell交互的接口
docker run -it --name=myUbuntu01 ubuntu /bin/bash
2.列出正在运行的容器[docker ps]
docker ps [OPTIONS]
● -a:列出当前所有正在运行的容器+历史上运行过的容器
● -l:显示最近创建的容器
● -n:显示最近n个创建的容器
● -q:静默模式,只显示容器编号
例:
显示最近创建的5个容器;
# -n 后面指定显示容器的个数
docker ps -n 5
3.退出容器
执行docker run 命令启动的容器有两种退出方式;
方式一:
执行exit;
注意:
执行exit;命令退出,容器会停止;
方式二:
ctrl + p + q;退出,容器不会停止;
4.启动停止运行的容器[docker start]
docker start 容器ID/名字
5.重启容器[docker restart]
docker restart 容器ID/名字
6.停止容器[docker stop]
docker stop 容器ID/名字
7.强制停止容器[docker kill]
docker kill 容器ID/名字
8.删除容器[docker rm]
# 删除已停止运行的容器
docker rm 容器ID/名字
# 强制删除容器(不管容器有没有停止)
docker rm -f 容器ID/名字
9.查看容器日志[docker logs]
# 查看容器日志
docker logs 容器ID/名字
10.查看容器内运行的进程[docker top]
# 查看容器内运行的进程
docker top 容器ID/名字
11.查看容器内部细节[docker inspect]
# 比如查看容器内部的I网关、IP、网桥、容器卷等信息
docker inspect 容器ID/名字
12.进入运行中的容器并以命令行交互
# 方式一(推荐)
docker exec -it 容器ID/名称 bin/bash
# 方式二
docker attach 容器ID/名称
两者区别:
1.exec是在容器中打开一个新的终端,并且启动新的进程,使用exit;命令退出容器时不会
停止容器;
2.attach是直接进入容器启动命令的终端,使用exit;命令退出时会导致容器停止;
小结
工作中推荐使用docker exec命令进入正在运行的容器,因为使用exit;退出时不会停止容器;
13.重容器内拷贝文件到宿主机[docker cp]
# 将容器中的文件拷贝到宿主机
docker cp 容器ID:容器文件路径 拷贝到宿主机路径
# 例如
将ID为cf6077b1a7e3的容器中的/data/myTest.txt文件拷贝到宿主机中的/data目录
docker cp cf6077b1a7e3:/data/myTest.txt /data
14.导出导入容器[docker export 或 docker import]
导出:
# 导出整个容器内容(用于备份容器或将备份的容器发送给其他服务器去运行)
docker export 容器ID > 文件名.tar
如:
docker export 1ba9f53257e1 > MyRedis.tar
说明:
导出是连同容器中的数据一起导出比如Redis中的数据也一起导出;
导入:
# 从tar包中的内容创建一个新的文件系统再导入为镜像
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
如:
cat MyRedis.tar | docker import - pyb/redis:6.0.8
说明:
导入之后会生成一个名为pyb/redis的镜像;