初识Docker

目录

容器

什么是容器

容器原理

容器发展史

Docker

什么是Docker

Docker和虚拟化

Docker三大核心概念

安装Docker

安装最新版Docker

使用yum仓库安装Docker

使用curl安装Docker

启动Docker并设置为开机自启动

查看Docker版本

Docker镜像操作

搜索镜像

获取镜像

查看镜像信息

删除镜像

存出镜像和载入镜像

上传镜像

Docker容器操作

容器的创建与启动

容器的运行与终止

容器的进入

容器的导出与导入

容器的删除

Docker的数据管理

数据卷

创建数据卷

挂载主机目录作为数据卷

数据卷容器


容器

什么是容器

        容器是一种沙盒技术,主要目的是为了将应用运行在其中,与外界隔离;及方便这个沙盒可以被转移到其它宿主机器。本质上,它是一个特殊的进程。通过名称空间(Namespace)、控制组(Control groups)、切根(chroot)技术把资源、文件、设备、状态和配置划分到一个独立的空间。

通俗点的理解就是一个装应用软件的箱子,箱子里面有软件运行所需的依赖库和配置。开发人员可以把这个箱子搬到任何机器上,且不影响里面软件的运行。

容器原理

为了实现容器进程对外界的隔离,容器底层主要运用了名称空间(Namespaces)、控制组(Control groups)和切根(chroot)。

名称空间(Namespace)

每个运行的容器都有自己的名称空间。这是Linux操作系统默认提供的API,包括:

·PID Namespace:不同容器就是通过pid名字空间隔离开的,不同名字空间中可以有相同的pid。

·Mount Namespace:mount允许不同名称空间的进程看到的文件结构不同,因此不同名称空间中的进程所看到的文件目录就被隔离了。另外,每个名称空间中的容器在/proc/mounts的信息只包含当前名称的挂载点。

·IPC Namespace:容器中进程交互还是采用Linux常见的进程交互方法(interprocess communication -IPC),包括信号量、消息队列和共享内存等。

·Network Namespace:网络隔离是通过Net实现,每个Net有独立的网络设备,IP地址,路由表,/proc/net目录。这样每个容器的网络就能隔离开来。

·UTS Namespace:UTS(UNIX Time-sharing System)允许每个容器拥有独立的hostname和domain name,使其在网络上可以被视作一个独立的节点而非主机上的一个进程。

·User Namespace:每个容器可以有不同的用户和组id,也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户。

控制组(Control groups):

Cgroups是Linux内核提供的一种可以限制、记录、隔离进程组的物理资源机制。因为Namespace技术只能改变进程的视觉范围,不能真实地对资源做出限制。所以就必须采用Cgroup技术对容器进行资源限制,防止某个容器把宿主机资源全部用完导致其它容器也宕掉。在Linux的/sys/fs/cgroup目录中,有cpu、memory、devices、net_cls等子目录,可以根据需要修改相应的配置文件来设置某个进程ID对物理资源的最大使用率。

切根(change to root):

切根的意思就是改变一个程序运行时参考的根目录位置,让不同容器在不同的虚拟根目录下工作,从而相互不直接影响。

容器发展史

1979 年,Unix v7 系统支持 chroot,为应用构建一个独立的虚拟文件系统视图。
1999 年,FreeBSD 4.0 支持 jail,第一个商用化的 OS 虚拟化技术。
2004 年,Solaris 10 支持 Solaris Zone,第二个商用化的 OS 虚拟化技术。
2005 年,OpenVZ 发布,非常重要的 Linux OS 虚拟化技术先行者。
2004 年 ~ 2007 年,Google 内部大规模使用 Cgroups 等的 OS 虚拟化技术。
2006 年,Google 开源内部使用的 process container 技术,后续更名为 cgroup。
2008 年,Cgroups 进入了 Linux 内核主线。
2008 年,LXC(Linux Container)项目具备了 Linux 容器的雏型。
2011 年,CloudFoundry 开发 Warden 系统,一个完整的容器管理系统雏型。
2013 年,Google 通过 Let Me Contain That For You (LMCTFY) 开源内部容器系统。
2013 年,Docker 项目正式发布,让 Linux 容器技术逐步席卷天下。
2014 年,Kubernetes 项目正式发布,容器技术开始和编排系统起头并进。
2015 年,由 Google,Redhat、Microsoft 及一些大型云厂商共同创立了 CNCF,云原生浪潮启动。
2016 年 - 2017 年,容器生态开始模块化、规范化。CNCF 接受 Containerd、rkt项目,OCI 发布 1.0,CRI/CNI 得到广泛支持。
2017 年 - 2018 年,容器服务商业化。AWS ECS,Google EKS,Alibaba ACK/ASK/ECI,华为 CCI,Oracle Container Engine for Kubernetes;VMware,Redhat 和 Rancher 开始提供基于 Kubernetes 的商业服务产品。
2017 年 - 2019 年,容器引擎技术飞速发展,新技术不断涌现。2017 年底 Kata Containers 社区成立,2018 年 5 月 Google 开源 gVisor 代码,2018 年 11 月 AWS 开源 firecracker,阿里云发布安全沙箱 1.0。
2020 年 - 202x 年,容器引擎技术升级,Kata Containers 开始 2.0 架构,阿里云发布沙箱容器 2.0....

