参考:
Docker 容器
有了镜像之后,我们便可以基于镜像创建容器,每一个容器都是独立存在的,当然容器之间也有依赖,比如一个 web 应用容器可能需要依赖 mysql、redis 等容器。
在 Docker 介绍 一节中我们提到了容器与传统虚拟机的对比:
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
启动容器
启动容器有两种方式,一种是 基于镜像创建并启动
一个容器,一种是启动已终止 Exited
的容器。
基于镜像创建并启动
基于镜像创建并启动容器,需要使用到 docker run
命令,比如基于 nginx 镜像创建一个 myNginx 容器:
docker run -d -p 80:80 --name myNginx nginx
当利用 docker run
来创建容器时,Docker 在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从地址池配置一个 ip 地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
docker run 常用参数
-
-i:打开STDIN,用于控制台交互。
-
-t:为标准输入分配一个终端,一般使用 -t 参数时,会在命令最后面加一个终端类型。比如:
docker run -t -i --name myNginx nginx /bin/bash
。这条命令进入后台运行,直接在当前终端分配一个终端进入容器。-i
-t
通常在一起使用。 -
-d:容器进入后台运行。如果希望运行于前台,可以使用
-it
。值得注意的是:容器是否会长久运行,是和
docker run
指定的命令有关,和-d
参数无关。 -
--expose=[]:指定容器暴露的端口,即修改镜像的暴露端口。
-
-p, --publish=[]:将容器端口与宿主机端口进行映射。
-
-P, --publish-all=false:随机映射一个
49000~49900
的端口到内部容器开放的网络端口。 -
-v, --volume=[]:数据卷挂载。
-
--name:指定容器名称,后续可以通过名字进行容器管理,links特性需要使用名字。
-
--restart="no":指定容器停止后的重启策略
- no 容器退出时不重启
- on-failure 容器故障退出(返回值非零)时重启
- always 容器退出时总是重启
-
--rm=false:指定容器停止后自动删除容器(不支持以docker run -d启动的容器)。
-
-u, --user="":指定容器的用户。
-
-w, --workdir="":指定容器的工作目录。
-
-c, --cpu-shares=0:设置容器CPU权重,在CPU共享场景使用。
-
-e, --env=[]:指定环境变量,容器中可以使用该环境变量。
-
-m, --memory="":指定容器的内存上限。
-
-h, --hostname="":指定容器的主机名。
-
--volumes-from=[]:给容器挂载其他容器上的卷,挂载到容器的某个目录。
-
--dns=[]:指定容器的dns服务器。
-
--dns-search=[]:指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件。
-
--entrypoint="":覆盖image的入口点。
-
--env-file=[]:指定环境变量文件,文件格式为每行一个环境变量。
-
--link=[]:指定容器间的关联,使用其他容器的IP、env等信息。
-
--network="":使用指定的网络,该网络需要预先创建。
-
--net="bridge":容器网络设置:
- bridge 使用docker daemon指定的网桥
- host 容器使用主机的网络
- container:NAME_or_ID 使用其他容器的网路,共享IP和PORT等网络资源
- none 容器使用自己的网络(类似--net=bridge),但是不进行配置
-
--privileged=false:指定容器是否为特权容器,特权容器拥有所有的capabilities。
-
--sig-proxy=true:设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理。
启动已终止容器
# 启动停止的容器
docker start "容器ID或名称"
# 重启容器
docker restart "容器ID或名称"
查看容器
# 查看运行中的容器
docker ps
# 查看所有容器,包括已终止的容器
docker ps -a
# 查看某个容器的详细信息
docker inspect "容器ID或名称"
使用下面命令查看容器日志:
docker logs "容器ID或名称" -f
其 -f
类似于 tail -f
,不加 -f
只会输出容器当前日志。
停止容器
docker stop "容器ID或名称"
进入容器
我们知道使用 -d
参数可以使容器运行于后台,如果我们需要进入容器中运行一些命令,可以使用 docker attach
或 docker exec
命令,进入后如果要退出容器可以使用 exit
命令。
# 使用 docker attach
docker attach "容器ID或名称"
# 使用 docker exec
docker exec -it "容器ID或名称" /bin/bash
这里需要注意的是,使用 docker attach
进入容器,一旦退出容器,那么容器也会随之停止运行。而 docker exec
则不会,因此,我们建议使用 docker exec
进入容器。
删除容器
值得注意的是删除容器是 docker rm
,而删除镜像是 docker rmi
# 删除一个停止运行的容器
docker rm "容器ID或名称"
如果要删除一个运行中的容器,可以添加 -f
参数。
使用下面的命令可以删除所有已停止运行的容器
docker container prune
导入导出容器
如果要导出本地某个容器,可以使用 docker export
命令:
docker export "容器ID" > xxx.tar
从容器快照文件中再导入为镜像,可以使用 docker import
命令:
cat xxx.tar | docker import - test/nginx:v1.0
此外,也可以通过指定 URL 或者某个目录来导入,例如:
docker import http://example.com/exampleimage.tgz example/imagerepo
注:用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
-- end --