1 引言

在前面博文中,我们介绍了镜像。如果说镜像犹如面向对象中的类,本节要说的容器就是由类实例化出来的对象了,有了类才可以创建容器。

先从拉取一个官方提供的ubuntu最新镜像:

$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
Digest: sha256:f08638ec7ddc90065187e7eabdfac3c96e5ff0f6b2f1762cf31a4f49b53000a5
Status: Downloaded newer image for ubuntu:latest

我们以这个镜像创建容器进行展开。

2 创建容器

(1)新建并启动容器:
docker run [OPTION] IMAGE [COMMAND] [ARG…]

这一命令会根据IMAGE容器新建并启动一个容器,如果该容器在本机中不存在,则先从默认仓库中下载,然后执行新建及启动操作。命令中,OPTION的一些常用选项如下:

  • --name="容器别名":为即将启动的容器指定一个别名
  • -d:后台运行容器,并返回容器ID,也就是说,启动守护式容器。
  • -i:以交互模式运行容器,通产与-t同时使用。
  • -t:为容器重新分配一个伪输入终端,通常与-i同时使用。
  • -P:随机端口映射;
  • -p:指定端口映射,有以下4种格式:

ip:hostPort:containerPort

ip::containerPort

hostPort:containerPort

containerPort

例如,以ubuntu:18.04镜像以交互式终端方式启动一个新容器,指定容器别名为ubuntu_docker:

$ docker run -it --name ubuntu_docker ubuntu:18.04
root@3c087af2e00c:/#
(2)启动已创建好的容器
docker start [OPTIONS] CONTAINER

OPTIONS包含两个参数:

  • -a:是否绑定到标准输入输出

  • -i:保持标准输入打开

(3)重启容器
docker restart [OPTION] CONTAINER

重启命令只包含一个OPTION选项:

-t :指定多少秒后重启容器

3 查看容器

查看容器通过以下命令:

$ docker ps [OPTIONS]

OPTIONS常用选项如下:

  • -a:列出当前所有正在运行的容器和曾经运行过的容器。
  • -l:现实最近(上一个)运行过的容器。
  • -n:显示最近n个创建的容器。
  • -q:静默模式,只显示容器编号。
  • --no-trunc:不截断输出。

下面通过示例说明:

(1)不加任何参数时,表示列出正在运行的容器:

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3c087af2e00c ubuntu:18.04 "/bin/bash" About a minute ago Up About a minute ubuntu_docker
(2)列出所有容器:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3c087af2e00c ubuntu:18.04 "/bin/bash" 5 minutes ago Up 5 minutes ubuntu_docker
41989e88ecfa ubuntu:18.04 "/bin/bash" 11 minutes ago Exited (0) 6 minutes ago myubuntu
18c03ae954ab ubuntu_dockerfile_git:1.0 "/bin/bash" 2 weeks ago Exited (0) 2 weeks ago amazing_leavitt

可以看到,在STATUS一列,有Up和Exited两种状态,分别表示正在运行和已退出的状态。

(3)列出最近运行的3个容器:

$ docker ps -n 2
$ docker ps -n 2
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3c087af2e00c ubuntu:18.04 "/bin/bash" 2 hours ago Up 2 hours ubuntu_docker
41989e88ecfa ubuntu:18.04 "/bin/bash" 2 hours ago Exited (0) 12 minutes ago myubuntu

4 停止、退出容器

(1)交互终端容器退出

  • exit:直接输入exit然后回车,这种方式退出容器后,容器也随之停止。

  • 快捷键 ctrl + P + Q(必须是大写模式下):容器不停止退出。
(2)停止容器
$ docker stop [OPTIONS]

stop命令只包含一个OPTION选项:

-t :指定多少秒后停止容器

(3)强制停止容器
$ docker kill [OPTIONS]

OPTIONS只包含一个选项:

-s :发送给容器的信号

docker stop和docker kill虽然都是关闭容器,但是有区别的。docker stop相当于我们电脑关机时,通过开始菜单中的关机选项关机,而docker kill就相当于强制拔掉电源关机。

5 删除容器

docker rm [OPTIONS] CONTAINER
(1)删除已停止容器

