Linux【8】-软件管理-5-应用容器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 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。

1.1 为什么用docker

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。

Docker 在如下几个方面具有较大的优势:

更快速的交付和部署

Docker在整个开发周期都可以完美的辅助你实现快速交付。Docker允许开发者在装有应用和服务本地容器做开发。可以直接集成到可持续开发流程中。

例如:开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

高效的部署和扩容

Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

Docker的兼容性和轻量特性可以很轻松的实现负载的动态管理。你可以快速扩容或方便的下线的你的应用和服务,这种速度趋近实时。

更高的资源利用率

Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。

更简单的管理

使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

1.2 Docker引擎

  • Server是一个常驻进程
  • REST API 实现了client和server间的交互协议
  • CLI 实现容器和镜像的管理,为用户提供统一的操作界面

1.3 Docker构架

Docker使用C/S架构,Client 通过接口与Server进程通信实现容器的构建,运行和发布。client和server可以运行在同一台集群,也可以通过跨主机实现远程通信。

1.4 核心概念

镜像(image)

Docker 镜像(Image)就是一个只读的模板。例如:一个镜像可以包含一个完整的操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

镜像(Image)就是一堆只读层(read-only layer)的统一视角,也许这个定义有些难以理解,看看下面这张图:

右边我们看到了多个只读层,它们重叠在一起。除了最下面一层,其它层都会有一个指针指向下一层。这些层是Docker内部的实现细节,并且能够在docker宿主机的文件系统上访问到。统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。

仓库(repository)

仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括 时速云 、网易云 等,可以提供大陆用户更稳定快速的访问。当然,用户也可以在本地网络内创建一个私有仓库。

当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。

容器(container)

Docker 利用容器(Container)来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

一个运行态容器被定义为一个可读写的统一文件系统加上隔离的进程空间和包含其中的进程。下面这张图片展示了一个运行中的容器。

正是文件系统隔离技术使得Docker成为了一个非常有潜力的虚拟化技术。一个容器中的进程可能会对文件进行修改、删除、创建,这些改变都将作用于可读写层。

二、安装

docker已安装,且用户名和用户组对应对的名字都是dockerroot-latest,将其修改为docker

非root用户使用docker

usermod -aG docker sam  # 将用户sam添加到docker这个组中,因为我这里的docker组名为docker 

三、常用命名

docker run –help

-d  后台运行
-v  绑定一个数据卷
-p(小写)  指定要映射的IP和端口,但是在一个指定端口上只可以绑定一个容器. 支持的格式有 hostPort:containerPort、ip:hostPort:containerPort、 ip::containerPort
-P(大写)   Docker会随机映射一个 49000~49900 的端口到内部容器开放的网络端口.

一个样例

docker run  -v /usr/ToolsAPIDir:/ToolsAPIDir1 -d -p 5005:5004 -it toolsapi:v8 python3 tools_api.py

-v 本地目录:容器目录,挂载主机的本地目录 /usr/ToolsAPIDir 目录到容器的/ToolsAPIDir1 目录,本地目录的路径必须是绝对路径
-d 后台运行容器
-p 5005:5004指定主机的5005端口映射到容器的5004端口
-it  toolsapi:v8 以交互模式运行 toolsapi:v8启动的容器

四、镜像相关的命令

4.1 查看镜像列表

docker images

列出了所有顶层(top-level)镜像。实际上,在这里我们没有办法区分一个镜像和一个只读层,所以我们 提出了top-level镜像。只有创建容器时使用的镜像或者是直接pull下来的镜像能被称为顶层(top-level) 镜像,并且每一个顶层镜像下面都隐藏了多个镜像层。

使用示例:

[sam@g02 ~]$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos        centos7             9f38484d220f        5 weeks ago         202 MB

在列出信息中,可以看到几个字段信息

  • 来自于哪个仓库,比如 ubuntu
  • 镜像的标记,比如 14.04
  • 它的 ID 号(唯一)
  • 创建时间
  • 镜像大小

