【Docker教程】Docker 容器

介绍

Docker 容器是用于运行镜像的沙箱环境,它是 Docker 镜像的运行实例;容器都是相互隔离、互不可见的,我们可以理解为:镜像是Docker生命周期的打包和构建阶段,而容器是Docker的启动和执行阶段。

容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的。

镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

运行容器

使用 docker run 命令来运行一个容器
格式:

1
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...] [flags]

OPTIONS说明:

由于 docker run 命令 OPTIONS 比较多,这里只选择大家常用的几个选项来说明

-i, --interactive=false       打开STDIN,用于控制台交互
-t, --tty                     分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
-d, --detach=false            指定容器运行于前台还是后台,默认为false
-p, --publish list            指定主机的端口和容器端口的映射
-P, --publish-all             使用容器内随机一个网络端口映射到我们使用的主机上
-v, --volume list             给容器挂载存储卷,挂载到容器的某个目录
-m, --memory                  指定容器的内存上限
--link list                   指定容器间的关联,使用其他容器的IP、env等信息
-e, --env list                设置环境变量
--restart string              指定容器的重启策略  

示例:

后台运行一个nginx

1
$ docker run --name mynginx -p 8088:80 -v $PWD/nginx/www:/www -v $PWD/nginx/logs:/wwwlogs -d  nginx

查看运行的容器

  • 查看正在运行的容器
1
2
3
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
76ea0a1383d4 nginx "nginx -g 'daemon of…" Less than a second ago Up 3 seconds 0.0.0.0:8088->80/tcp mynginx
  • 查看所有容器(包含正在运行和退出的容器)
1
2
3
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
76ea0a1383d4 nginx "nginx -g 'daemon of…" 3 minutes ago Exited (0) 2 seconds ago mynginx
  • 查看容器的详细信息
1
$ dokcer inspect mygnix

进入容器

使用 docker exec 命令进入容器
格式:

1
$ docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

OPTIONS说明:

-d, --detach          分离模式: 在后台运行
-i, --interactive     即使没有附加也保持STDIN 打开
-t, --tty             分配一个伪终端
-e, --env list        设置环境变量

示例:

以交互模式进入容器

1
2
$ docker exec -it mynginx /bin/bash
root@76ea0a1383d4:/#

停止和重启容器

如果是交互式运行的一个容器,可以通过exit命令和Ctrl+d来退出终端,这样容器会立刻终止

1
2
3
# exit 直接退出,容器终止;或者快捷键Ctrl+d 
$ docer run -it centos /bin/bash
[root@f7b52eb5ab02 /]# exit

使用 docker stop 命令来停止正在运行的容器
格式:

1
$ docker stop [OPTIONS] CONTAINER [CONTAINER...]

示例:

指定容器名称停止正在运行的多个容器

1
$ docker stop mynginx myredis

重新启动容器

1
2
3
4
5
# 启动终止的容器
$ docker start mynginx

# 将一个运行态的容器终止,然后再重新启动它
$ docker restart myredis

删除容器

使用 docker rm 命令删除一个或多个容器
格式:

1
$ docker rm [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

-f, --force     强制删除
-l, --link      移除容器间的网络连接,而非容器本身
-v, --volumes   删除与容器关联的卷

示例:

强制删除容器mynginx

1
$ docker rm -f mynginx

删除mygninx,并删除容器挂载的数据卷

1
$ docker rm -v  mynginx

强制删除所有的容器

1
$ docker rm -f $(docker ps -aq)

删除容器使用 docker rm 命令 而 删除容器使用 docker rmi 命令,注意两者区别

导出容器

使用命令 docker export 导出本地某个容器

1
2
3
4
5
6
7
8
9
# 查看容器列表
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7b52eb5ab02 centos "/bin/bash" 18 hours ago Exited (0) 18 hours ago heuristic_edison
06a6eb00f8bc centos "/bin/bash" 18 hours ago Up 18 hours stupefied_euler
76ea0a1383d4 nginx "nginx -g 'daemon of…" 19 hours ago Up 19 hours 0.0.0.0:8088->80/tcp mynginx

# 导出容器快照,到本地文件
$ docker export 76ea0a1383d4 > mynginx.tar.gz

导入容器

使用命令 docker import 从快照文件中导入为镜像

1
cat mynginx.tar.gz | docker import - sqgulj/nginx:2.0