docker rm 不使用任何参数时,表示删除已停止容器,如果容器还在运行状态,会出错。

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3c087af2e00c ubuntu:18.04 "/bin/bash" 2 hours ago Up 2 hours ubuntu_docker
$ docker rm 3c087af2
Error response from daemon: You cannot remove a running container 3c087af2e00c4f3d11a655edbd6f0acd62396b8489a5722fdfb45de08d5d5af4. Stop the container before attempting removal or force remove
$ docker stop 3c087af
3c087af
$ docker rm 3c087af
3c087af
(2)强制删除容器
$ docker rm -f myubuntu
(3)删除多个容器
$ docker rm -f 41989e88ecfa 18c03ae954ab # 删除多个指定容器
41989e88ecfa
18c03ae954ab
$ docker rm -f $(docker ps -a -q) # 删除所有容器

6 进入容器

进入容器操作是对于在后台运行中的容器而言的,也就是守护式容器。我们先来启动一个守护式容器:

$ docker run -d ubuntu
406330111f0e68c1df804b37cc2664895043dd4b15ad565141f9844ac9fd7edb

docker run命令配合-d参数我们在上面了解过,是启动守护式容器,运行命令后返回了启动的容器id,容器则在后台默默运行。但是,这个时候,如果你用docker ps命令查看,你会发现,并没有容器在运行:

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

这是因为,在后台运行的容器里面,必须要有一个持续运行的进程,否则容器启动后又会自动关闭,这是docker运行机制决定的。

所以,为了演示进入容器,我们先通过docker run -it启动一个交互式容器,然后通过快捷键ctrl + Q + P退出容器,然后让容器后台运行。查看一下在后台运行的容器:

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
90999d16c0e8 ubuntu "/bin/bash" About a minute ago Up About a minute adoring_haslett

如果要再次使用刚才的容器执行操作,有两种方法:

方法一:用docker attach进入容器,然后交互式执行操作

docker attach CONTAINER
$ docker attach 90999d16c0e8
root@90999d16c0e8:/#
方法二:通过docker exec直接调用容器执行操作。例如,查看容器中/var目录
$ docker exec -t 90999d16c0e8 ls -l /var
total 36
drwxr-xr-x 2 root root 4096 Apr 24 2018 backups
drwxr-xr-x 5 root root 4096 May 15 14:07 cache
drwxr-xr-x 1 root root 4096 Apr 5 2018 lib
drwxrwsr-x 2 root staff 4096 Apr 24 2018 local
lrwxrwxrwx 1 root root 9 May 15 14:06 lock -> /run/lock
drwxr-xr-x 3 root root 4096 May 15 14:06 log
drwxrwsr-x 2 root mail 4096 May 15 14:06 mail
drwxr-xr-x 2 root root 4096 May 15 14:06 opt
lrwxrwxrwx 1 root root 4 May 15 14:06 run -> /run
drwxr-xr-x 2 root root 4096 May 15 14:06 spool
drwxrwxrwt 2 root root 4096 May 15 14:07 tmp

所以,通过docker exec命令执行容器的/bin/bash也可以启动容器进行交互式操作:

$ docker exec -t 90999d16c0e8 /bin/bash
root@90999d16c0e8:/#

总结一下两种方法的区别:

docker attach命令直接进入容器启动命令的终端,不会启动新的进程;

docker exec是在容器终端打开新的终端,并且可以启动新的进程。

7 日志查看

下面,我们在启动的后台容器中运行一段持续运行的脚本:

$ docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 2; done"
a7ab05b236b862f22c5356c388d03a2c24bfe09df42a7b7c5cb4aebdb49985c0

这时候再用docker ps 查看就可以看到有一个容器后台运行了:

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a7ab05b236b8 ubuntu "/bin/sh -c 'while t…" 46 seconds ago Up 44 seconds vigorous_booth

我们可以通过日志来了解刚运行的守护式容器运行情况。查看日志通过docker logs命令:

docker logs [OPTIONS] CONTAINER

OPTIONS常用参数如下:

-f:持续更新输出日志

-t:在日志中显示时间戳信息

-n:显示多少条日志记录

-tail: 查看最后的指定数量日志

不添加如何参数得查看日志:

$ docker logs a7ab05b236b862f22c5356c
hello world
hello world
hello world
hello world
hello world

通知查看日志时间戳信息:

~$ docker logs -t a7ab05b236b862f22c5356c
2019-06-13T13:18:06.957596996Z hello world
2019-06-13T13:18:09.042404246Z hello world
2019-06-13T13:18:11.043577253Z hello world
2019-06-13T13:18:13.044648977Z hello world
2019-06-13T13:18:15.045652444Z hello world
2019-06-13T13:18:17.046743917Z hello world
查看最后3行日志:
$ docker logs --tail 3 62d5c4208bd1a5017
hello world
hello world
hello world

8 主机与容器间的文件拷贝

有时候,我们需要将容器中的文件拷贝到主机内,这一操作可以通过docker cp命令。我们先进入容器,并在/tmp目录下创建一个abc文件。

$ docker attach 90999d16c0e8
root@90999d16c0e8:/# cd /tmp
root@90999d16c0e8:/tmp# touch abc
root@90999d16c0e8:/tmp# ll
total 8
drwxrwxrwt 1 root root 4096 Jun 13 14:01 ./
drwxr-xr-x 1 root root 4096 Jun 13 13:40 ../
-rw-r--r-- 1 root root 0 Jun 13 14:01 abc
root@90999d16c0e8:/tmp#

然后回到主机,将刚才的abc文件拷贝到主机当前用户目录下的download目录中:

$ docker cp 90999d16c0e8:/tmp/abc ~/download/

查看一下,确实在download目录下找到了拷贝过来的文件:

~$ cd download/
~/download$ ll
drwxrwxr-x 4 chb chb 4096 Jun 13 22:05 ./
drwxr-xr-x 15 chb chb 4096 Jun 13 20:50 ../
-rw-r--r-- 1 chb chb 0 Jun 13 22:01 abc

从主机拷贝文件到容器。同样的,我们先在宿主机的当前用户目录下的download目录下创建一个123文件,然后将这个文件拷贝到容器/tmp目录中:

$ touch 123
$ docker cp ~/download/123 90999d16c0e8:/tmp/
$ docker attch 90999d16c0e8
$ docker attach 90999d16c0e8
root@90999d16c0e8:/tmp# ll
total 8
drwxrwxrwt 1 root root 4096 Jun 13 14:55 ./
drwxr-xr-x 1 root root 4096 Jun 13 13:40 ../
-rw-rw-r-- 1 1000 1000 0 Jun 13 14:54 123
-rw-r--r-- 1 root root 0 Jun 13 14:01 abc

9 导入和导出容器

在有些情况下,我们需要将容器从一台主机迁移到另一台主机,此时就需要用到容器的导入和到处功能。

9.1 导出容器

导出容器的命令为 docker export ,具体命令格式如下:

docker export [OPTIONS] CONTAINER

OPTIONS可选参数:

-o : 指定导出的tar文件名

$ docker export -o mycontainer.tar fd4af8e0b8b3
$ ll
total 70656
drwxrwxr-x 2 chb chb 4096 Jun 18 07:55 ./
drwxr-xr-x 18 chb chb 4096 Jun 18 07:51 ../
-rw------- 1 chb chb 72333824 Jun 18 07:55 mycontainer.tar

这个mycontainer.tar文件就是我们容器导出的打包文件,将其拷贝到其他主机上进行导入即可。

另外docker export也可以通过重定向来实现导出容器:

$ docker export fd4af8e0b8b3 > mycontainer2.tar

效果和-o参数时一样的。

9.2 导入容器

在上一小节中docker export导出的文件是容器的一个快照,我们可以使用docker import来导入为一个镜像。docker import 命令格式如下:

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

OPTIONS有两个参数:

-c : 在导入的同时执行对容器进行修改 的dockerfile指令。

-m : 为导入的容器添加commit信息。

将上一节上导出的mycontainer.tar导出为名为myubuntu:v1.0的镜像:

$ docker import mycontainer.tar test/ununtu:v1.0
sha256:623d9d0fa52b924579a6223a001951fb3b162917b410fb66f7a429e009b5fc56
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ununtu v1.0 623d9d0fa52b 7 seconds ago 69.9MB

10 总结

本篇主要介绍docker容器的主要操作,基本囊括了大部分的日常用法,对于端口映射等内容,在后续博文中再行展开。

 
 
 
 
 