用docker images 查看镜像列表

$ docker images
REPOSITORY                 TAG               IMAGE ID            CREATED             SIZE
hainiu/httpd               1.0               5f9aa91b0c9e        3 minutes ago       292.4 MB
centos                   centos6             6a77ab6655b9        8 weeks ago         194.6 MB
ubuntu                   latest              2fa927b5cdd3        9 weeks ago         122 MB

细心的朋友可以看到最后一层的ID(5f9aa91b0c9e)和 image id 是一样的

4.2 搜索镜像

docker search yum

INDEX       NAME                                           DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/sjoeboo/docker-yum-mirror            Make/Update yum repos!                          6                    [OK]
docker.io   docker.io/devopsil/puppet-yum                                                                  5                    [OK]

docker.io docker.io/dustise/yum.centos7 Yum repository for Cent OS 7 1 [OK]

然后就可以通过 docker pull docker.io/dustise/yum.centos7即可下载下来

4.3 获取镜像

docker pull

从仓库获取所需要的镜像。

使用示例:

docker pull centos:centos7

实际上相当于 docker pull registry.hub.docker.com/centos:centos7 命令,即从注册服务器 registry.hub.docker.com 中的 centos 仓库来下载标记为 centos7 的镜像。 有时候官方仓库注册服务器下载较慢,可以从其他仓库下载。 从其它仓库下载时需要指定完整的仓库注册服务器地址。

4.4 利用 Dockerfile 来创建镜像

docker build

使用 docker commit 来扩展一个镜像比较简单,但是不方便在一个团队中分享。我们可以使用 docker build 来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,包含一些如何创建镜像的 指令。新建一个目录和一个 Dockerfile。

mkdir hainiu
cd hainiu
touch Dockerfile

Dockerfile 中每一条指令都创建镜像的一层,例如:

FROM centos:centos6
MAINTAINER sandywei <sandy@hainiu.tech>
# move all configuration files into container

RUN yum install -y httpd
EXPOSE 80
CMD ["sh","-c","service httpd start;bash"]

Dockerfile 基本的语法是

  • 使用#来注释
  • FROM 指令告诉 Docker 使用哪个镜像作为基础
  • 接着是维护者的信息
  • RUN开头的指令会在创建中运行,比如安装一个软件包,在这里使用yum来安装了一些软件

更详细的语法说明请参考 Dockerfile

编写完成 Dockerfile 后可以使用 docker build 来生成镜像。

$ docker build -t hainiu/httpd:1.0 .

Sending build context to Docker daemon 2.048 kB
Step 1 : FROM centos:centos6
 ---> 6a77ab6655b9
Step 2 : MAINTAINER sandywei <sandy@hainiu.tech>
 ---> Running in 1b26493518a7
 ---> 8877ee5f7432
Removing intermediate container 1b26493518a7
Step 3 : RUN yum install -y httpd
 ---> Running in fe5b6f1ef888

 .....

 Step 5 : CMD sh -c service httpd start
 ---> Running in b2b94c1601c2
 ---> 5f9aa91b0c9e
Removing intermediate container b2b94c1601c2
Successfully built 5f9aa91b0c9e

其中 -t 标记来添加 tag,指定新的镜像的用户信息。 “.” 是 Dockerfile 所在的路径(当前目录), 也可以替换为一个具体的 Dockerfile 的路径。注意一个镜像不能超过 127 层。

4.5 上传镜像

docker push

用户可以通过 docker push 命令,把自己创建的镜像上传到仓库中来共享。例如,用户在 Docker Hub 上完成注册后,可以推送自己的镜像到仓库中。

运行实例:

$ docker push hainiu/httpd:1.0

4.6 删除镜像

docker rmi <image-id>

删除构成镜像的一个只读层。你只能够使用docker rmi来移除最顶层(top level layer) (也可以说是镜像),你也可以使用-f参数来强制删除中间的只读层。

例子:

