`

docker的基本用法

阅读更多
vmware下的RHEL/CentOS的网络配置请参考:http://jisonami.iteye.com/blog/2306735

RHEL/CentOS在7系列才完全的原生支持docker,以前全部例子均使用CentOS7演示,并且所有操作在root权限下进行。
本文介绍docker最常用的基本用法,包括
一、docker简介与安装
二、docker镜像与容器

一、docker简介与安装

1、docker简介
docker是轻量级的容器技术,直接使用操作系统的资源而不是是虚拟机的方式。
docker是操作系统级别的虚拟化技术,它模拟了操作系统的运行环境。而虚拟机则是虚拟了一个操作系统。前者占用的资源比后者少,所以效率很高。
docker容器的启动比虚拟机快很多,一般以秒来计算的。

2、docker安装
yum install docker

二、docker镜像与容器
docker的三个关键词:仓库、镜像、容器
这三者的关系是这样的,仓库存放着很多镜像,每个镜像可以运行很多个容器
官方仓库是http://index.docker.io

1、操作docker镜像的相关命令及用法演示
1)从仓库查找镜像
命令:docker search 镜像名
以查找redis为例
docker search docker.io/redis

2)从仓库下载镜像到本地
命令:docker pull 镜像名
带标签名,以下载redis镜像为例,
docker pull redis:2.8.21
若不带标签名,则默认下载最新(latest)版本
docker pull redis

3)查看镜像列表
命令:docker images

4)删除镜像
命令:docker rmi 镜像id
已删除redis镜像为例
先查看镜像列表,找到要删除的镜像id
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/redis     2.8.21              1a721decd792        10 months ago       109 MB
删除IMAGE ID为1a721decd792的redis镜像
docker rmi 1a721decd792

5)删除所有镜像
docker rmi $(docker images -q)

6)镜像的导出导入
导出命令:docker save -o tar包名字 镜像仓库:镜像标签
示例:
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/redis     2.8.21              1a721decd792        10 months ago       109 MB
[root@localhost ~]# docker save -o redis2.8.21.tar docker.io/redis:2.8.21
[root@localhost ~]# ls
anaconda-ks.cfg  redis2.8.21.tar

导入命令:docker load < tar包名字
示例:先删除原有的镜像再导入,删除镜像前需要先删除基于该镜像的而所有容器
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
985b07080de0        1a721decd792        "/entrypoint.sh redis"   52 minutes ago      Exited (0) 26 minutes ago                       tiny_mccarthy
[root@localhost ~]# docker rm 985b07080de0
985b07080de0
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/redis     2.8.21              1a721decd792        10 months ago       109 MB
[root@localhost ~]# docker rmi 1a721decd792
Untagged: docker.io/redis:2.8.21
Deleted: 1a721decd792ad1d3c4ebc315d34b1f8d4dfb97e6d8013efe6c523e637361bd6
Deleted: 1e0f123a26af5e26e27b7bcef888957657e21992f94beeb7f15b311731a94522
Deleted: 917499e60e0beb9aef579ab3bda18852c3dae3068608464a442fd1004929f350
Deleted: bdd393eaafef5acb1fa55708831d05d4203619bb46a84cf687fe9d85ce01d4e7
Deleted: 3d78ebcf73261a592159a96275f31eb08165ed128d7a775d97725d8d11e7e1ef
Deleted: 2da1436f270c273773122e93f8668672b8b7923af8d68374de4cfa5feeaeccd3
Deleted: fb03d161db1463c2208715b1df9af461a00cb2b74b64478ec131f727c5204629
Deleted: 87b88b774507ab4e2ee76c90b00f6fd9a0c8e7457c265e8256fcb6ac4fef8e28
Deleted: 6846105605cc29e8e7a65244961d5f82343ec2fb2ac824372ec23c198318a3b4
Deleted: d60d207d76b30a03d1da1100a2ed24f8a798104c73be5058ddb30abc6145be48
Deleted: b2508f29bec6010c47e4ca1ebd899252baa8e0645421017728897322368bbb34
Deleted: 7bf6d72c51dd7602557d3f7c1474f659d56819444a49a7f924df8e014cd756c3
Deleted: 2658b5be63c6886e82374815fd97e0593976fda3c749f531c88d2ec968d40709
Deleted: 047a294381b2ec81cbfb1d5710b65d641548b99d5e35dab761179ccddc36bacd
Deleted: 9bce9474876b400ca739a85e246c2677ebacc8440558fab04c764a76c7a52d78
Deleted: bbe78c1a5a535fac669e3225d5c3bb4396b6b2f9decb560ffb6351396da8c345
Deleted: 9d3ceacde91b4c7d6c1275032adb558d668afd5489c007f3512b39793ddf992d
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
[root@localhost ~]# docker load < redis2.8.21.tar
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/redis     2.8.21              1a721decd792        10 months ago       109 MB

注意:
使用镜像id代替“镜像仓库:镜像标签”导出镜像也是可以的,但是会丢失元数据(即仓库信息和标签名等)
重新导入后看到的信息如下
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>              <none>              1a721decd792        10 months ago       109 MB

可以看到导入的镜像居然没有元数据(即仓库信息和标签名等),这是因为导出的时候使用的是镜像id导致的
解决方式是导出镜像时使用“镜像仓库:镜像标签”而不是镜像id

2、操作docker容器的相关命令及用法演示
1)查看运行中的容器
docker ps
查看所有容器包括已关闭的容器
docker ps -a

2)从镜像中启动一个容器
命令:docker run 选项 镜像名 <命令>
镜像后的命令可省略

以启动redis容器为例
docker run -d -p 6379:6379 1a721decd792
启动redis容器后,我们可以使用redis-cli命令行客户端连接redis服务器
[root@localhost ~]# redis-cli
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>
参数解释:
-d 表示启动一个后台运行的容器
-p 表示指定容器端口号,指定的格式可以是
ip:主机端口:容器端口| ip::容器端口 | 主机端口:容器端口 | 容器端口
若没有指定主机端口,则随机生成

以启动bash并获得控制台标准输入为例
docker run -t -i 1a721decd792 /bin/bash
参数解释:
-t 让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
-i 让容器的标准输入保持打开

3、关闭运行中的容器
命令:docker stop 容器id
以关闭刚刚启动的redis容器为例
首先通过docker ps命令查找运行中的容器信息,根据查找的容器id关闭该容器
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
985b07080de0        1a721decd792        "/entrypoint.sh redis"   6 seconds ago       Up 4 seconds        0.0.0.0:6379->6379/tcp   tiny_mccarthy
[root@localhost ~]# docker stop 985b07080de0
985b07080de0

4、启动已关闭的容器
命令:docker start 容器id
以启动刚刚关闭的redis容器为例
首先通过docker ps -a命令查找所有的容器信息,根据查找的容器id关闭该容器
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
985b07080de0        1a721decd792        "/entrypoint.sh redis"   2 minutes ago       Exited (0) 2 minutes ago                       tiny_mccarthy
[root@localhost ~]# docker start 985b07080de0
985b07080de0

5、重启正在运行中的容器
命令:docker restart 容器id
首先通过docker ps命令查找运行中的容器信息,根据查找的容器id关闭该容器
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
985b07080de0        1a721decd792        "/entrypoint.sh redis"   6 seconds ago       Up 4 seconds        0.0.0.0:6379->6379/tcp   tiny_mccarthy
[root@localhost ~]# docker restart 985b07080de0
985b07080de0

6、进入运行中的后台docker容器
1)attach命令
docker attach 容器id
(以redis为例,若使用docker attach命令则直接连到redis-server那个输入流,不管开几个docker attach都只连接到该输入流,并且同步刷新所有窗口)
这里以启动bash并获得控制台标准输入为例,以为redis容器不直观
[root@localhost ~]# docker run -d -t -i 1a721decd792 /bin/bash
168a188ae07eb437d2ef33f22a30624c667c3eea2be5300ef51641df440c1610 #启动容器是返回的完整的容器id,这里使用docker ps查询的短容器id
Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
168a188ae07e        1a721decd792        "/entrypoint.sh /bin/"   22 seconds ago      Up 21 seconds       6379/tcp            clever_saha
[root@localhost ~]# docker attach 168a188ae07e
root@168a188ae07e:/data# pwd
/data

2)nsenter命令
安装util-linux包,nsenter命令在这个包里面,centos7仓库里的util-linux正好是连接docker容器所需的2.23版本
yum install util-linux
docker获取pid
docker inspect --format "{{ .State.Pid}}" 容器id
使用nsenter命令连接
nsenter --target 3212 --mount --uts --ipc --net --pid

完整的例子:(以redis为例,若使用docker attach命令则直接连到redis-server那个输入流,不管开几个docker attach都只连接到该输入流,并且同步刷新所有窗口)
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
985b07080de0        1a721decd792        "/entrypoint.sh redis"   20 minutes ago      Up 6 seconds        0.0.0.0:6379->6379/tcp   tiny_mccarthy
[root@localhost ~]# docker start 985b07080de0
985b07080de0
[root@localhost ~]# docker inspect --format "{{ .State.Pid}}" 985b07080de0
8660
[root@localhost ~]# nsenter --target 8660 --mount --uts --ipc --net --pid
root@985b07080de0:/# redis-cli
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>

7、删除已关闭的容器
命令:docker rm 容器id
这里以删除第一条记录为例
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
168a188ae07e        1a721decd792        "/entrypoint.sh /bin/"   4 minutes ago       Exited (130) 33 seconds ago                       clever_saha
985b07080de0        1a721decd792        "/entrypoint.sh redis"   16 minutes ago      Exited (0) 7 minutes ago                          tiny_mccarthy
[root@localhost ~]# docker rm 168a188ae07e
168a188ae07e

8、删除所有已关闭的容器
docker rm $(docker ps -a -q)

9、容器导出和导入
1)容器导出为tar包
命令:docker export 容器id > 导出tar包名字
示例:
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
985b07080de0        1a721decd792        "/entrypoint.sh redis"   27 minutes ago      Exited (0) 18 seconds ago                       tiny_mccarthy
[root@localhost ~]# docker export 985b07080de0 > redis.tar
[root@localhost ~]# ls
anaconda-ks.cfg  redis.tar

2)从tar包导入镜像
这里导入之后是镜像,而不是容器,并且需要重命名镜像元数据
命令:cat export导出的tar包 | docker import - 本地仓库名:标签名
示例:
[root@localhost ~]# cat redis.tar | docker import - testimport/redis:2.8.21
3d970cce18b58b71b5f83cb2778649a5b36c07de5cc824a758dcc2000668740b
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
testimport/redis    2.8.21              3d970cce18b5        6 seconds ago       107.3 MB
docker.io/redis     2.8.21              1a721decd792        10 months ago       109 MB

3)从导入的镜像启动容器
前面演示的时候启动redis容器是没有加命令的,导入的镜像启动容器时必须在末尾加上命令,否则会启动失败
即原先是这样的docker run -d -p 6379:6379 3d970cce18b5
现在必须这样docker run -d -p 6379:6379 3d970cce18b5 redis-server
示例:
[root@localhost ~]# docker run -d -p 6379:6379 3d970cce18b5 redis-server
7ad52d24fb8cad1d4bcb302355cbcd3e3d0ccb44ff6bdf5cb096271ecfc92419
Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
7ad52d24fb8c        3d970cce18b5        "redis-server"      3 seconds ago       Up 2 seconds        0.0.0.0:6379->6379/tcp   cranky_poincare

这里有一个坑
docker ps查看到的命令也许是错的,可能是因为显式的长度限制,比如
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
168a188ae07e        1a721decd792        "/entrypoint.sh /bin/"   4 minutes ago       Exited (130) 33 seconds ago                       clever_saha
985b07080de0        1a721decd792        "/entrypoint.sh redis"   16 minutes ago      Exited (0) 7 minutes ago                          tiny_mccarthy
启动时使用的是/bin/bash命令,这里显式的是"/entrypoint.sh /bin/",按道理应该是"/entrypoint.sh /bin/bash"
启动redis时没带命令,这里显式的是"/entrypoint.sh redis",按道理应该是"/entrypoint.sh redis-server"

请注意,save/load导出导入镜像和export/import导出容器快照导入镜像是不能混用的
redis2.8.21.tar 是save导出的镜像
redis.tar是export导出的容器快照
[root@localhost ~]# ls
anaconda-ks.cfg  redis2.8.21.tar  redis.tar
[root@localhost ~]# cat redis2.8.21.tar | docker import - docker.io/redis:2.8.21
Error response from daemon: EOF
[root@localhost ~]# docker load < redis.tar
Error response from daemon: open /var/lib/docker/tmp/docker-import-994843880/repo/bin/json: no such file or directory


0
0
分享到:
评论

相关推荐

    docker基本使用方法

    docker基本使用方法 docker基本使用方法 docker基本使用方法

    Docker 的基本配置和使用方法.rar

    附件是 Docker 的基本配置和使用方法: 这些是 Docker 的一些基本操作。Docker 的功能非常强大,还可以进行更高级的配置和使用,例如网络配置、数据卷管理、安全设置等。如果你需要更详细的帮助或有特定的使用场景,...

    详解如何使用Docker部署一个web项目并打包成镜像文件

    docker基本入门以后,可以试试打包docker镜像与dockerfile了 docker镜像 docker hub仓库有2类仓库,用户仓库和顶层仓库,用户仓库由docker用户创建的,顶层仓库由docker内部的人来管理的。仓库里存放的是镜像文件,...

    docker配置使用说明

    Docker配置与使用指南 目录: 1. 简介 2. 安装Docker 3. 基本命令 4. 镜像管理 5. 容器管理 6. 数据卷管理 7. 网络管理 8. Dockerfile编写 9. 示例代码 10. 简介 Docker是一个开源的应用容器引擎,可以让开发者将...

    Docker入门与应用实战 完整版PDF

    其次,文章详细介绍Docker的安装和基本使用方法,包括镜像、容器和仓库等概念的解释和操作实践。最后,文章列举了一些Docker的应用实例,包括基于Docker的Web应用部署、CI/CD自动化流程和微服务架构等。通过本文的...

    Docker学习文档,全面介绍Docker技术

    这份Docker学习文档是一份全面介绍Docker技术的文档,内容包括了Docker的基本概念、使用方法和常见问题解决方案,以及Docker在开发、部署和管理中的应用。 该文档首先介绍了Docker的基本概念和原理,包括容器、镜像...

    Docker Volume入门用法详解

    通过以上内容,我们可以看到Docker Volume的基本概念、特点、使用方法以及注意事项。掌握这些知识点对于使用Docker容器技术进行开发和部署是非常有帮助的。在实际使用中,Docker Volume提供了一种高效且方便的方法来...

    centos下使用docker部署.net core项目.docx

    CentOS 下使用 Docker 部署 .NET Core 项目 本文将详细介绍如何在 CentOS 系统中使用 Docker 部署 .NET Core 项目,涵盖 Docker ...通过本文,读者可以快速掌握 CentOS 系统中使用 Docker 部署 .NET Core 项目的方法。

    Docker入门教程+Docker实战项目

    从安装到部署 资源描述:这是一个适合初学者的Docker教程,介绍了Docker的基本概念、安装方法、常用命令、镜像管理、容器操作、网络配置、数据卷、Docker Compose等内容。通过本教程,你可以学习如何使用Docker来...

    Docker 容器与容器云(高清扫描版)

    本书根据Docker 1.10版和Kubernetes 1.2版对第1版进行了全面更新,从实践者的角度出发,以Docker和Kubernetes为重点,沿着“基本用法介绍”到“核心原理解读”到“高级实践技巧”的思路,一本书讲透当前主流的容器和...

    docker20安装包

    以上就是 Docker 20 的安装方法和 Kubernetes 的基本介绍。在实际操作中,可能需要根据具体环境和需求调整步骤。记得定期更新 Docker 和 k8s 到最新稳定版本,以保持最佳性能和安全性。对于更复杂的部署场景,可以...

    docker的配置和使用

    本文将详细介绍Docker的基本概念、配置及其使用方法。 ## 1. Docker的基本概念 ### 1.1 什么是Docker Docker是一个开源的容器化平台,允许开发者打包应用及其依赖到一个标准化的单元(即容器)中。容器可以在任何...

    docker-19.03.5.tar.gz

    这个文件的目的是为用户提供一个离线安装Docker的方法,特别是针对那些没有互联网连接或者网络不稳定的情况。 【描述】中提到,此离线安装包是为基于CentOS 7.6或更高版本的操作系统设计的。这意味着它兼容 CentOS ...

    Docker初级讲解.pptx

    此文档可以让大家具体知道Docker是什么 具体能干什么 Docker的基础命令 ,快速让出学习认识Docker并简单学习Docker的一些基本用法

    Docker配置与使用指南000.zip

    Docker配置与使用指南 目录: 1. 简介 2. 安装Docker 3. 基本命令 4. 镜像管理 5. 容器管理 6. 数据卷管理 7. 网络管理 8. Dockerfile编写 9. 示例代码 10. 简介 Docker是一个开源的应用容器引擎,可以让开发者将...

    Docker配置与使用指南000.md

    Docker配置与使用指南 目录: 1. 简介 2. 安装Docker 3. 基本命令 4. 镜像管理 5. 容器管理 6. 数据卷管理 7. 网络管理 8. Dockerfile编写 9. 示例代码 10. 简介 Docker是一个开源的应用容器引擎,可以让开发者将...

    Docker_容器与容器云第2版.compressed.pdf

    本书根据Docker 1.10版和Kubernetes 1.2版对第1版进行了全面更新,从实践者的角度出发,以Docker和Kubernetes为重点,沿着“基本用法介绍”到“核心原理解读”到“高级实践技巧”的思路,一本书讲透当前主流的容器和...

    elk的docker-compose配置

    一个基本的`docker-compose.yml`文件可能如下所示: ```yaml version: '3' services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.x.y container_name: elk_elasticsearch ...

Global site tag (gtag.js) - Google Analytics