Docker

什么是Docker

Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。

Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。

Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。

在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

Docker和虚拟化

因为现在物理服务器是很强大的,我们如果在一台物理服务器上只跑一个服务就浪费了,而同时跑很多服务它们又互相影响,比如说一个服务处了内存泄露把整个服务器的内存都占满了,其它服务都跟着倒霉.所以要把每个服务都隔离起来,让 它们只使用自己那部分有限的CPU,内存和磁盘,以及自己依赖的软件包.这个早先是用虚拟机来实现隔离的,但是每个虚 拟机都要安装自己的操作系统核心,这样对资源有点浪费.于是就有了Docker,一个机器上可以安装十几个得到几十个基于docker的容器,它们共享操作系统核心,占用资源少,启动速度快.但又提供了资源的隔离。

特性Docker容器虚拟机
启动速度秒级分钟级
计算能力损耗几乎无损耗50%左右
性能接近原生弱于
系统支持量(单机)上千个几十个
隔离性资源限制完全隔离

Docker三大核心概念

镜像、容器、仓库是 Docker 的三大核心概念

镜像:

Docker 的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。例如:一个镜像可以是一个完整的 Cent OS 操作系统环境,称为一个 CentOS 镜像;也可以是一个安装了 MySQL 的应用程序,称之为一个 MySQL 镜像等等。

Docker 提供了简单的机制来创建和更新现有的镜像,用户也可以从网上下载已经创建好的镜像直接使用。

容器:

Docker 的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器 都是相互隔离、互不可见,以保证安全性的平台。可以将容器看作是一个简易版的 Linux 环境, Docker 利用容器来运行和隔离应用。

仓库:

Docker 仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用 push 命令将它 上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像 时,只需从仓库获取。

仓库注册服务器(Registry)是存放仓库的地方,其中包含了多个仓库。每个仓库集中存放某 一类镜像,并且使用不同的标签(tag)来区分它们。目前最大的公共仓库是 docker Hub,存放了 数量庞大的镜像供用户下载使用。

安装Docker

安装最新版Docker

Docker 支持在主流的操作系统平台上进行使用,包括 Windows 系统、Linux 系统、以及 Mac OS 系统等。目前最新的 RHEL、CentOS 以及 Ubuntu 系统官方软件源中都已经默认自带了Docker 包,可直接安装使用,也可以用 Docker 自己的 YUM 源进行配置。

CentOS 系统下安装 Docker 可以有两种方式:一种是使用 CURL 获得 Docker 的安装脚本进行安装,另一种是使用 YUM 仓库来安装 Docker

使用yum仓库安装Docker

yum install -y yum-utils device-mapper-persistent-data lvm2 

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

yum -y install docker-ce docker-ce-cli containerd.io

使用curl安装Docker

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

启动Docker并设置为开机自启动

# 启动服务
systemctl start docker
systemctl enable docker

查看Docker版本

        安装好的 Docker 系统有两个程序,Docker 服务端和 Docker 客户端。其中 Docker 服务端是一个服务进程,负责管理所有容器。Docker 客户端则扮演着 Docker 服务端的远程控制器,可以用来控制 Docker 的服务端进程。大部分情况下 Docker 服务端和客户端运行在一台机器上。

