Docker容器
容器是Docker的另一个概念。就像我们使用的Vmware一样。需要使用一个镜像再Vmware中创建一个虚拟机,而每一个虚拟机需要一个镜像文件。而Docker 是更加轻量级的实现。
目录
1.3 create 命令与容器资源限制和安全保护相关的选项
1.创建 Docker 容器
命令 docker create
首先我们看看仓库里有那些镜像,我们选择其中一个
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ae2feff98a0c 2 weeks ago 133MB
centos 7 8652b9f0cb4c 7 weeks ago 204MB
我们选择 centos:7 作为镜像创建容器
[root@localhost ~]# docker create -it centos:7
581839129d540425b94a7d404b47358cf4a92504f5bb68ca50790b77913c027d
输出的就是这个容器的 Id
此时并没有启动容器,使用命令 docker ps -a 查看所有的容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
581839129d54 centos:7 "/bin/bash" 4 seconds ago Created hopeful_ritchie
27a51051a72c nginx "/docker-entrypoint.…" 21 hours ago Up 21 hours 0.0.0.0:80->80/tcp webserver
可以看到我们刚刚创建了一个容器 ,此时并没有运行它。如果要运行,要使用 docker start CONTAINER_ID 命令去启动容器,再启动之前,我们继续学习下docker 创建的时候的参数
1.1 create 命令与容器运行模式相关选项
1.2 create 命令与容器环境配置相关选项
1.3 create 命令与容器资源限制和安全保护相关的选项
其他比较重要的选项还包括
-
-l;--lable=[] : 以键值对方式指定容器的标签信息
-
--lable-file=[] : 从文件中读取标签信息
2.创建后启动容器
创建容器
[root@localhost ~]# docker create -it centos:7
5c259ecd4c3cd553ced9304c5b91c155484ce4d0f6646e6a8027eedcd4ba6f28
查看容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c259ecd4c3c centos:7 "/bin/bash" 3 seconds ago Created brave_chaplygin
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
启动刚刚创建的容器
[root@localhost ~]# docker start 5c259ecd4c3c
5c259ecd4c3c
查看容器运行状态
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c259ecd4c3c centos:7 "/bin/bash" 33 seconds ago Up 3 seconds brave_chaplygin
可以看到刚刚创建的容器已经启动了
3.新建并启动容器
除了创建容器后,使用docker start 命令来启动容器之外,还可以直接创建并启动容器。
使用命令
[root@localhost ~]# docker run centos:7 /bin/echo 'Hello World'
Hello World
可以看到容器运行并且输出了 Hello World
如果 centos:7 镜像 不存在,那么会先去下载镜像,然后再运行容器:步骤分解
-
docker pull centos:7
-
docker create -it centos7 [会返回容器id]
-
docker start 容器ID
在输出 Hello World 之后,容器就会自动终止
下面的命令用于启动一个 bash 终端,并进行用户交互
[root@localhost ~]# docker run -it centos:7 /bin/bash
[root@a643aeead20b /]# uname -a
Linux a643aeead20b 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
可以使用 exit 命令退出容器
3.1 退出错误码
状态码 | 说明 |
---|---|
125 | Docker deamon 执行出错,例如指定了不支持的 Docker 命令参数 |
126 | 所指定命令无法执行,例如权限出错 |
127 | 容器内命令无法找到 |
3.2 后台方式运行
大多数情况下容器都是以后台的形式运行在系统之中的
下面我们创建一个容器,一直输出 hello world
[root@localhost ~]# docker run -d centos:7 /bin/sh -c "while true;do echo hello world;sleep 1;done"
cec152dd71186516ebdd7e1a8723ae75fb53a6f2c5490e75cf344df71804730a
使用 docker ps 可以看到 该容器在后台一直运行着
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cec152dd7118 centos:7 "/bin/sh -c 'while t…" About a minute ago Up About a minute unruffled_yalow
通过容器的id查看这个容器输出的信息
[root@localhost ~]# docker logs cec152dd7118
hello world
hello world
...
4.终止容器
可以使用 docker stop 命令来终止运行的程序
命令格式 : docker stop[-t|--time[=10]][CONTAINER...]
线程会向容器发送 SIGTERM 信号,等待一段超时时间(默认为10s)后,在发送 SIGKILL 信号(强行终止)来终止容器
查看运行的容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cec152dd7118 centos:7 "/bin/sh -c 'while t…" 5 minutes ago Up 5 minutes unruffled_yalow
终止容器
[root@localhost ~]# docker stop cec152dd7118
cec152dd7118
查看正在运行的容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
可以看到没有正在运行的容器了
5.重启容器
启动一个存在的容器是 使用 docker start CONTAINER_ID
命令实现的。
而要将一个正在运行的容器进行重新启动,将要使用到 docker restart CONTAINER_ID
命令。首先会关闭容器,然后再启动容器。
6.进入容器
在使用 -d 参数的时候,容器启动会直接进入后台,用户无法看到容器中的信息,也无法进行操作。
要进入容器进行操作,有很多种方法:
-
attach 命令
-
exec 命令
-
nsenter 命令
6.1 attach 命令
attach 是 docker 自带的命令,
命令格式为 docker attach [--detach=keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
主要支持三个选项
-
--detach-keys[=[]] : 指定退出 attach 模式的快捷键序列,默认是 CTRL-p CTRL-q
-
--no-stfin=true|false:是否关闭标准输出,默认是保持打开
-
--sig-proxy=true|false : 是否代理收到的系统信号给应用程序,默认为 true
运行容器
[root@localhost ~]# docker run -itd centos:7
f49c4fca75269848a96dc6f77f6e6a392d7b661bcacde5218ad87b6e3c4d04b8
查看正在运行的容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f49c4fca7526 centos:7 "/bin/bash" 7 seconds ago Up 5 seconds brave_banzai
进入容器
[root@localhost ~]# docker attach brave_banzai
[root@f49c4fca7526 /]#
可以看到已经进入到了容器内。但是使用 attach 命令的时候有时候并不是很方便。当多个窗口同时用 attach 命令连到同意容器的时候,所有的窗口都会同步显示。当某个窗口因命令阻塞的时候,其他窗口也无法执行操作了。
6.2 exec 命令 ✔
Docker 从 1.3.0 版本提供了一个更加方便地 exec 命令,可以在容器内直接执行任意命令。
命令格式 : docker exec [-d|--detach] [--detach-keys[=[]] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARG...]
参数 | 说明 |
---|---|
-i;--interactive=true|false | 打开标准输入接受用户输入命令,默认为false |
--privileged=true|false | 是否给执行命令以高权限,默认为false |
-t;--tty=true|false | 分配伪终端,默认为false |
-u;--user="" | 执行命令的用户名或ID |
使用示例
[root@localhost download]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f49c4fca7526 centos:7 "/bin/bash" 38 minutes ago Up 3 seconds brave_banzai
进入容器
[root@localhost download]# docker exec -it f49c4fca7526 /bin/bash
[root@f49c4fca7526 /]#
这个方式是最为推荐的方式
6.3 nsenter 命令
7.删除容器
可以使用 docker rm 命令来删除处于终止或退出状态的容器
命令格式 docker rm[-f|--force][-l|--link][-v|--volumes] CONTAINER[CONTAINER...]
参数 | 说明 |
---|---|
-f;--force=false | 是否强行终止并删除一个运行中的容器 |
-l;--link=false | 删除容器的连接,但保留容器 |
-v;--volumes=false | 删除容器挂载的数据卷 |
默认情况下,不能删除正在运行的容器,需要使用 -f 表示强制删除容器。
8.导入和导出容器
有些时候, Docker 容器需要从一个系统迁移到另外一个系统,这时候就需要导入和导出容器了。
8.1导出容器
导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。使用 docker export 命令可以实现
命令格式 docker export [-o|--output[=""]]CONTAINER
其中 -o
选项可以指定导出的 tar 文件名,也可以直接通过重定向来实现
8.1.1使用实例
首先查看有那些容器
[root@localhost download]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f49c4fca7526 centos:7 "/bin/bash" 2 hours ago Up 56 minutes brave_banzai
导出容器
[root@localhost download]# docker export -o centos_7.tar f49c4fca7526
查看当前目录下文件
[root@localhost download]# ll
总用量 206756
-rw-------. 1 root root 211688960 1月 5 17:32 centos_7.tar
-rw-r--r--. 1 root root 25548 4月 7 2017 mysql57-community-release-el7-10.noarch.rpm
8.2导入容器
导出的文件可以通过 docker import 命令导入编程镜像
命令格式 docker import [-c|--change=[]] [-m|--message[=MESSAGE]] file|URL|-[REPOSITORY[:TAG]]
用户可以通过 -c;--change=[] 选项在导入的同时执行对容器进行修改的 Dockerfile 指令
[root@localhost download]# docker import centos_7.tar test:1.0
sha256:30c704a9b3294b245b0bd102cc16b494522efce3c844432d98658eb219d1a140
查看镜像
[root@localhost download]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 1.0 30c704a9b329 16 seconds ago 204MB
[实际上,既可以使用 docker load 导入镜像存储文件到本地镜像库,可以使用docker import 命令来导入一个容器快照到本地镜像库]