docker系列(三):docker容器

时间:2022-03-09 10:56:22

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. 那些年蹚过的坑(c++)

    1 main中的参数 尽量用英文双引号括起来,否则可能会出现字符串截断的情况(linux gcc 4.4 不加英文引号的话,遇到英文;会丢弃;后面的部分) 2 包含ipv6地址结构体(in6_addr ...

  2. 关于Xcode7更新之后使用 SDWebImage 图片加载不出来

    解决方法:在Info.plist中添加NSAppTransportSecurity类型Dictionary. 在NSAppTransportSecurity下添加NSAllowsArbitraryLo ...

  3. 从Wep page到Application

    需要做一个选择,是Web app还是Native app,当然,还有第三种,Hybrid app. 现在手机用户越来越多,电脑终端浏览器也在不断的更新换代,推陈出新,网页已经不仅仅是用来分享信息这么简 ...

  4. 【poj1010】 STAMPS

    http://poj.org/problem?id=1010 (题目链接) 感到了英语深深的恶意... 题意(真的很难懂....) 第一行数字是邮票的面值,每一个数字就是一个不同的种类,哪怕面值相同. ...

  5. php jquery ajax

    .php文件如下<?php header('Content-Type:text/html;charset=utf-8'); ?>    <script type="text ...

  6. Android 生成和Pull解析xml

    一.单个对象生成xml 生成以下xml,该怎么生成呢? <?xml version='1.0' encoding='UTF-8' standalone='yes' ?> <accou ...

  7. ecos之widget

    weekbuy:widget.php<?php $setting['author']='zhang'; $setting['name']='周末购'; $setting['version']=' ...

  8. android studio多渠道多包名多apk打包

    转自  利用 Android Studio 和 Gradle 打包多版本APK 搬砖的道路上,经常会有各种不同的需求,比如今天就碰到过一个打包版本的apk的要求, 比如一个apk给多个客户使用,如张三 ...

  9. Thymleaf中th&colon;each标签遍历list如何获取index

    简单介绍:传递给后台一个String类型的list,需要获取到list的每一个元素,然后进行筛选,得到正确的文本值,看代码就明白了 代码: //后台java代码//failList是一个String类 ...

  10. JS自学笔记05

    JS自学笔记05 1.例题 产生随机的16进制颜色 function getColor(){ var str="#"; var arr=["0","1 ...