容器(containe)是镜像的运行时实例.
容器
如果镜像是一个模版,那么容器(containe)就是镜像的运行时实例.
为什么要使用容器
与传统的虚拟机相比,容器有如下优势
- 容器共享主机的资源, 更加轻巧.
- 容器可以根据需要加载必需的库、依赖项和文件.
- 容器可以更好在生产环境进行迁移.
启动容器
使用docker run -option image:tag command命令 command参数
来启动一个容器, 如:
docker run -it mysql /bin/echo hello world!
上述命令会启动一个容器并输出
option
可选列表如下
-
-d
容器在后台以domain
模式运行,返回容器id -
-i
以交互模式运行 通常与-t
一起使用 -
-P
容器内部端口随机映射到主机端口 -
-p
指定端口映射 格式 主机端口:容器端口 -
-t
: 为容器重新分配一个伪输入终端m,通常与-i
同时使用-it
一起使用可以将当前终端连接到容器终端 -
--name="newname""
为容器指定一个名称 -
--dns
指定容器DNS,默认与宿主一致 -
--dns-search example.com
指定容器DNS搜索域名,默认和宿主一致 -
-h
指定容器的hostname -
-e key=value
设置环境变量 -
--env-file=[]
从指定文件读取环境变量 -
--cpuset="0-2" or --cpuset="0,1,2"
绑定容器到指定CPU运行 -
-m
设定容器最大内存 -
--net="bridge"
指定容器的网络连接类型,支持bridge/host/none/container
四种类型 -
--link=[]
添加链接到另一个容器 -
--expose=[]
开放一个端口或一组端口 -
--volume,-v
绑定一个卷
与容器交互
使用-it
参数可以启动一个伪终端
docker run -it test:v1
容器后台运行
容器会在执行完成command
或者退出bash
后终止,使用-d
参数可以指定容器后台运行,此处用mysql
镜像启动一个容器
docker run -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
成功启动后会返回这个容器的id
防止容器退出
docker容器同时只能管理一个进程,如果这个进程退出那么容器也就退出了.例子
docker run -it --name test1 centos:latest /bin/sh
启动一个名为test1的centos镜像,然后输出exit
并回车,然后docker ps -a
发现这个容器已经退出
628d9bded677 centos:latest "/bin/sh" 7 seconds ago Exited (0) 4 seconds ago test1
exit
命令结束了docker
管理的/bin/sh
进程,因而无论是否这个容器中有没有其他进程在后台运行,容器都会退出.
换句话说,docker run
指定的容器启动时运行的程序结束,那么容器就会退出.
如何避免呢,可以在执行上述命令后,按CTRL+P+Q
切出,此时容器并不会退出.
docker run -it --name test1 centos:latest /bin/sh
然后按CTRL+P+Q
切出,再查看.
b30c4510a76c centos:latest "/bin/sh" 1 minutes ago Up 1 minutes test1
查看容器运行状态
使用docker ps
或者docker container ls
命令查看运行状态,与linux
的ps
命令非常相似
这里docker ps
的命令包括:
-
-a
列出所有容器 -
-l
列出最新创建容器 -
-n=2
列出最近创建的2个容器 -
-q
仅列出容器ID -
-s
显示容器大小
如果要查看所有容器,使用docker ps -a
查款容器日志
使用docker logs container_id|name
命令来查看容器日志.
容器重命名
在创建一个容器的时候,docker后自动对其进行重命名,也可以使用--name
来指定,以mysql为例
docker run -e MYSQL_ROOT_PASSWORD=123456 --name mysql_server -d mysql:5.6
登陆到容器
-d
指定容器后台运行后,可以使用两种方式登陆到容器.
-
docker attach container_id
不推荐,退出会导致容器停止运行. -
docker exec
推荐
docker exec -it mysql_server /bin/bash
检视容器
使用docker inspect container_id|container_name
命令来查看检视容器,通常会包含一些非常有用的信息
docker inspect mysql_server
设置容器端口
启动mysql
后,可以使用-p 宿主端口:容器端口
参数映射容器端口与宿主机端口,宿主端口和容器端口设置成不一样的只
比如12345:54321
表示宿主的12345
端口映射到容器的54321
端口.
上面已经启动了一个mysql
容器,容器中mysql
进程监听的是容器的3306端口,由于没有指定端口映射,在宿主机是无法访问容器中的mysql
.
如果想要外部访问,启动一个新的mysql
容器并绑定到宿主机的3306端口.
docker run -e MYSQL_ROOT_PASSWORD=123456 --name mysql_server_new -p 3306:3306 -d mysql:5.6
可以使用
docker port container_id/name
来查看一下容器的端口映射
docker port mysql_server_new
3306/tcp -> 0.0.0.0:3306
还可以使用docker ps
,可以看到PORTS
显示 3306->3306,测试一下
注:此处表述有误,无法访问并不是完全无法访问,使用iptable
工具映射过去也可以,比较麻烦而已.
关闭容器
使用docker container start/stop/restart container_id
来启动或停止一个容器
除此之外,还可以使用docker -kill container_id
来强行停止一个容器
删除容器
使用docker rm container_i
来删除一个容器,下面id为226db43edaed
和ab3d300443cd
的容器.
导入导出
使用docker export container_id > localfile
导出容器快照为本地文件.
docker export mysql_server_new > mysql.tar
使用docker import file/url image_name:tag
来将一个容器快照导入为本地快照
docker import mysql.tar mysql_import_test:v1
mysql
容器的快照被导入成了一个本地镜像.
可以使用docker commit
命令将本地容器快照导出为一个本地镜像
docker commit -a "zhangsheng" -m "mysql image" mysql_server_new test_mysql:v11111
commit
参数如下
- -a :提交的镜像作者
- -c :使用
Dockerfile
指令来创建镜像 - -m :提交时的说明文字
- -p :在commit时,将容器暂停