一、创建容器

  容器是Docker另一个核心的概念,简单来说,容器是镜像的一个运行实例,所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层

1.1. 新建容器

  使用docker create命令来新建容器

[root@rsync131 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest 5182e96772bf 6 weeks ago 200 MB
[root@rsync131 ~]# docker create centos
b9dd06b5dcba561b178b1892631cd318f0babd4a9a3f067761963a6ab61fe078
[root@rsync131 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b9dd06b5dcba centos "/bin/bash" 9 seconds ago Created sleepy_sammet

1.2. 启动容器

  使用docker start命令来启动容器

[root@rsync131 ~]# docker start b9dd06b5dcba
b9dd06b5dcba
[root@rsync131 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b9dd06b5dcba centos "/bin/bash" About a minute ago Exited (0) 4 seconds ago sleepy_sammet

  PS:不知道为什么我使用这样的方式是启动不了容器的,待解释

1.3. 新建并启动容器

  一般在创建容器的是我们不会使用上面的两步的方式来进行创建,有个更简单的方式就是在创建的时候直接启动

  使用docker run 命令,创建并启动容器

[root@rsync131 ~]# docker run -it -d --name test_centos centos
159a08c11fece853626516ab94b401464efd85d69c1f88706ec17a29178fee54
[root@rsync131 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
159a08c11fec centos "/bin/bash" 3 seconds ago Up 3 seconds test_centos docker run:死命令
-i:让容器的标准输入保持打开
-t:分配个伪终端
-d:守护状态运行
--name:指定容器名字参数
test_centos:容器名字
centos:镜像名或者镜像ID

  这里我们说一下docker run执行的时候都干了什么

    检查本地镜像是否存在,不存在则会自动去公有仓库去下载

    利用镜像创建容器,并启动容器

    分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层

    从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中

    从网桥的地址池配置一个IP给容器

    执行用户指定的应用程序

1.4. 查看容器运行日志

  使用命令docker logs 来查看日志

[root@rsync131 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
159a08c11fec centos "/bin/bash" 21 minutes ago Up 21 minutes test_centos
[root@rsync131 ~]# docker logs 159a08c11fec

二、终止容器

2.1. 终止容器

  使用docker stop 来终止正在运行的容器

语法格式:
docker stop 容器名 常用选项:
-t,--time[=10] : 10秒后发送终止信号

  使用docker kill 命令可以直接终止容器

  docker kill 命令会直接发送SIGKILL信号来强行终止容器

[root@rsync131 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
159a08c11fec centos "/bin/bash" 29 minutes ago Up 29 minutes test_centos
[root@rsync131 ~]# docker stop 159a08c11fec
[root@rsync131 ~]# docker kill 159a08c11fec

2.2. 查看终止的容器

  使用docker ps 只是可以查看正在运行的容器

  使用docker ps -a 则可以看到所有的容器包括正在运行的和已经终止的容器

[root@rsync131 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
159a08c11fec centos "/bin/bash" 30 minutes ago Up 30 minutes test_centos
[root@rsync131 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
159a08c11fec centos "/bin/bash" 30 minutes ago Up 30 minutes test_centos
b9dd06b5dcba centos "/bin/bash" 36 minutes ago Exited (0) 9 minutes ago sleepy_sammet

  

2.3. 启动和重启已经终止的容器

  已经终止的容器我们可以使用docker start 命令来启动

  也可以使用docker restart 命令将一个正在运行的容器先stop后start

[root@rsync131 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
159a08c11fec centos "/bin/bash" 30 minutes ago Up 30 minutes test_centos
b9dd06b5dcba centos "/bin/bash" 36 minutes ago Exited (0) 9 minutes ago sleepy_sammet
[root@rsync131 ~]# docker start b9dd06b5dcba
b9dd06b5dcba
[root@rsync131 ~]# docker restart 159a08c11fec
159a08c11fec

  

三、进入容器

  在使用 -d 选项来运行容器的时候,容器会在后台运行,用户是无法看到容器的信息的,也无法进入操作

  这个时候如果我们要进入容器进行操作,应该怎么办呢?在docker 中进入docker中的方法有很多种,比如官方的attach和exec命令,以及第三方的nsenter工具(这个没有用过 最常用的还是exec)等

3.1. attach 命令

attach命令是docker自带的命令
语法格式:
docker attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER 支持的常用主要选项:
--detach-keys[=[]]:指定退出attach模式的快捷键序列,默认是CTRL+p CTRL-q
--no-stdin=true|false :是否关闭标准输入,默认true
--sig-proxy=true|false : 是否代理收到的系统信号给应用程序,默认是true
[root@rsync131 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
159a08c11fec centos "/bin/bash" 41 minutes ago Up 10 minutes test_centos
[root@rsync131 ~]# docker attach 159a08c11fec
[root@159a08c11fec /]#

PS:使用attach命令进入容器是很不方便的,就是这个命令只允许一个人使用容器,在开多个窗口同时用attach进入容器的时候,窗口执行的命令会同步,当一个窗口阻塞了,其他窗口就不能玩了,所有不用这个命令,太坑了

3.2. exec 命令

  为了解决上面的坑,docker在1.3.0版本提供了exec这个命令解决了attach命令的坑

语法格式:
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@rsync131 ~]# docker exec -it 159a08c11fec bash
[root@159a08c11fec /]# ls
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@159a08c11fec /]#

  可以看到,一个bash终端打开了,在不影响容器内其他应用的前提下,用户可以很容易的与容器进行交互

PS:通过制定 -it 参数保持标准输入,并且分配个伪终端,是很推荐的方式哦

四、删除容器

  使用docker rm 命令来删除处于终止或者退出状态的容器

语法格式:
docker rm [-f|--force] [-l|--link] [-v|--volumes] CONTAINER [CONTAINER.....] 主要选项参数:
-f,--force=false:是否强行终止并删除运行中的容器
-l,--link=false:删除容器的链接,但是保留容器
-v,--volumes=false:删除容器挂载的数据卷
[root@rsync131 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
159a08c11fec centos "/bin/bash" 2 hours ago Up About an hour test_centos
b9dd06b5dcba centos "/bin/bash" 2 hours ago Exited (0) About an hour ago sleepy_sammet
[root@rsync131 ~]# docker rm b9dd06b5dcba
b9dd06b5dcba
[root@rsync131 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
159a08c11fec centos "/bin/bash" 2 hours ago Up About an hour test_centos

  默认情况下,docker rm命令只能删除已经终止的容器,不能删除运行中的容器,想要删除运行中的容器可以使用 -f 参数,来强制的删除

五、容器的导入与导出

  在做容器迁移的时候我们就要先把容器导出,然后在导入到其他的地方

5.1. 导出容器

  使用命令docker export 命令来导出容器

语法格式:
docker export [-o|--output[=""]] CONTAINER 主要选项参数:
-o,--output:指定导出的tar文件名
[root@rsync131 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
159a08c11fec centos "/bin/bash" 2 hours ago Up About an hour test_centos
[root@rsync131 ~]# docker export -o centos_test.tar.gz 159a08c11fec
或者
[root@rsync131 ~]# docker export 159a08c11fec > centos_test.tar.gz
[root@rsync131 ~]# ll
总用量 273536
-rw-------. 1 root root 1513 8月 20 20:25 anaconda-ks.cfg
-rw------- 1 root root 280093696 9月 23 11:51 centos_test.tar.gz

5.2. 导入容器

  使用命令docker import 导入变成镜像

语法格式:
docker import [-c|--change[=[]]] [-m|--messge[=MESSAGE]] file|URL|- [REPOSITORY[:TAG]] 用户可以通过-c 选项在导入的同时执行对容器进行修改的Dockerfile指令
[root@rsync131 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@rsync131 ~]# ll
总用量 273536
-rw-------. 1 root root 1513 8月 20 20:25 anaconda-ks.cfg
-rw-r--r-- 1 root root 280093696 9月 23 11:52 centos_test.tar.gz
[root@rsync131 ~]# docker import centos_test.tar.gz centos:1.0
sha256:f54ee7febeda5d3d8af11cc4756c1e6661feb84b2af6280654ef07ddf8bdead2
[root@rsync131 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 1.0 f54ee7febeda 5 seconds ago 271 MB
docker.io/centos latest 5182e96772bf 6 weeks ago 200 MB

  

Docker容器(三)的更多相关文章

  1. 初步了解Docker容器(三)

    目录 一.初步了解 1.docker run运行容器 2.docker images查看镜像 3.docker ps查看容器 4.查看其Dockerfile文件 二.Docker 知识问答 小结 一. ...

  2. 容器间通信的三种方式 - 每天5分钟玩转 Docker 容器技术(35)

    容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信. IP 通信 从上一节的例子可以得出这样一个结论:两个容器要能通信,必须要有属于同一个网络的网卡. 满足这 ...

  3. Docker容器镜像瘦身的三个小窍门(转)

    [转自:http://dockone.io/article/8174] 在构建Docker容器时,我们应尽可能减小镜像的大小.使用共享层的镜像尺寸越小,其传输和部署速度越快. 不过在每个RUN语句都会 ...

  4. Docker容器互访三种方式

    我们都知道docker容器之间是互相隔离的,不能互相访问,但如果有些依赖关系的服务要怎么办呢.下面介绍三种方法解决容器互访问题. 方式一.虚拟ip访问 安装docker时,docker会默认创建一个内 ...

  5. Docker 系列三(容器管理).

    一.运行容器 1.基于镜像新建一个容器并启动 : tomcat:8.0 -i:交互式操作 -t:终端 -rm:容器退出后随之将其删除,可以避免浪费空间 -p :端口映射 -d :容器在后台运行 指明了 ...

  6. 【Docker】第三篇 Docker容器管理

    一.Docker容器概述: 简单理解容器是镜像的一个实例. 镜像是静态的只读文件,而容器的运行需要可写文件层. 二.创建容器 [root@web130 ~]# docker create -it ub ...

  7. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之flanneld网络介绍及部署(三)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.flanneld介绍 ...

  8. AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排

    一.前言 上一篇部署了一个最基础的helloworld应用,创建了两个容器和一个network,还算应付得过来. 如果该应用继续引入mysql.redis.job等若干服务,到时候发布一次得工作量之大 ...

  9. Docker(三):利用Kubernetes实现容器的弹性伸缩

    一.前言 前两章有的介绍docker与Kubernetes.docker是项目运行的容器,Kubernetes则是随着微服务架构的演变docker容器增多而进行其编排的重要工具.Kubernetes不 ...

随机推荐

  1. 2018.09.27 bzoj3029: 守卫者的挑战(概率dp)

    传送门 概率dp经典题目. 直接f[i][j][k]f[i][j][k]f[i][j][k]表示当前是第i次挑战,已经胜利了j次,目前的背包剩余空间是k. 然后用前面的转移后面的就行了. 注意第三维可 ...

  2. IntelliJ IDEA 2017版 编译器使用学习笔记(一) (图文详尽版);IDE快捷键使用;IDE多行代码同时编写

    IntellJ是一款强大的编译器,那么它有很多实用的功能 一.鼠标点击减少效率,快捷键实现各种跳转 (1)项目之间的跳转 快捷键位置: 操作:首先要有两个项目,然后,在不同窗口打开:如图: 然后使用快 ...

  3. Python是什么

    Python是一种编程语言,它的名字来源于一个喜剧.也许最初设计Python这种语言的人并没有想到今天Python会在工业和科研上获得如此广泛的使用.著名的自由软件作者Eric Raymond在他的文 ...

  4. 记spring mvc传入List<Object>的一次尝试

    首先,看一段异常: org.springframework.http.converter.HttpMessageNotReadableException: Could not read documen ...

  5. 20155320 2016-2017-2 《Java程序设计》第7周学习总结

    20155320 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 时间与日期 认识时间与日期 时间的度量 GMT(Greenwich Mean Time)时间 ...

  6. Codeforces777A Shell Game 2017-05-04 17:11 59人阅读 评论(0) 收藏

    A. Shell Game time limit per test 0.5 seconds memory limit per test 256 megabytes input standard inp ...

  7. 【WinRT】获取 Uri 中的参数(QueryString)键值对

    在控制台或者其它类型的项目中,可以添加 System.Web,使用以下代码来获取一个 Uri 中的参数 Uri uri = new Uri("http://www.cnblogs.com/h ...

  8. 【转】C#发送Email邮件

    转自:http://hi.baidu.com/bluesky_cn/item/8bb060ace834c53f020a4df2 下面用到的邮件账号和密码都不是真实的,需要测试就换成自己的邮件账号. 需 ...

  9. Spring Boot 2 实践记录之 条件装配

    实验项目是想要使用多种数据库访问方式,比如 JPA 和 MyBatis. 项目的 Service 层业务逻辑相同,只是具体实现代码不同,自然是一组接口,两组实现类的架构比较合理. 不过这种模式却有一个 ...

  10. ES6 学习笔记之三 函数参数默认值

    定义函数时为参数指定默认值的能力,是现代动态编程语言的标配.在ES6出现之前,JavaScript是没有这种能力的,框架为了实现参数默认值,用了很多技巧. ES6 的默认参数值功能,与其他语言的语法类 ...