[root@localhost ~]# docker version
Client: Docker Engine - Community
 Version:           24.0.7
 API version:       1.39 (downgraded from 1.43)
 Go version:        go1.20.10
 Git commit:        afdd53b
 Built:             Thu Oct 26 09:11:35 2023
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          18.09.9
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.11.13
  Git commit:       039a7df
  Built:            Wed Sep  4 16:22:32 2019
  OS/Arch:          linux/amd64
  Experimental:     false

Docker镜像操作

        运行 Docker 容器前需要本地存在对应的镜像。如果不存在本地镜像,Docker 就会尝试从默认镜像仓库下载。镜像仓库是由 Docker 官方维护的一个公共仓库,可以满足用户的绝大部分需求。用户也可以通过配置来使用自定义的镜像仓库。

        下面具体介绍如何操作 Docker 镜像。

搜索镜像

在使用下载镜像前,可以使用 docker search 命令搜索远端官方仓库中的共享镜像。

命令格式:

docker search 关键字

# 搜索nginx镜像
[root@localhost ~]# docker search nginx 

        执行 docker search nginx 命令后,返回很多包含 lamp 关键字的镜像,其中返回信息包括镜像名称(NAME)、描述(DESCRIPTION)、星级(STARS)、是否官方创建(OFFICIAL)、是否主动创建(AUTOMATED)。默认的输出结果会按照星级评价进行排序,表示该镜像受欢迎程度。在下载镜像时,可以参考星级。在搜索时,还可以使用-s 或者--stars=x 显示指定星级以上的镜像,星级越高表示越受欢迎;是否官方创建是指是否是由官方项目组创建和维护的镜像,一般官方

        项目组维护的镜像使用单个单词作为镜像名称,称为基础镜像或者根镜像。像 kasmweb/nginx 这种命名方式的镜像,表示是由 docker Hub 的用户 kasmweb 创建并维护的镜像,带有用户名为前缀;是否主动创建是指是否允许用户验证镜像的来源和内容。

        使用 docker search 命令只能查找镜像,镜像的标签无法查找,因此如果需要查找 Docker 标签,需要从网页上访问镜像仓库进行查找。

获取镜像

搜索到符合需求的镜像,可以使用 docker pull 命令从网络下载镜像到本地使用。

命令格式:

docker pull 仓库名称[:标签]

对于 Docker 镜像来说,如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜 像,即选择标签为 latest 标签,也可通过指定的标签来下载特定版本的某一镜像。这里标签 (tag)就是用来区分镜像版本的。