$ docker images
REPOSITORY                                  TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos                            centos7             9f38484d220f        5 weeks ago         202 MB
docker.io/hello-world                       latest              fce289e99eb9        3 months ago        1.84 kB
docker.io/dustise/yum.centos7/yum.centos7   latest     

$ docker rmi docker.io/dustise/yum.centos7:latest
Untagged: docker.io/dustise/yum.centos7:latest

$ docker images
REPOSITORY                                  TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos                            centos7             9f38484d220f        5 weeks ago         202 MB
docker.io/hello-world                       latest              fce289e99eb9        3 months ago        1.84 kB

五、容器

5.1 创建容器

docker create <image-id>

docker create 命令为指定的镜像(image)添加了一个可读写层,构成了一个新的容器。注意,这个容器并没有运行。

docker create 命令提供了许多参数选项可以指定名字,硬件资源,网络配置等等。

运行示例:

创建一个centos的容器,可以使用仓库+标签的名字确定image,也可以使用image-id指定image。返回容器id

#查看本地images列表
$ docker images

#用仓库+标签
$ docker create -it --name centos7_container centos:centos7

#使用image-id
$ docker create -it --name centos6_container 6a77ab6655b9 bash
b3cd0b47fe3db0115037c5e9cf776914bd46944d1ac63c0b753a9df6944c7a67

可以使用 docker ps查看一件存在的容器列表,不加参数默认只显示当前运行的容器

$ docker ps -a

可以使用 -v 参数将本地目录挂载到容器中(注意,这里也是新建一个container)。

$ docker create -it --name centos7_container -v /src/webapp:/opt/webapp centos:centos7

这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它。

5.2 启动容器

docker start <container-id>

Docker start命令为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间。

运行实例:

#通过名字启动
$ docker start -i centos7_container

#通过容器ID启动
$ docker start -i bcd1d9454be0

进入容器

docker exec <container-id>

进入到容器里面:

docker exec -it 容器ID /bin/bash

在当前容器中执行新命令,如果增加 -it参数运行bash 就和登录到容器效果一样的。

docker exec -it centos6_container bash

停止容器#

docker stop <container-id>

删除容器#

docker rm <container-id>

运行容器

docker run <image-id>

docker run就是docker create和docker start两个命令的组合,支持参数也是一致的,如果指定容器 名字是,容器已经存在会报错,可以增加 –rm 参数实现容器退出时自动删除。

运行示例:

docker create -it --rm --name centos6_container centos:centos6

5.3 查看容器列表

docker ps

docker ps 命令会列出所有运行中的容器。这隐藏了非运行态容器的存在,如果想要找出这些容器,增加 -a 参数。

修改tag

docker tag 9a008xxxc3f alphafxxx:2.2.5

5.4 退出容器

如果在容器里面:

  • eixt(命令) ; 退出后,这个容器也就小时了,容器销毁ps查不到 。docer start 容器名/容器ID , 才能再次启动
  • ctrl +D (快捷方式) ; 同exit的命令
  • 先按 ctrl+ P, 接着ctrl +Q (快捷方式),退出容器后,ps能查到,还在后台运行, 再次启动容器, docer attach 容器名/容器ID

例子:

root@localhost ~]# docker ps #历史中没有运行的容器
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost ~]# docker ps -l #查看最近用过的容器
CONTAINER ID        IMAGE                               COMMAND             CREATED             STATUS                      PORTS               NAMES
957cebc14153        daocloud.io/library/ubuntu:latest   "/bin/bash"         3 hours ago         Exited (0) 40 seconds ago                       ubuntu01
[root@localhost ~]# docker start ubuntu01 #通过名称启动容器
ubuntu01
[root@localhost ~]# ^C
[root@localhost ~]# docker attach ubuntu01 #进入容器
^C
root@957cebc14153:/# ls#容器可以操作
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@localhost ~]# docker ps#查看那容器是否运行
CONTAINER ID        IMAGE                               COMMAND             CREATED             STATUS              PORTS               NAMES
957cebc14153        daocloud.io/library/ubuntu:latest   "/bin/bash"         3 hours ago         Up 21 seconds                           ubuntu01