docker系列(三):docker容器的更多相关文章

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

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

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

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

  3. Docker系列三:Docker容器管理

    Docker容器管理 1. 单一容器管理 1) 容器的启动 $ docker run --name gitlab-redis -d --volume /srv/docker/gitlab/redis: ...

  4. Docker系列(三):Docker自定义容器镜像

    将容器编程镜像: docker commit [repo:tag] 网上有这句话:当我们在制作自己的镜像的时候,会在container中安装一些工具.修改配置,如果不做commit保存 起来,那么co ...

  5. Docker系列(三)常用命令

    命令说明 docker pull 格式: docke pull [OPTIONS] NAME[:TAG] 作用:下载名称为 name 的镜像 例子: sudo docker pull dl.docke ...

  6. Docker系列06—基于容器制作镜像并上传到Docker Registry

    本文收录在容器技术学习系列文章总目录 1.制作镜像 1.1 镜像的生成途径 基于容器制作 dockerfile,docker build 本篇主要详细讲解基于容器制作镜像:基于dockerfile 制 ...

  7. Docker系列教程05 容器常用命令

    https://mp.weixin.qq.com/s?__biz=MzI4ODQ3NjE2OA==&mid=2247483890&idx=1&sn=2721f08624e6de ...

  8. Docker系列08:容器监控

    1 监控解决方案 cadvisor+influxdb+grafana cAdvisor:Google开源的工具,用于监控Docker主机和容器系统资源,通过图形页面实时显示数据,但不存储:它通过宿主机 ...

  9. Docker系列之Docker容器(读书笔记)

    一.介绍 容器是独立运行的一个或一组应用,以及它们的运行态环境.对应的,虚拟机可以理解为模拟运行的一整套操作系统和排在上面的应用. 二.容器 2.1 启动容器 启动容器有两种方式,一种是基于镜像新建一 ...

  10. docker(三)容器的基本操作

    下载镜像 docker pull name 基本启动容器 docker run IMAGE command args run 在新容器中运行 IMAGE 镜像名称 command 容器命令 args ...

随机推荐

  1. XAF导航系统介绍

    Navigation System 导航系统 10 min to read 阅读时长10分钟 This topic introduces the concept of the navigation s ...

  2. docker redis实现主从复制

    1.使用docker启动三个redis实例,容器名称分别为:myredis-master-6379,myredis-slave-6380,myredis-slave-6381.通过命令可以看到容器给三 ...

  3. Python Web(一)

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.Web框架 1.socket网络编程 架构:C/S 协议:TCP/UDP 传输层 2.Web应用 架构:B/S ...

  4. Python 第一個程序

    以默認方式安裝,會將 Python 安裝在目錄 C:\Users\Administrator\AppData\Local\Programs\Python\Python37 下: 有趣的是: 在此目錄下 ...

  5. Lniux系统-Ubantu安装搜狗输入法

    1.在官网下载搜狗输入法的安装包-https://pinyin.sogou.com/linux/?r=pinyin 2.终端打开,进行解压安装--sudo dpkg -i sogoupinyin_2. ...

  6. Docker中进入容器命令行及后台运行

    Docker中我们一般会有两种执行命令的方式,一种是直接进入容器的命令行,在终端执行并查看结果,一种是在后台执行,并不会在终端查看结果. 1.进入容器命令行 su root docker run -i ...

  7. Linux CentOS 6.5 卸载、安装JDK1.8

    卸载系统自带的jdk 1. 查询系统是否已经安装了jdk rpm -qa|grep java 2. 卸载已安装的jdk, 系统可能会自带多个jdk版本, 按需卸载 rpm -e --nodeps ja ...

  8. 3天学会kettle -全网最全的kettle教程

    从资源库开始,详细讲解了kettle的所有控件的用法,无论你是开发人员.运维人员还是测试人员. 通过此教程都可以很快速的掌握kettle,再加上笔者的实例,3天学会kettle的实战操作. 欢迎关注公 ...

  9. python中可变与不可变类型的全局变量

    python中的不可变类型的全局变量如int  a=1,str  b='hello', 若需要修改必须加global申明, 而全局变量是可变类型的,如list, dict ,则直接修改list.app ...

  10. AcWing 791. 高精度加法 解题记录

    题目地址 https://www.acwing.com/problem/content/description/793/ 题目描述给定两个正整数,计算它们的和. 输入格式共两行,每行包含一个整数. 输 ...