环境:
CentOS 7,Docker version 1.13.1
摘要说明:
Docker:Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
本篇文章主要对Docker进行简单的介绍,Docker在CentOS 7下的安装及Docker中镜像和容器的初步使用。
步骤:
1.Docker架构简介
Docker是一款针对程序开发人员和系统管理员来开发、部署、运行应用的一款虚拟化平台。Docker可以让你像使用集装箱一样快速的组合成应用、屏蔽代码层面的差异,会尽可能的缩短从代码测试到产品部署的时间。
为什么选择Docker?
》我们希望你的开发环境能够更好的提高你的工作效率。Docker容器能够帮助开发人员、系统管理员、QA和版本控制工程师在一个生产环节中一起协同工作。我们制定了一套容器标准,而这套容器标准能够使系统管理员更改容器的时候,程序员不需要关心容器的变化,而更专注自己的应用程序代码。从而隔离开了开发和管理,简化了开发和部署的成本。
我们使应用的构建方式更加简单,可以快速的迭代你的应用,并且可以可视化的来查看应用的细微更改。这能够帮助组织里边的成员来更好的理解一个应用从构建到运行的过程。
》Docker 是一个轻量级的容器,所以它的速度是非常快的,而容器的启动时间只需要一秒钟,从而大大的减少了开发、测试和部署的时间。
》Docker 容器可以运行在大多数的环境中,你可以在桌面环境、物理主机、虚拟主机再到数据中,私有或者公有云中部署。
》因为 Docker 可以从多平台下运行。你可以很容器的迁移你的应用程序。如果需要,你可以非常简单的将应用程序从测试环境迁移到云,或者从云迁移到测试环境。
》Docker 是一个轻量级的容器,因此它可以在很短的时间内启动和关闭。当你需要的时候,你可以启动多个容器引擎,并且在不需要使用他们的时候,可以将他们全部关闭。
》Docker的容器本身不需要额外创建虚拟机管理系统,因此你可以启动多套Docker容器,这样就可以充分发挥主机服务器的物理资源,也可以降低因为采购服务器licenses而带来的额外成本。
》因为Docker上述轻便,快速的特性。可以使您的应用达到快速迭代的目的。每次小的变更,马上就可以看到效果。而不用将若干个小变更积攒到一定程度再变更。每次变更一小部分其实是一种非常安全的方式。
Docker架构:
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker 镜像(Images):Docker 镜像是用于创建 Docker 容器的模板。
Docker 容器(Container):容器是独立运行的一个或一组应用。
Docker 客户端(Client):Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。
Docker 主机(Host):一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker 仓库(Registry):Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。
Docker Machine:Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。
对容器的简要说明:
镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
容器是镜像的运行时实例 - 实际执行时镜像会在内存中变成什么。默认情况下,它完全独立于主机环境运行,仅在配置为访问主机文件和端口的情况下才执行此操作。
容器在主机内核上以本机方式运行应用。与仅通过管理程序对主机资源进行虚拟访问的虚拟机相比,它们具有更好的性能特征。容器可以获取本机访问,每个容器都在独立进程中运行,占用的内存不超过任何其他可执行文件。
容器与虚拟机:
在比较虚拟机和容器时,请考虑此图:
虚拟机图: 容器图:
虚拟机运行来宾操作系统 - 请注意每个框中的操作系统层。此项为资源密集型,并且生成的磁盘镜像和应用状态与操作系统设置、系统安装的依赖项、操作系统安全补丁以及其他容易丢失且难以复制的临时配置相关联。
容器可以共享单个内核,并且需要存在于容器镜像中的唯一信息是可执行文件及其软件包依赖项,这些都不需要在主机系统上安装。这些进程的运行方式类似于原生进程,并且您可以通过运行 docker ps
等命令来逐一管理它们 - 如同您在 Linux 上运行 ps
以查看活动进程一样。最后,由于它们包含所有依赖项,因此不存在配置关联;容器化应用“可以随处运行”。
2.Docker安装(Centos 7)
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。可使用uname -r命令查看是否支持:
uname -r
使用yum安装Docker:
yum -y install docker-io
安装完成后启动Docker:
service docker start
3.镜像的使用
想要使用Docker的第一步就是拉取镜像到本地:
查找镜像:
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个httpd的镜像来作为我们的web服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。
docker search httpd
查询出结果如下:
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/httpd The Apache HTTP Server Project 1891 [OK]
docker.io docker.io/hypriot/rpi-busybox-httpd Raspberry Pi compatible Docker Image with ... 41
docker.io docker.io/centos/httpd 19 [OK]
docker.io docker.io/centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or b... 15
docker.io docker.io/armhf/httpd The Apache HTTP Server Project 8
docker.io docker.io/macadmins/netboot-httpd use in combination with bruienne/bsdpy 6 [OK]
docker.io docker.io/salim1983hoop/httpd24 Dockerfile running apache config 2 [OK]
docker.io docker.io/tplatform/aws-linux-httpd24-php70 aws-linux-httpd24-php70 2 [OK]
docker.io docker.io/epflidevelop/os-wp-httpd WP httpd 1 [OK]
docker.io docker.io/fboaventura/dckr-httpd Small footprint http server to use with ot... 1 [OK]
docker.io docker.io/lead4good/httpd-fpm httpd server which connects via fcgi proxy... 1 [OK]
docker.io docker.io/tplatform/aws-linux-httpd24-php71 aws-linux-httpd24-php71 1 [OK]
docker.io docker.io/tplatform/aws-linux-httpd24-php71-fpm aws-linux-httpd24-php71-fpm 1 [OK]
docker.io docker.io/amd64/httpd The Apache HTTP Server Project 0
docker.io docker.io/buzzardev/httpd Based on the official httpd image 0 [OK]
docker.io docker.io/cilium/demo-httpd 0
docker.io docker.io/dockerpinata/httpd 0
docker.io docker.io/interlutions/httpd httpd docker image with debian-based confi... 0 [OK]
docker.io docker.io/itsziget/httpd24 Extended HTTPD Docker image based on the o... 0 [OK]
docker.io docker.io/manageiq/httpd Container with httpd, built on CentOS for ... 0 [OK]
docker.io docker.io/manasip/httpd 0
docker.io docker.io/mprahl/s2i-angular-httpd24 An S2I image for building and running Angu... 0 [OK]
docker.io docker.io/ppc64le/httpd The Apache HTTP Server Project 0
docker.io docker.io/publici/httpd httpd:latest 0 [OK]
docker.io docker.io/trollin/httpd 0
各个选项说明:
-
REPOSITORY:表示镜像的仓库源
-
TAG:镜像的标签
-
IMAGE ID:镜像ID
-
CREATED:镜像创建时间
-
SIZE:镜像大小
获取镜像:
当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。
[root@iZbp1dham6enej0lrs00riZ ~]# docker pull httpd
Using default tag: latest
Trying to pull repository docker.io/library/httpd ...
latest: Pulling from docker.io/library/httpd
d660b1f15b9b: Pull complete
aa1c79a2fa37: Pull complete
f5f6514c0aff: Pull complete
676d3dd26040: Pull complete
4fdddf845a1b: Pull complete
520c4b04fe88: Pull complete
5387b1b7893c: Pull complete
Digest: sha256:8c84e065bdf72b4909bd55a348d5e91fe265e08d6b28ed9104bfdcac9206dcc8
Status: Downloaded newer image for docker.io/httpd:latest
列出镜像列别:
我们可以使用 docker images 来列出本地主机上的镜像。
[root@iZbp1dham6enej0lrs00riZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/httpd latest 11426a19f1a2 13 days ago 178 MB
各个选项说明:
-
REPOSITORY:表示镜像的仓库源
-
TAG:镜像的标签
-
IMAGE ID:镜像ID
-
CREATED:镜像创建时间
-
SIZE:镜像大小
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如ubuntu仓库源里,有15.10、14.04等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
4.容器的使用
我们首先可以查看下docker的命令大全:
[root@iZbp1dham6enej0lrs00riZ ~]# 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@iZbp1dham6enej0lrs00riZ ~]# 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@iZbp1dham6enej0lrs00riZ ~]#
创建一个应用容器:
[root@iZbp1dham6enej0lrs00riZ ~]# docker run -d -p 80:80 httpd
a7adfb2db2e5d940fe6d0b729917a94b7d66b3e07387bd5decbec656fc42854f
docker run的参数说明如下:
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-d, --detach=false 指定容器运行于前台还是后台,默认为false
-i, --interactive=false 打开STDIN,用于控制台交互
-t, --tty=false 分配tty设备,该可以支持终端登录,默认为false
-u, --user="" 指定容器的用户
-a, --attach=[] 登录容器(必须是以docker run -d启动的容器)
-w, --workdir="" 指定容器的工作目录
-c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用
-e, --env=[] 指定环境变量,容器中可以使用该环境变量
-m, --memory="" 指定容器的内存上限
-P, --publish-all=false 指定容器暴露的端口
-p, --publish=[] 指定容器暴露的端口
-h, --hostname="" 指定容器的主机名
-v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录
--volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录
--cap-add=[] 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cap-drop=[] 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cidfile="" 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
--cpuset="" 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
--device=[] 添加主机设备给容器,相当于设备直通
--dns=[] 指定容器的dns服务器
--dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
--entrypoint="" 覆盖image的入口点
--env-file=[] 指定环境变量文件,文件格式为每行一个环境变量
--expose=[] 指定容器暴露的端口,即修改镜像的暴露端口
--link=[] 指定容器间的关联,使用其他容器的IP、env等信息
--lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
--name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
--net="bridge" 容器网络设置:
bridge 使用docker daemon指定的网桥
host //容器使用主机的网络
container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
none 容器使用自己的网络(类似--net=bridge),但是不进行配置
--privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities
--restart="no" 指定容器停止后的重启策略:
no:容器退出时不重启
on-failure:容器故障退出(返回值非零)时重启
always:容器退出时总是重启
--rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
--sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
创建成功后会输出容器id即CONTAINER ID;
也可根据容器对外端口访问测试:http://ip:80/
查看容器:
使用 docker ps 来查看正在运行的容器:
[root@iZbp1dham6enej0lrs00riZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a7adfb2db2e5 httpd "httpd-foreground" 6 minutes ago Up 6 minutes 0.0.0.0:80->80/tcp silly_hawking
-CONTAINER ID:容器id
-IMAGE:容器启动镜像
-COMMAND:容器名称
-CREATED:创建时间
-COMMAND:命令模式
-STATUS:状态
-PORTS:端口说明
-NAMES:容器名称
docker ps -l 查询最后一次创建的容器。
查看容器日志:
通过容器id查看日志:
docker logs a7adfb2db2e5
或者通过名称查看日志:
docker logs silly_hawking
或者使用docker logs -f实时查看日志,类似tail -f
停止/启动容器:
通过容器id停止容器:
docker stop a7adfb2db2e5
也可通过名称停止容器:
docker stop silly_hawking
启动通过docker start命令使用
查看容器进程:
使用 docker top 来查看容器内部运行的进程:
docker top a7adfb2db2e5
查看容器详细信息:
使用 docker inspect 来查看Docker的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
docker inspect a7adfb2db2e5
移除容器:
可以使用 docker rm 命令来删除不需要的容器:
docker rm a7adfb2db2e5
5.Docker参考文档:
runobb:http://www.runoob.com/docker/docker-tutorial.html