# 下载nginx镜像
[root@localhost ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
578acb154839: Pull complete 
e398db710407: Pull complete 
85c41ebe6d66: Pull complete 
7170a263b582: Pull complete 
8f28d06e2e2e: Pull complete 
6f837de2f887: Pull complete 
c1dfc7e1671e: Pull complete 
Digest: sha256:ad90e201fc869b27d2f3d2ff8b7c3f575021986d0998806766012d28096cd14f
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

        从整个下载的过程可以看出,镜像文件是由若干层(Layer)组成,称之为 AUFS(联合 文件系统),是实现增量保存与更新的基础,下载过程中会输出镜像的各层信息。镜像下载到 本地之后就可以随时使用该镜像了。 用户也可以选择从其他注册服务器仓库下载,这时需要在仓库名称前指定完整的仓库注 册服务器地址。

查看镜像信息

用户可以使用 docker images 命令查看下载到本地的所有镜像。

命令格式:

docker images 仓库名称:[标签]

例如:查看本地所有镜像的执行命令和结果如下:

[root@localhost ~]# docker images
REPOSITORY                                           TAG       IMAGE ID       CREATED         SIZE
nginx                                                latest    c20060033e06   2 weeks ago     187MB

从显示的情况可以读出以下信息: 
 REPOSITORY:镜像属于的仓库; 
 TAG:镜像的标签信息,标记同一个仓库中的不同镜像; 
 IMAGE ID:镜像的唯一 ID 号,唯一标识一个镜像; 
 CREATED:镜像创建时间; 
 VIRTUAL SIZE:镜像大小; 

用户还可以根据镜像的唯一标识 ID 号,获取镜像详细信息

命令格式:

docker inspect镜像ID号

例如:获取镜像 nginx 详细信息的执行命令和结果如下。

[root@localhost ~]# docker inspect c20060033e06
[
    {
        "Id": "sha256:c20060033e06f882b0fbe2db7d974d72e0887a3be5e554efdb0dcf8d53512647",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:ad90e201fc869b27d2f3d2ff8b7c3f575021986d0998806766012d28096cd14f"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2023-11-01T05:12:14.305489502Z",
        "Container": "22d7d657198f5b244b6263948a9fbb121dfeac76df31a9769da4586fb5115071",
        "ContainerConfig": {
            "Hostname": "22d7d657198f",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.25.3",
                "NJS_VERSION=0.8.2",
                "PKG_RELEASE=1~bookworm"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"nginx\" \"-g\" \"daemon off;\"]"
            ],
            "Image": "sha256:68099835596e7e1043c4c8bbbc1961c727080f9ebb5c0b2c54387c794eb0f621",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGQUIT"
        },
        "DockerVersion": "20.10.23",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.25.3",
                "NJS_VERSION=0.8.2",
                "PKG_RELEASE=1~bookworm"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "Image": "sha256:68099835596e7e1043c4c8bbbc1961c727080f9ebb5c0b2c54387c794eb0f621",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGQUIT"
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 186779301,
        "VirtualSize": 186779301,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/86d3eea688f7b88df80b9124b0a7671eefc07c429c81e7dae5fedb9b1f0e6527/diff:/var/lib/docker/overlay2/87b9c6b2c5649b6290ada4341fc4488453db3cade8cb0fc6ab8ce854a1fa1240/diff:/var/lib/docker/overlay2/c653f6b47cb7a8510a9882bc3c2ced301243ad8b09140da15d09f763f5904848/diff:/var/lib/docker/overlay2/87e5c935af32f604e183a73d6750d85e0bae5f145d823579297bbaad4aa3c440/diff:/var/lib/docker/overlay2/c087a64a49cefcdbc3f369cd6b09426556fbd318b1cecb9d839d20f855dfabdb/diff:/var/lib/docker/overlay2/257465aed9eba00002904361917cafa59e9fbdd7e887d807a5e4df5761e1fe7d/diff",
                "MergedDir": "/var/lib/docker/overlay2/83bb66ccbc571a061303483b7c4d3f2ac0140ce34659da75cfeea8551784c7a1/merged",
                "UpperDir": "/var/lib/docker/overlay2/83bb66ccbc571a061303483b7c4d3f2ac0140ce34659da75cfeea8551784c7a1/diff",
                "WorkDir": "/var/lib/docker/overlay2/83bb66ccbc571a061303483b7c4d3f2ac0140ce34659da75cfeea8551784c7a1/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:ec983b16636050e69677eb81537e955ab927757c23aaf73971ecf5f71fcc262a",
                "sha256:609f2a18d224cf695a954a6fe2785101828954829417021d1f7c3fa4d31e0753",
                "sha256:e503754c9a26543a728b7c3641e617c2a69ca599617ce783eeb81bc12a88df95",
                "sha256:715b32fa0f1206db2a1b8855eb8a5f90392d4c30e622fced07baf73b0711d31b",
                "sha256:768e28a222fdcbea7962af44913d7ccba7e9d03e1aa089e428103caa87d89eb8",
                "sha256:9920f1ebf52b217bf9e7a40a88cf4c609450692fc5b2b112347a1b05fbb8ae57",
                "sha256:505f49f13fbe9f5ff9e965e1ef1280f4fd776153cab92f152bd572926eed8830"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

为了在后续工作中使用镜像,可以用 docker tag 命令来为本地的镜像添加新的标签。

命令格式:

docker tag名称:[标签]新名称:[新标签]

例如:本地镜像 nginx 添加新的名称为 nginx_test,新的标签为 1.0。

[root@localhost ~]# docker tag nginx nginx_test:1.0

[root@localhost ~]# docker images
REPOSITORY                                           TAG       IMAGE ID       CREATED         SIZE
nginx                                                latest    c20060033e06   2 weeks ago     187MB
nginx_test                                           1.0       c20060033e06   2 weeks ago     187MB

删除镜像

可以使用 docker rmi 命令删除多余的镜像。删除镜像的操作有两种方法:使用镜像的标 签删除镜像;使用镜像的 ID 删除镜像。

命令格式:

docker rmi仓库名称:标签 或者 docker rmi镜像ID号

例如:要删除掉 nginx_test:1.0 镜像,可以使用如下命令

[root@localhost ~]# docker rmi nginx_test:1.0
Untagged: nginx_test:1.0

        当使用 docker rmi 命令后面指定了某个镜像 ID 时,必须确保该镜像当前没有被任一容器 使用才能进行。删除时系统会先删除掉所有指向该镜像的所有标签,然后删除该镜像文件本身。如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。

存出镜像和载入镜像

当需要把一台机器上的镜像迁移到另一台机器上的时候,需要将镜像保存成为本地文件,这一过程叫做存出镜像,可以使用 docker save 命令进行存出操作,之后就可以拷贝该文 件到其他机器。

命令格式:

docker save -o 存储文件名 存储的镜像

例如:将存出本地的 nginx

[root@localhost ~]# docker save -o nginx_latest.tar nginx:latest

将存出的镜像从机器 A 拷贝到机器 B 后,需要在机器 B 上使用该镜像,就可以将该文件 导入到机器 B 的镜像库中,这一过程叫做载入镜像。使用 docker load 或者 docker --input 进 行载入操作。

命令格式:

docker load < 存出的文件 或者 docker load -i 存出的文件

例如:从文件 lamp 中载入镜像到本地镜像库中。

# 两种方式任选一个
[root@localhost ~]# docker load < nginx_latest.tar 
Loaded image: nginx:latest

[root@localhost ~]# docker load -i nginx_latest.tar 
Loaded image: nginx:latest

上传镜像

        本地存储的镜像越来越多,就需要指定一个专门存放这些镜像的地方——仓库。目前比 较方便的就是公共仓库,默认上传到 docker Hub 官方仓库,需要注册使用公共仓库的账号, 第 19 页 共 45 页 可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。在上传镜像之前, 还需要先对本地镜像添加新的标签,然后再使用 docker push 命令

命令格式:

docker push 仓库名称:标签

例如: 在公共仓库上已经注册成功了一个账号, 这个账号叫做 daoke , 新增 nginx 镜像的标签为 daoke/nginx:centos7

[root@localhost ~]# docker tag nginx daoke/nginx:centos7 
[root@localhost ~]# docker login
Username: Docker 
Password: 
Email: xxx@xxx.com

# 成功登录后就可以上传镜像。
[root@localhost ~]# docker push daoke/nginx:centos7

Docker容器操作

        容器是 Docker 的另一个核心概念。简单说,容器是镜像的一个运行实例,是独立运行的一个 或一组应用以及它们所必需的运行环境,包括文件系统、系统类库、shell 环境等。镜像是只读模 板,而容器会给这个只读模板添加一个额外的可写层。

下面具体介绍 Docker容器的操作。

容器的创建与启动

        Docker 的创建就是将镜像加载到容器的过程。Docker 的容器十分轻量级,用户可以随时创建 或者删除。新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器,这个进程是该容器的唯一进程,所以当该进程结束时,容器也会完全停止。停止的容器可以重 新启动并保留原来的修改。可以使用 docker create命令新建一个容器。

命令格式:

docker create [选项]镜像 运行的程序

常用选项:

-i 让容器的输入保持打开

-t 让 Docker 分配一个伪终端

--name 指定容器名称,如果不加的话容器名称是随机生成的

例如:使用 docker create 命令创建新容器

[root@bogon ~]# docker create -it --name myname nginx:latest bash
3afeece730fe8fd63128f53c46e61c949b5db74b545e35511aaefe76e4a16856

        使用 docker create 命令创建新容器后会返回一个唯一的 ID。 可以使用 docker ps 命令查看所有容器的运行状态。添加-a 选项可以显示所有的容器,包括未 运行的。

[root@bogon ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED              STATUS    PORTS     NAMES
3afeece730fe   nginx:latest   "/docker-entrypoint.…"   About a minute ago   Created             myname

        docker ps -a 命令的输出信息显示了容器的 ID 号、加载的镜像、运行的程序、创建时间、目前 所处的状态、端口映射。其中状态一栏为空表示当前的容器处于停止状态。 启动停止状态的容器可以使用 docker start 命令。

命令格式:

docker start 容器的 ID/名称

例如:使用 docker start 命令启动新创建的容器。

[root@bogon ~]# docker start myname
myname
[root@bogon ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS          PORTS     NAMES
3afeece730fe   nginx:latest   "/docker-entrypoint.…"   2 minutes ago   Up 18 seconds   80/tcp    myname

        启动容器后,可以看到容器状态一栏已经变为 UP,表示容器已经处于启动状态。如果用户想 创建并启动容器, 可以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令。

        注意:容器是一个与其中运行的 shell 命令共存亡的终端,命令运行容器运行, 命令结束容器 退出。

当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是:

(1) 检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;

(2) 利用镜像创建并启动一个容器;

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

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

(5) 分配一个地址池中的 IP 地址给容器;

(6) 执行用户指定的应用程序,执行完毕后容器被终止运行。

例如:创建容器并启动执行一条 shell 命令:

[root@bogon ~]# docker run centos:7.6.1810 bash -c ls /
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@bogon ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND          CREATED         STATUS                     PORTS     NAMES
0f41042bdab3   centos:7.6.1810   "bash -c ls /"   6 seconds ago   Exited (0) 5 seconds ago             focused_engelbart

        查看容器的运行状态, 可以看出容器在执行“/usr/bin/bash -c ls” 命令之后就停止了。 有时候需要在后台持续的运行这个容器, 就需要让 Docker 容器以守护形式在后台运行。可以 在 docker run 命令之后添加-d 选项来实现。但是需要注意容器所运行的程序不能结束,容器执行的命令一旦结束那么容器也就退出了。

        例如,下面的容器会持续在后台进行运行:

# 该命令会让容器运行30秒
[root@bogon ~]# docker run -itd centos:7.6.1810 bash -c "sleep 30"
3f3cbd955cb8457aaf19bd0751fd10d69ef43edc6085f8f8333dbabe2ac98922
[root@bogon ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                CREATED         STATUS         PORTS     NAMES
3f3cbd955cb8   centos:7.6.1810   "bash -c 'sleep 30'"   3 seconds ago   Up 2 seconds             modest_moser
[root@bogon ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                CREATED          STATUS                     PORTS     NAMES
3f3cbd955cb8   centos:7.6.1810   "bash -c 'sleep 30'"   35 seconds ago   Exited (0) 3 seconds ago             modest_moser
# 该命令会让容器一直运行
[root@bogon ~]# docker run -itd centos:7.6.1810 bash -c "while true;do echo hello;done"
780c27466f70694ec441e3be530b45f3937f54c090c6a4c001c952366e70862d
[root@bogon ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                   CREATED         STATUS         PORTS     NAMES
780c27466f70   centos:7.6.1810   "bash -c 'while true…"   7 seconds ago   Up 6 seconds             kind_goldwasser

创建容器的时候可以根据需求添加一些选项,常用选项有:

--rm 容器退出时自动删除容器

--name 指定容器的名字

-p 8080:80 将宿主机的8080端口映射到容器的80端口

-P 随机映射端口号

[root@bogon ~]# docker run -d --rm --name mynginx -P nginx:latest 
f293551a13e099b8e64458f1f723670a1ab8e0adf439c39fea36ba7ad78a5258
[root@bogon ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                                     NAMES
f293551a13e0   nginx:latest   "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   0.0.0.0:32769->80/tcp, :::32769->80/tcp   mynginx
[root@bogon ~]# docker run -d --rm --name mynginx -p 8080:80 nginx:latest 
4b0d5ac1a5897e408c75eefbdb0d44d9b1078c9a5253e81aaace7055e31bdd46
[root@bogon ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                                   NAMES
4b0d5ac1a589   nginx:latest   "/docker-entrypoint.…"   3 seconds ago   Up 2 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   mynginx

容器的运行与终止

如果需要终止运行的容器,可以使用 docker stop 命令完成。

命令格式:

docker stop 容器的 ID/名称

停止运行的容器,例如停止容器 mynginx

[root@bogon ~]# docker stop mynginx
mynginx
[root@bogon ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED              STATUS                     PORTS     NAMES
d4897a2386e2   nginx:latest   "/docker-entrypoint.…"   About a minute ago   Exited (0) 2 seconds ago             mynginx

容器的进入

需要进入容器进行相应操作时,可以使用 docker exec 命令进入运行着的容器。

命令格式:

docker exec -it 容器 ID/名称 /bin/bash

其中:

-i 选项表示让容器的输入保持打开;

-t 选项表示让 Docker 分配一个伪终端

[root@bogon ~]# docker exec -it mynginx /bin/bash
root@d4897a2386e2:/#

# 执行exit可以退出容器
root@d4897a2386e2:/# exit
exit
[root@bogon ~]#

容器的导出与导入

用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中, 可以使用 docker export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均 可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。

命令格式:

docker export 容器 ID/名称 >文件名

例如:导出 mynginx 容器到文件 mynginx.tar

[root@bogon ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS         PORTS     NAMES
d4897a2386e2   nginx:latest   "/docker-entrypoint.…"   10 minutes ago   Up 3 minutes   80/tcp    mynginx
[root@bogon ~]# docker export mynginx > mynginx.tar
[root@bogon ~]# ls -lh mynginx.tar 
-rw-r--r-- 1 root root 181M 11月 22 12:21 mynginx.tar

使用 docker import 命令导入, 成为镜像。

命令格式:

cat 文件名| docker import – 生成的镜像名称:标签

    例如:导入文件myname.tar成为本地镜像:

[root@bogon ~]# cat mynginx.tar | docker import - mynginx:1.0
sha256:19923078e812f8d2b76be7adff52e8536ebf0ac215e18665d05cb91ccd89374b
[root@bogon ~]# docker images mynginx
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
mynginx      1.0       19923078e812   11 seconds ago   185MB

容器的删除

可以使用 docker rm 命令将一个已经终止状态的容器进行删除。

命令格式:

docker rm 容器 ID/名称

例如:删除 mynginx容器

# 删除容器的时候要先停止在删除
[root@bogon ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS         PORTS     NAMES
d4897a2386e2   nginx:latest   "/docker-entrypoint.…"   16 minutes ago   Up 9 minutes   80/tcp    mynginx
[root@bogon ~]# docker stop mynginx
mynginx
[root@bogon ~]# docker rm mynginx
mynginx
[root@bogon ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

Docker的数据管理

        在 Docker 中,为了方便查看容器内产生的数据或者共享多个容器之间的数据,就涉及到容器 的数据管理操作。 管理 Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(Data Volumes Containers)

数据卷

        数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上, 对 数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于 Linux 下对目录进行的 mount 操作

创建数据卷

        在 docker run 命令中使用-v 选项可以在容器内创建数据卷。多次使用-v 选项可创建多个数据 卷。使用--name 选项可以给容器创建一个友好的自定义名称。 例如:使用 nginx:latest 镜像创建一个名为 web 的容器,并且创建两个数据卷分别挂载到 /data1 与/data2 目录上。

[root@bogon ~]# docker run -d -v /data1 -v /data2 --name web nginx:latest
45e6b12cbdb49af13fd4a143ac57282e62155a6a07344d0788bce0f2b612c433
# 进入容器可以看到两个数据卷已经创建成功,并挂载到/data1和/data2目录上
[root@bogon ~]# docker exec -it web bash
root@45e6b12cbdb4:/# ls -l
total 4
lrwxrwxrwx   1 root root    7 Nov 20 00:00 bin -> usr/bin
drwxr-xr-x   2 root root    6 Sep 29 20:04 boot
drwxr-xr-x   2 root root    6 Nov 22 05:05 data1
drwxr-xr-x   2 root root    6 Nov 22 05:05 data2
drwxr-xr-x   5 root root  340 Nov 22 05:05 dev
drwxr-xr-x   1 root root   41 Nov 21 09:05 docker-entrypoint.d
-rwxrwxr-x   1 root root 1620 Nov 21 09:05 docker-entrypoint.sh
drwxr-xr-x   1 root root   19 Nov 22 05:05 etc
drwxr-xr-x   2 root root    6 Sep 29 20:04 home
lrwxrwxrwx   1 root root    7 Nov 20 00:00 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov 20 00:00 lib32 -> usr/lib32
lrwxrwxrwx   1 root root    9 Nov 20 00:00 lib64 -> usr/lib64
lrwxrwxrwx   1 root root   10 Nov 20 00:00 libx32 -> usr/libx32
drwxr-xr-x   2 root root    6 Nov 20 00:00 media
drwxr-xr-x   2 root root    6 Nov 20 00:00 mnt
drwxr-xr-x   2 root root    6 Nov 20 00:00 opt
dr-xr-xr-x 123 root root    0 Nov 22 05:05 proc
drwx------   2 root root   37 Nov 20 00:00 root
drwxr-xr-x   1 root root   23 Nov 22 05:05 run
lrwxrwxrwx   1 root root    8 Nov 20 00:00 sbin -> usr/sbin
drwxr-xr-x   2 root root    6 Nov 20 00:00 srv
dr-xr-xr-x  13 root root    0 Nov 22 05:05 sys
drwxrwxrwt   1 root root    6 Nov 21 09:05 tmp
drwxr-xr-x   1 root root   66 Nov 20 00:00 usr
drwxr-xr-x   1 root root   19 Nov 20 00:00 var

挂载主机目录作为数据卷

        使用 docker run 命令的-v 选项可以在创建数据卷的同时,将宿主机的目录挂载到数据卷上使 用,以实现宿主机与容器之间的数据迁移。 注意:宿主机本地目录的路径必须是使用绝对路径。如果路径不存在,Docker 会自动创建相 应的路径。 例如:使用 nginx:latest 镜像创建一个名为 web-1 的容器,并且将宿主机的/var/www 目录挂 载到容器的/data1 目录上

[root@bogon ~]# docker run -d -v /var/www/:/data1 --name web-1 nginx:latest
1cfacce2ac0e8d14546ee6825993a18317f09f5a528d20d6d689ba68c94d16a6
[root@bogon ~]# touch /var/www/test.html
[root@bogon ~]# docker exec -it web-1 bash
root@1cfacce2ac0e:/# ls /data1/
test.html

数据卷容器

        如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器是一个普 通的容器,专门提供数据卷给其他容器挂载使用。使用方法如下:首先,需创建一个容器作为数据 卷容器,之后在其他容器创建时用--volumes-from 挂载数据卷容器中的数据卷使用。 例如:使用前面预先创建好的数据卷容器 web,其中所创建的数据卷分别挂载到了/data1 与 /data2 目录上,使用--volumes-from 来挂载 web 容器中的数据卷到新的容器,新的容器名为 db1。

# 在 db1 容器数据卷/data1 目录中创建一个文件 file。在 web 容器中的/data1 目录中, 可以查看到它
[root@bogon ~]# docker run -it --volumes-from web --name db1 nginx:latest bash
root@731b5d028514:/# touch /data1/hello.txt
root@731b5d028514:/# exit
exit
[root@bogon ~]# docker exec -it web bash
root@45e6b12cbdb4:/# ls /data1/
hello.txt

  • 13
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
Docker+k8s的微服务实战课程 课程目录 一、初识微服务 1 微服务-导学 2 软件架构的进化 3 什么是微服务 4 画出微服务架构图 5 微服务架构的优势和不足 二、微服务带来的问题及解决方案分析 1 微服务架构带来的问题 2 微服务间如何通讯 3 服务发现、部署更新和扩容 4 springboot&springcloud(上) 5 springboot&springcloud(下) 三、微服务开发 1 微服务业务分析 2 Thirft安装和验证 3 Python开发信息服务 4 开发用户服务(上) 5 开发用户服务(下) 6 开发用户EdgeService_A 7 开发用户EdgeService_B 8 开发用户EdgeService_C 9 开发用户EdgeService_D 10 dubbo入门操练(上) 11 dubbo入门操练(下) 12 开发课程服务 13 开发课程EdgeService 14 APIGatewayZuul 四、服务编排前奏 1 服务docker化(上) 2 服务docker化(下) 3 docker下的服务通讯(上) 4 docker下的服务通讯(下) 5 镜像仓库 6 三大平台扬帆起航 五、服务编排-Mesos 1 了解Mesos 2 画出Mesos集群架构图 3 集群环境搭建_A 4 集群环境搭建_B 5 集群环境搭建_C 6 调整微服务适应Mesos 7 微服务部署_A 8 微服务部署_B 9 微服务部署_C 六、服务编排-DockerSwarm 1 了解Swarm 2 集群环境搭建(上) 3 集群环境搭建(下) 4 调整微服务及服务置 5 微服务部署 七、服务编排-Kubernetes 1 了解kubernetes(上) 2 了解kubernetes(下) 3 环境搭建前奏 4 预先准备环境 5 基础集群部署(上) 6 基础集群部署(下) 7 小试牛刀 8 kube-proxy和kube-dns 9 理解认证、授权 10 为集群添加认证授权(上) 11 为集群添加认证授权(下) 12 再试牛刀 13 部署我们的微服务 八、CICD和DevOps 1 了解CICD和DevOps 2 准备GitLab和Jenkins 3 CICD实践(上) 4 CICD实践(下) 九、课程总结

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值