在容器外边:

docker stop 容器名/id
docker start 容器名/id (已经停止的容器)

5.5 commit容器

docker commit <container-id>

docker commit container_id  image_name:1.2   将有更新的内容的container更新到新的image

将容器的可读写层转换为一个只读层,这样就把一个容器转换成了不可变的镜像。

5。6 镜像保存#

docker save <image-id>

创建一个镜像的压缩文件,这个文件能够在另外一个主机的Docker上使用。和export命令不同,这个命令 为每一个层都保存了它们的元数据。这个命令只能对镜像生效。

使用示例:

#保存centos镜像到centos_images.tar 文件

$ docker save  -o centos_images.tar centos:centos6

#或者直接重定向

$ docker save  -o centos_images.tar centos:centos6 > centos_images.tar

5.7 容器导出

docker export <container-id>

创建一个tar文件,并且移除了元数据和不必要的层,将多个层整合成了一个层,只保存了当前统一视角看到 的内容。expoxt后的容器再import到Docker中,只有一个容器当前状态的镜像;而save后的镜像则不同, 它能够看到这个镜像的历史镜像。

inspect
docker inspect <container-id> or <image-id>
docker inspect命令会提取出容器或者镜像最顶层的元数据

5.8 docker-修改容器挂载目录的3种

使用 docker run 命令,可以运行一个 Docker容器,使用镜像ubuntu/nginx,挂载本地目录/tmp/source到容器目录/tmp/destination

docker run -itd --volume /tmp/source:/tmp/destination --name test ubuntu/nginx bash

基于ubuntu/nginx镜像创建了一个Docker容器。

指定容器的名称为test,由 ––name 选项指定。

Docker Volume 由 ––volume (可以简写为-v)选项指定,主机的 /tmp/source 目录与容器中的 /tmp/destination 目录一一对应。

方式一:修改配置文件(需停止docker服务)

1、停止docker服务
systemctl stop docker.service(关键,修改之前必须停止docker服务)

2、vim /var/lib/docker/containers/container-ID/config.v2.json

修改配置文件中的目录位置,然后保存退出

 "MountPoints":{"/home":{"Source":"/docker","Destination":"/home","RW":true,"Name":"","Driver":"","Type":"bind","Propagation":"rprivate","Spec":{"Type":"bind","Source":"//docker/","Target":"/home"}}}

3、启动docker服务

systemctl start docker.service

4、启动docker容器

docker start

方式二:提交现有容器为新镜像,然后重新运行它

$ docker ps -a
ConTAINER ID IMAGE   COMMAND   CREATED  STATUS    PORTS  NAMES
 5a3422adeead ubuntu:14.04  "/bin/bash"  about a minute ago Exited (0) about a minute ago   agitated_newton
$ docker commit 5a3422adeead newimagename
$ docker run -ti -v "$PWD/dir1":/dir1 -v "$PWD/dir2":/dir2 newimagename /bin/bash
然后停止旧容器,并使用这个新容器,如果由于某种原因需要新容器使用旧名称,请在删除旧容器后使用docker rename。

方式三:export容器为镜像,然后import为新镜像

$docker container export -o ./myimage.docker 容器ID
$docker import ./myimage.docker newimagename
$docker run -ti -v "$PWD/dir1":/dir1 -v "$PWD/dir2":/dir2 newimagename /bin/bash
然后停止旧容器,并使用这个新容器,如果由于某种原因需要新容器使用旧名称,请在删除旧容器后使用docker rename

注: docker mount 的是容器,images还是看不到

5.9 要从Docker容器中拷贝文件出来

docker cp <container_id>:/path/to/file.txt /path/on/host/file.txt

在上述命令中,你需要替换<container_id>为你要拷贝文件出错的Docker容器ID。/path/to/file.txt是容器内要拷贝的文件路径,/path/on/host/file.txt是你要将文件拷贝到的主机上的路径。

