Docker是一个容器化平台,它将应用程序及其所有依赖项以容器的形式打包在一起,以确保应用程序在任何环境(无论是开发环境、测试环境还是生产环境)中无缝运行。
Docker容器,将一个软件包在一个完整的文件系统中,其中包含运行所需的一切:代码、运行时、系统工具、系统库等任何可以安装在服务器上的东西。
它都将始终运行相同的程序,无论软件的环境如何。
Docker 官网:https://www.docker.com
Web 应用的自动化打包和发布。
自动化测试和持续集成、发布。
在服务型环境中部署和调整数据库或其他的后台应用。
从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
Docker 包括三个基本概念:
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
Docker相关概念说明
概念 | 说明 |
---|---|
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker 仓库(Registry) | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。 一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
Docker 支持以下的 64 位 CentOS 版本:
CentOS 7
CentOS 8
更高版本...
我是在阿里云服务器上安装Docker的,centos版本是7.3.1611。以此为示例进行安装。
如果不知道自己的版本,可使用
命令:
cat /etc/redhat-release
输出:
[root@izbp10ppn76gf76g4zrw1sz ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
[root@izbp10ppn76gf76g4zrw1sz ~]#
1、卸载旧版本
较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、添加yum源。
yum install epel-release –y
yum clean all
yum list
3、安装并运行Docker.
yum install docker-io –y
systemctl start docker
4、检查安装结果。
docker info
如果出现以下信息则安装成功。
[root@izbp10ppn76gf76g4zrw1sz ~]# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 1.13.1
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: false
Logging Driver: journald
Cgroup Driver: systemd
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: docker-runc runc
Default Runtime: docker-runc
Init Binary: /usr/libexec/docker/docker-init-current
containerd version: (expected: aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1)
runc version: e45dd70447fb72ee4e1f6989173aa6c5dd492d87 (expected: 9df8b306d01f59d3a8029be411de015b7304dd8f)
init version: fec3683b971d9c3ef73f284f176672c44b448662 (expected: 949e6facb77383876aeff8a6944dde66b3089574)
Security Options:
seccomp
WARNING: You're not using the default seccomp profile
Profile: /etc/docker/seccomp.json
Kernel Version: 3.10.0-514.26.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
Number of Docker Hooks: 3
CPUs: 1
Total Memory: 1.796 GiB
Name: izbp10ppn76gf76g4zrw1sz
ID: TDG2:FWM5:OW7Y:RHWH:KXJ4:V7D3:ZSTM:2PXD:TZFE:G4FZ:6RCH:7YLI
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
Live Restore Enabled: false
Registries: docker.io (secure)
国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:
Docker官方提供的中国镜像库:https://registry.docker-cn.com
七牛云加速器:https://reg-mirror.qiniu.com
当配置某一个加速器地址之后,若发现拉取不到镜像,请切换到另一个加速器地址。国内各大云服务商均提供了 Docker 镜像加速服务,建议根据运行 Docker 的云平台选择对应的镜像加速服务。
我使用的是阿里云镜像加速
配置阿里云容器镜像服务参考:https://www.cnblogs.com/LUA123/p/11401962.html
一、Hello World
我们学习一门技术,入门都是以一个Hello orld案例开始的。
Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。
输出Hello world
命令
[root@izbp10ppn76gf76g4zrw1sz ~]# docker run centos /bin/echo "Hello World"
输出
Hello World
各个参数解析:
docker: Docker 的二进制执行文件。
run: 与前面的 docker 组合来运行一个容器。
centos 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。如果带上标签,如centos:6.8则下载centos6.8版本。否则默认下载最新版。
/bin/echo "Hello world": 在启动的容器里执行的命令
以上命令完整的意思可以解释为:Docker 以 centos 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
2、运行交互式的容器
我们通过 docker 的两个参数 -i -t,让 docker 运行的容器实现"对话"的能力:
[root@izbp10ppn76gf76g4zrw1sz ~]# docker run -i -t centos /bin/bash
[root@4c4e39be9736 /]#
各个参数解析:
-t: 在新容器内指定一个伪终端或终端。
-i: 允许你对容器内的标准输入 (STDIN) 进行交互
注意第二行[root@4c4e39be9736 /]# ,此时我们已进入一个 centos 系统的容器
我们尝试在容器中运行命令 cat /proc/version 和ls分别查看当前系统的版本信息和当前目录下的文件列表。
[root@izbp10ppn76gf76g4zrw1sz ~]# docker run -i -t centos /bin/bash
[root@7d096ba3d5a9 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@7d096ba3d5a9 /]# cat /proc/version
Linux version 3.10.0-514.26.2.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) ) #1 SMP Tue Jul 4 15:04:05 UTC 2017
[root@7d096ba3d5a9 /]#
我们可以通过运行 exit 命令或者使用 CTRL+D 来退出容器。
[root@7d096ba3d5a9 /]# exit
exit
[root@izbp10ppn76gf76g4zrw1sz ~]#
3、启动容器(后台模式)
使用以下命令创建一个以进程方式运行的容器。
[root@izbp10ppn76gf76g4zrw1sz ~]# docker run -d centos /bin/sh -c "while true; do echo hello world; sleep 1; done"
1fe530c60394c1575e677d998d64b374debe0c1769b23810f20c0cb6b6f52f04
[root@izbp10ppn76gf76g4zrw1sz ~]#
在输出中,我们没有看到期望的 "hello world",而是一串长字符
1fe530c60394c1575e677d998d64b374debe0c1769b23810f20c0cb6b6f52f04
这个长字符串叫做容器 ID,对每个容器来说都是唯一的,我们可以通过容器 ID 来查看对应的容器发生了什么。
首先,我们需要确认容器有在运行,可以通过 docker ps 来查看:
[root@izbp10ppn76gf76g4zrw1sz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1fe530c60394 centos "/bin/sh -c 'while..." About a minute ago Up 59 seconds
输出详情介绍:
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。
状态有7种:
created(已创建)
restarting(重启中)
running(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
NAMES: 自动分配的容器名称。
在宿主主机内使用 docker logs 命令,查看容器内的标准输出:
docker logs+容器ID
[root@izbp10ppn76gf76g4zrw1sz ~]# docker logs 1fe530c60394
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
4、停止容器
我们使用 docker stop 命令来停止容器,再用docker ps 来查看当前运行的容器。发现已经停止了。
docker stop +容器ID
[root@izbp10ppn76gf76g4zrw1sz ~]# docker stop 1fe530c60394
1fe530c60394
[root@izbp10ppn76gf76g4zrw1sz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@izbp10ppn76gf76g4zrw1sz ~]#
docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。
示例
[root@izbp10ppn76gf76g4zrw1sz ~]# docker
Usage: docker COMMAND
A self-sufficient runtime for containers
Options:
--config string Location of client config files (default "/root/.docker")
-D, --debug Enable debug mode
--help Print usage
-H, --host list Daemon socket(s) to connect to (default [])
-l, --log-level string Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/root/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit
Management Commands:
container Manage containers
image Manage images
network Manage networks
node Manage Swarm nodes
plugin Manage plugins
secret Manage Docker secrets
service Manage services
stack Manage Docker stacks
swarm Manage Swarm
system Manage Docker
volume Manage volumes
Commands:
attach Attach to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes
Run 'docker COMMAND --help' for more information on a command.
可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。
例如我们要查看 docker stats 指令的具体使用方法:
[root@izbp10ppn76gf76g4zrw1sz ~]# docker stats --help
Usage: docker stats [OPTIONS] [CONTAINER...]
Display a live stream of container(s) resource usage statistics
Options:
-a, --all Show all containers (default shows just running)
--format string Pretty-print images using a Go template
--help Print usage
--no-stream Disable streaming stats and only pull the first result
[root@izbp10ppn76gf76g4zrw1sz ~]#
获取镜像
如果我们本地没有 tomcat镜像,我们可以使用 docker pull 命令来载入 tomcat镜像:
$ docker pull tomcat
启动容器
以下命令使用 tomcat镜像启动一个容器,参数为以命令行模式进入该容器:
$ docker run -it tomcat /bin/bash
参数说明:
-i: 交互式操作。
-t: 终端。
tomcat: tomcat镜像。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
要退出终端,直接输入 exit:
root@ed09e4490c57:/# exit
查看所有的容器命令如下:
$ docker ps -a
复制你要启动的容器ID,使用docker start 启动一个容器。
$ docker start b750bbbcfd88
在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。
$ docker run -itd centos /bin/bash
示例
[root@izbp10ppn76gf76g4zrw1sz ~]# docker run -itd -p7777:8080 mytomcat /bin/bash
00eabff7b8c47c248392be794f4c57037379c9e9158d082810a2546a032b1424
[root@izbp10ppn76gf76g4zrw1sz ~]#
注:加了 -d 参数默认不会进入容器,想要进入容器需要使用指令** docker exec**(下面会介绍到)。
停止容器的命令如下:
$ docker stop <容器 ID>
停止的容器可以通过 docker restart 重启:
$ docker restart <容器 ID>
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
docker attach
docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
下面演示了docker exec
[root@izbp10ppn76gf76g4zrw1sz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
00eabff7b8c4 mytomcat "/bin/bash" 2 minutes ago Up 2 minutes 0.0.0.0:7777->8080/tcp kind_pare
[root@izbp10ppn76gf76g4zrw1sz ~]# docker exec -it 00eabff7b8c4 /bin/bash
root@00eabff7b8c4:/usr/local/tomcat#
注意: 如果从这个容器退出,不会导致容器的停止,这就是为什么推荐大家使用 docker exec 的原因。
更多参数说明请使用 docker exec --help 命令查看。
导出容器
如果要导出本地某个容器,可以使用 docker export 命令。
$ docker export 1e560fca3906 > centos.tar
这样将导出容器快照到本地文件。
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 cetos.tar 导入到镜像 test/centos:v1
$ cat docker/centos.tar | docker import - test/cetos:v1
删除容器使用 docker rm 命令:
$ docker rm -f 1e560fca3906
示例
[root@izbp10ppn76gf76g4zrw1sz ~]# docker rm 00eabff7b8c4
Error response from daemon: You cannot remove a running container 00eabff7b8c47c248392be794f4c57037379c9e9158d082810a2546a032b1424. Stop the container before attempting removal or use -f
[root@izbp10ppn76gf76g4zrw1sz ~]# docker rm -f 00eabff7b8c4
00eabff7b8c4
[root@izbp10ppn76gf76g4zrw1sz ~]#
[root@izbp10ppn76gf76g4zrw1sz ~]# docker rm -f $(docker ps -aq)
1fe530c60394
214d15cc8b99
7d096ba3d5a9
4c4e39be9736
1be0187b70f0
99f402af94c7
67963ba2bad3
8d84f6813795
52538d13ba35
865bbcf89479
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。
下面我们来学习:
1、管理和使用本地 Docker 主机镜像
2、创建镜像
我们可以使用 docker images 来列出本地主机上的镜像。
[root@izbp10ppn76gf76g4zrw1sz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat latest 189529250247 14 hours ago 584 MB
tomcat8 8.8 59d81839d056 14 hours ago 534 MB
docker.io/tomcat latest 4e7840b49fad 5 days ago 529 MB
docker.io/centos latest 470671670cac 6 weeks ago 237 MB
[root@izbp10ppn76gf76g4zrw1sz ~]#
各个选项说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
所以,我们如果要使用版本为8.8的tomcat8系统镜像来运行容器时,命令如下:
[root@izbp10ppn76gf76g4zrw1sz ~]# docker run -it -p7777:8080 tomcat8:8.8
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/openjdk-8
如果你不指定一个镜像的版本标签,例如你只使用 tomcat,docker 将默认使用 tomcat:latest 镜像。
当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。
示例:
[root@izbp10ppn76gf76g4zrw1sz ~]# docker pull ubuntu:13.10
Trying to pull repository docker.io/library/ubuntu ...
13.10: Pulling from docker.io/library/ubuntu
a3ed95caeb02: Pull complete
下载完成后,我们可以直接使用这个镜像来运行容器。
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。
示例
[root@izbp10ppn76gf76g4zrw1sz ~]# docker search tomcat
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/tomcat Apache Tomcat is an open source implementa... 2653 [OK]
docker.io docker.io/tomee Apache TomEE is an all-Apache Java EE cert... 75 [OK]
docker.io docker.io/dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 ba... 53 [OK]
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建
docker rmi + 镜像名/镜像ID
[root@izbp10ppn76gf76g4zrw1sz ~]# docker rmi mytomcat
Untagged: mytomcat:latest
Deleted: sha256:189529250247fc2f07fd8946abf01997345c9dbcde3660848dd5a27c160e2e08
Deleted: sha256:95f8b839419c14ac221868ef294ec76f3c1de8b094eef7a5b6fc9582ef5184d0
[root@izbp10ppn76gf76g4zrw1sz ~]#
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
1、从已经创建的容器中更新镜像,并且提交这个镜像
2、使用 Dockerfile 指令来创建一个新的镜像
更新镜像之前,我们需要使用镜像来创建一个容器。
runoob@runoob:~$ docker run -t -i ubuntu:15.10 /bin/bash
root@e218edb10161:/#
在运行的容器内使用 apt-get update 命令进行更新。
在完成操作之后,输入 exit 命令来退出这个容器。
此时 ID 为 e218edb10161 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。
runoob@runoob:~$ docker commit -m="描述信息" -a="作者" e218edb10161 runoob/ubuntu:v2
sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8
各个参数说明:
-m: 提交的描述信息
-a: 指定镜像作者
e218edb10161:容器 ID
runoob/ubuntu:v2: 指定要创建的目标镜像名
部分常用命令
docker images 查看docker下的所有镜像
docker images -q 查看docker下所有镜像的IMAGE ID
docker search tomcat 搜索tomcat镜像
docker search --filter=stars=100 tomcat 过滤搜索 搜索stars大于100的tomcat
docker pull 拉取下载镜像
docker info 查看docker信息
docker rmi 删除镜像
docker rm 删除容器
docker ps 查看当前正在运行的容器
docker ps -a 查看所有运行过的容器
docker ps -n 3 查看最近三个运行过的容器
docker run -it 470671670cac 运行IMAGE ID为 的容器(交互式启动)
docker run -d centos