一、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 引擎,无需虚拟化硬件,也不用操作系统,而是直接运行容器,
提供所需的应用服务,大大减降低了服务器资源的占用。
二、Docker 的优点
1、快速的交付和部署
2、更高效的虚拟化
3、更轻松的迁移和扩展
4、简单的管理
三、Docker 的基本概念
1、镜像(Image) Docker 镜像就是一个只读的模板。例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。 镜像可以用来创建 Docker 容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
2、容器(Container) Docker 利用容器来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。 *注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
3、仓库(Repository)
仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。仓库分为公开仓库(Public)和私有仓库(Private) 两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool 等,可以提供大陆用户更稳定快速的访问。当然,用户也可以在本地网络内创建一个私有仓库。当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。 *注:Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。
四、Docker 基础命令
1、docker search //从Docker Hub 搜索镜像
用法: docker search TERM
参数:
--automated=false 仅显示自动创建的镜像
--no-trunc=false 输出信息不截断显示
-s, --stars=0 指定仅显示评价为指定星级以上的镜像
[[email protected] ~]# docker search -s 500 nginx //搜索星级为500 以上的镜像
2、docker info //查看当前信息
[[email protected] ~]# docker info
3、docker pull //下载镜像
[[email protected] ~]# docker pull amber/nginx
4、docker push //上传镜像
[[email protected] ~]# docker push amber/nginx
5、cat 本地容器快照名 |docker import - 自定义容器名:自定义标记名 //导入本地容器快照
6、docker run //运行一个容器,-i 交互式,-t 获得一个终端,-d 守护进程形式运行
[[email protected] ~]# docker run -it centos:1 /bin/bash
[[email protected] /]#
[[email protected] ~]# docker run -d centos:1 /bin/bash -c "while :; do echo hello; sleep 2; done"
b21e687d0719cb36c89a4325808bc03d42918ef51176235e9dfc50c57094236b
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b21e687d0719 centos:1 "/bin/bash -c ‘while " About a minute ago Up About a minute high_brahmagupta
7、退出容器
exit 或 ctrl + d //退出并停止容器
(2)先按ctrl + p 再按 ctrl + q //退出伪终端,容器后台运行
[[email protected] ~]# docker run -it centos:1 /bin/bash
[[email protected] /]#ctrl +p ; ctrl+q [[email protected] ~]#
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
353fc6f27cb7 centos:1 "/bin/bash" 49 seconds ago Up 48 seconds berserk_einstein
b21e687d0719 centos:1 "/bin/bash -c ‘while " 5 minutes ago Up 5 minutes high_brahmagupta
[[email protected] ~]# docker attach 353 //输入容器ID,若没有重名的,输入第一个字母即可
[[email protected] /]#
8、docker ps //查看容器,-a 查看所有容器,-q 只查看容器ID
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b21e687d0719 centos:1 "/bin/bash -c ‘while " 11 minutes ago Up 11 minutes high_brahmagupta
[[email protected] ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
353fc6f27cb7 centos:1 "/bin/bash" 18 minutes ago Exited (127) 11 minutes ago berserk_einstein
b21e687d0719 centos:1 "/bin/bash -c ‘while " 23 minutes ago Up 23 minutes high_brahmagupta
fcbe47db440d centos:1 "/bin/bash" 26 minutes ago Exited (127) 23 minutes ago nauseous_franklin
9、docker rm //删除一个容器
[[email protected] ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
353fc6f27cb7 centos:1 "/bin/bash" 20 minutes ago Exited (127) 12 minutes ago berserk_einstein
b21e687d0719 centos:1 "/bin/bash -c ‘while " 24 minutes ago Up 24 minutes high_brahmagupta
fcbe47db440d centos:1 "/bin/bash" 27 minutes ago Exited (127) 24 minutes ago nauseous_franklin
[[email protected] ~]# docker rm -f b21
b21
[[email protected] ~]# docker rm -f f
f
[[email protected] ~]# docker rm -f 353
353
[[email protected] ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10、docker rmi //删除一个或多个镜像,-f 强制删除
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 1 51f7df51ca40 30 minutes ago 196.7 MB
docker.io/nginx latest db079554b4d2 32 hours ago 181.8 MB
[[email protected] ~]# docker rmi docker.io/nginx
Untagged: docker.io/nginx:latest
Untagged: docker.io/[email protected]:4296639ebdf92f035abf95fee1330449e65990223c899838283c9844b1aaac4c
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 1 51f7df51ca40 32 minutes ago 196.7 MB
11、docker create //创建一个容器,但不运行
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 1 385c6554f48e 19 seconds ago 196.7 MB
[[email protected] ~]# docker create -it centos:1 /bin/bash
9bace61c06b5c4539e4d8668a04ff2762cf5aaad13731d3c2ac6b99d1e3cb517
[[email protected] ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9bace61c06b5 centos:1 "/bin/bash" 12 seconds ago Created drunk_payne
12、docker start|stop|restart|kill //运行已停止的容器|停止一个正在运行的容器|重启
一个容器|杀死一个正在运行的容器
[[email protected] ~]# docker start 9ba
9ba
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9bace61c06b5 centos:1 "/bin/bash" About a minute ago Up 9 seconds drunk_payne
[[email protected] ~]# docker stop 9ba
9ba
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[[email protected] ~]# docker start 9ba
9ba
[[email protected] ~]# docker kill 9ba
9ba
[[email protected] ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9bace61c06b5 centos:1 "/bin/bash" 4 minutes ago Exited (137) 8 seconds ago drunk_payne
13、docker save |load //存储镜像|载入镜像
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 1 385c6554f48e 6 minutes ago 196.7 MB
[[email protected] ~]# docker save -o centos.tar centos:1
[[email protected] ~]# ls
anaconda-ks.cfg centos.tar mysql5.tar nginx.tar tomcat.tar
[[email protected] ~]# docker rmi -f centos:1
Untagged: centos:1
Deleted: sha256:385c6554f48e0aaa488fd905e2f70b579ba47c98a9d4d44bf0235e0a8e3141ff
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[[email protected] ~]# docker load < centos.tar
Loaded image: centos:1
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 1 385c6554f48e 15 minutes ago 196.7 MB
[[email protected] ~]#
14、docker export //导出容器快照
[[email protected] ~]# docker run -it centos:1 /bin/bash
[[email protected] /]# touch aaa
[[email protected] /]# ls
aaa bin etc lib lost+found mnt proc run srv tmp var
anaconda-post.log dev home lib64 media opt root sbin sys usr
[[email protected]ffd /]# exit
exit
[[email protected] ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
42a1ab757ffd centos:1 "/bin/bash" 45 seconds ago Exited (0) 29 seconds ago nauseous_varahamihira
9bace61c06b5 centos:1 "/bin/bash" 17 minutes ago Exited (137) 13 minutes ago drunk_payne
[[email protected] ~]# docker export -o centos-aaa.tar 42a
[[email protected] ~]# ls
anaconda-ks.cfg centos-aaa.tar centos.tar mysql5.tar nginx.tar tomcat.tar
[[email protected] ~]# cat centos-aaa.tar |docker import - centos-aaa
sha256:99e1653378ed127eaeb8dd531fc7b4b5fc17b8bf095d9deeec5246f368dc4dcf
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-aaa latest 99e1653378ed 13 seconds ago 196.7 MB
centos 1 385c6554f48e 21 minutes ago 196.7 MB
[[email protected] ~]# docker run -it centos-aaa /bin/bash
[[email protected] /]# ls
aaa bin etc lib lost+found mnt proc run srv tmp var
anaconda-post.log dev home lib64 media opt root sbin sys usr
五、创建私有仓库
仓库(Repository)是集中存放镜像的地方。
注册服务器才是存放仓库具体的服务器(Registry),每个服务器上都可以放置多个仓库,
而每个仓库下可以放置多个镜像,每个镜像上可以运行多个容器,每个容器上可以跑一个应
用或应用组。
仓库自身可以分为:公共仓库和私有仓库
比如共有仓库: http://hub.docker.com 或国内的: dl.dockerpool.com
安装docker 后,可以通过官方提供的registry 镜像来简单搭建一套本地仓库环境
[[email protected] ~]# vi /etc/sysconfig/docker
# INSECURE_REGISTRY=‘--insecure-registry‘
INSECURE_REGISTRY=‘--insecure-registry 192.168.10.130:5000‘
[[email protected] ~]# systemctl restart docker.service
方法一:
方法二:
[[email protected] ~]# mkdir -pv /opt/data/registry
mkdir: 已创建目录 "/opt/data" mkdir:
已创建目录 "/opt/data/registry"
[[email protected] ~]# docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry 通过这种方式可以将上传的镜像放到本地的: /opt/data/registry
[[email protected] ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb09700272a6 registry "/entrypoint.sh /etc/" 5 minutes ago Exited (2) 25 seconds ago jovial_poitras
[[email protected] ~]# docker start bb0
bb0
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb09700272a6 registry "/entrypoint.sh /etc/" 3 minutes ago Up 3 minutes 0.0.0.0:5000->5000/tcp jovial_poitras
[email protected]:/# 192.168.10.160 - - [17/Feb/2017:10:22:06 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)" "-"
按ctrl+p 再按ctrl+q,使服务保持后台运行
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19bd142b0566 nginx "/bin/bash" 12 minutes ago Up 12 minutes 443/tcp, 0.0.0.0:5500->80/tcp adoring_ardinghelli
bb09700272a6 registry "/entrypoint.sh /etc/" 23 minutes ago Up 18 minutes 0.0.0.0:5000->5000/tcp jovial_poitras
[[email protected] ~]# docker tag nginx 192.168.10.130:5000/nginx-test //将修改过的nginx 镜
像做标记封装,准备上传到私有仓库
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-aaa latest 99e1653378ed 31 minutes ago 196.7 MB
centos 1 385c6554f48e 53 minutes ago 196.7 MB
docker.io/nginx latest db079554b4d2 33 hours ago 181.8 MB
192.168.10.130:5000/nginx-test latest db079554b4d2 33 hours ago 181.8 MB
docker.io/registry latest d1e32b95d8e8 4 weeks ago 33.17 MB
[[email protected] ~]# docker push 192.168.10.130:5000/nginx-test //上传到私有仓库
The push refers to a repository [192.168.10.130:5000/nginx-test]
a82b6c66a6d4: Pushed
1941ca4a7a84: Pushed
a2ae92ffcd29: Pushed
latest: digest: sha256:9e81e4ce4899448e5e7aea69a72dfd1df989a7a0fe7365ad63be1133f05acf10 size: 948
另外打开一台机器装好docker
[[email protected] ~]# docker pull 192.168.10.131:5000/nginx-test //从私有仓库下载镜像
略。。。