请确保在运行上述命令时,你已经在Docker容器外部,并且具有适当的权限来执行文件拷贝操作

docker cp 4c2bdfc52747:/LinearPartition/bpp_plot.tex ./

六、使用案例

6.1 DEEPCRISPR的安装和使用

docker pull michaelchuai/deepcrispr:latest  #获取镜像

docker images #获得镜像的ID

#创建并启动container。d08cf708b8fa为镜像ID;name后面接的是给container取的名字,-v后面接的是将本地的文件夹挂载到容器的文件夹/testtt,
docker run -it -v /data/user/sam/test:/testtt --name deepcrispr d08cf708b8fa /bin/bash

6.2 ### 让服务的文件夹映射镜像中

docker ps -a
docker stop 容器ID && docker rm -f 容器ID

docker run -v /home/sam/project/BPKit:/BPKit2:ro -d --name 新的容器名 --gpus all  -p  1111:22 centos_XX_镜像名gen:1.1 /usr/sbin/sshd -D &

服务器的文件夹BPKit,就映射到BPKit2。同时,以后就可以通过ssh 链接服务器了。

ssh -p 1111 sam@服务器IP

6.3 docker中安装centos7系统

[sam@c01 covid19]$ docker pull centos:centos7
centos7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
Status: Downloaded newer image for centos:centos7
docker.io/library/centos:centos7

docker images
docker run --privileged=true  -tid --name centos71 -v /data4:/data4 centos:centos7  /usr/sbin/init
docker ps
docker exec -it 127ff1a897e2 bash

七、报错

7.1 报错1

[root@g02 ~]# docker images
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

网上给的解决方案:

su root # 先切换到root用户, 再执行以下命令
systemctl enable docker # 开机自动启动docker

systemctl start docker # 启动docker
systemctl restart docker # 重启dokcer

我执行的是

systemctl start docker-latest.service

#停止服务
systemctl stop docker-latest.service


[root@g02 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             S     IZE

7.2 报错2

[sam@g02 ~]$ docker run hello-world
/usr/bin/docker-latest: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.26/containers/create: dial unix /var/run/docker.sock: connect: permission denied.

方法1:

[root@g02 ~]# su - docker
This account is currently not available.

修改 docker

docker:x:498:498:Docker User:/var/lib/docker-latest:/sbin/nologin

改成

docker:x:498:498:Docker User:/var/lib/docker-latest:/bin/bash

然后root 用户下,

systemctl start docker-latest.service

重新登录sam用户,接着

[sam@g02 ~]$ docker run hello-world
/usr/bin/docker-latest: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.26/containers/create: dial unix /var/run/docker.sock: connect: permission denied.

方法2:

[sam@c01 vep_cache2]$ sudo usermod -aG docker sam
[sam@c01 vep_cache2]$ docker run hello-word
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create": dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

用户重新登陆,然后

[sam@c01 ~]$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

7.3 报错3

[root@test3] # docker run -d --name mysql-server --network my-network -e MYSQL_ROOT_PASSWORD=secret mysql
/usr/bin/docker-current: Error response from daemon: Conflict. The container name "/mysql-server" is already in use by container bdc8d8c475cb86695c466d23fd7102221f2c040898c2d576f94cd06c93ca811b. You have to remove (or rename) that container to be able to reuse that name..
See '/usr/bin/docker-current run --help'.

直接用docker ps,没发现运行什么。

[root@test3 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

docker ps -l 查看,发现果然还在。

[root@test3 ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
bdc8d8c475cb        mysql               "docker-entrypoint..."   33 minutes ago      Exited (0) 9 minutes ago                       mysql-server

因为容器已经停了,所以kill没用,需要rm。

直接docker rm

[root@test3 ~]# docker rm bdc8d8c475cb
bdc8d8c475cb
[root@test3 ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS               NAMES
936a6b85f6fc        httpd               "httpd-foreground"   47 hours ago        Created                                 myhttpd

原来的mysql没了。

参考资料

这里是一个广告位,,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn