Docker 是一个开源的应用容器引擎,让开发者能够打包他们的应用以及依赖包到一个可移植的容器中,而后发布到任何流行的 Linux 机器上,也能够实现虚拟化。容器是彻底使用沙箱机制,相互之间不会有任何接口。php
官网:https://www.docker.comhtml
相关资料:python
Docker入门教程 http://dockone.io/article/111mysql
Docker_百度百科 http://baike.baidu.com/view/11854949.htmlinux
史上最全Docker资料集粹 http://special.csdncms.csdn.net/BeDocker/nginx
Docker - 话题精华 - 知乎 http://www.zhihu.com/topic/19950993/top-answersweb
docker 简明教程 | 简果网 http://www.simapple.com/docker-tutorialredis
做为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具备显著优点:sql
Docker容器很快,启动和中止能够在秒级实现,这相比传统的虚拟机方式要快得多。docker
Docker容器对系统资源需求不多,一台主机上能够同时运行数千个Docker容器。
Docker经过相似Git的操做来方便用户获取、分发和更新应用镜像,指令简明,学习成本较低。
Docker经过Dockerfile配置文件来支持灵活的自动化建立和部署机制,提升工做效率。
(本段摘自《Docker技术入门与实战》)
虚拟机实现了硬件上的虚拟,而Docker则实现了操做系统级别的虚拟。
Docker 要求 Ubuntu 系统的内核版本高于 3.10,经过 uname -r
命令查看你当前的内核版本:
[root@bogon ~]# uname -r 3.10.0-327.22.2.el7.x86_64
Docker支持如下的CentOS版本:
CentOS 7 (64-bit)
CentOS 6.5 (64-bit) 或更高的版本
Docker 支持如下的 Ubuntu 版本:
Ubuntu Precise 12.04 (LTS)
Ubuntu Trusty 14.04 (LTS)
Ubuntu Wily 15.10
其余更新的版本……
curl -fsSL https://get.docker.com/ | sh # daocloud.io 国内镜像 curl -sSL https://get.daocloud.io/docker | sh
该安装包适用于 Ubuntu,Debian,Centos 等大部分主流 Linux 发行版。
CentOS7支持使用yum安装:
yum update yum install docker
查看文档:
查看版本:
docker version
显示:
Client: Version: 1.11.2 API version: 1.23 Go version: go1.5.4 Git commit: b9f10c9 Built: Wed Jun 1 21:23:11 2016 OS/Arch: linux/amd64 Server: Version: 1.11.2 API version: 1.23 Go version: go1.5.4 Git commit: b9f10c9 Built: Wed Jun 1 21:23:11 2016 OS/Arch: linux/amd64
为了后面的须要,咱们这里下载个ubuntu的镜像。
须要先启动docker服务:
service start docker # 或者 systemctl start docker
docker search ubuntu docker pull ubuntu # 查看全部可用镜像 docker images -a
这就下载了最新的ubuntu系统镜像到本地,接下来咱们能够从该镜像建立多个容器。具体命令含义下面会有说明。
Docker里比较重要的概念有注册服务器、仓库、镜像、容器。
仓库:注册服务器是存放仓库的地方,其上每每存放着多个仓库。每一个仓库集中存放某一类镜像,每每包括多个镜像文件,经过不一样的标签(tag)来进行区分。例如存放Ubuntu操做系统镜像的仓库,称为Ubuntu仓库,其中可能包括14.0四、12.04等不一样版本的镜像。
镜像:Docker镜像(Image)相似于虚拟机镜像,能够将它理解为一个面向Docker引擎的只读模板,包含了文件系统。例如:一个镜像能够只包含一个完整的Ubuntu操做系统环境,能够把它称为一个Ubuntu镜像。
容器:容器是从镜像建立的应用运行实例,能够将其启动、开始、中止、删除,而这些容器都是相互隔离、互不可见的。能够从一个镜像建立无数个容器。平时咱们主要操做的就是容器。咱们也能够把容器打包成镜像以方便再次使用。镜像自身是只读的。容器从镜像启动的时候,Docker会在镜像的最上层建立一个可写层,镜像自己将保持不变。
这部分将介绍docker的结构以及docker服务的管理。
Docker 是 C/S 架构,使用client与Server通讯。
支持三种链接方式:
unix:///var/run/docker.sock
tcp://host:port
fd://socketfd
使用ps -ef | grep docker
查看docker进程。
管理docker服务:
service docker start service docker stop service docker restart
如使用service docker start
其实是执行了/bin/systemctl start docker.service
命令。
建议重启使用:
systemctl daemon-reload systemctl restart docker.service
docker守护进程的配置和操做模式:
docker -d [OPTIONS]
-d
之后台方式运行容器。
下面是容器建立时的一些配置,按需添加。初学者能够简单看看,之后须要再来查找。
运行相关:
-D, --debug=false -e,--exec-driver="native" -p,--pidfile="/var/run/docker.pid"
服务器相关:
-G,--group="docker" -H,--host=[] --tls=false
RemoteAPI相关:
--api-enable-cors=false
存储相关:
-S,--storage-driver="" --selinux-enabled=false --storage-opt=[]
网络设置相关:
-b,--bridge="" 设置自定义网桥 --bip="" --dns=[] --ip=0.0.0.0
Ubuntu: /etc/default/docker
CentOS: /etc/sysconfig/docker
若是没有配置文件,能够直接编辑:
vim /lib/systemd/system/docker.service
里面的ExecStart就是启动配置,默认是:
ExecStart=/usr/bin/docker -H fd://
咱们能够加几个配置:
ExecStart=/usr/bin/docker -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H fd:// --label name=server_1
而后重启:
systemctl daemon-reload systemctl restart docker.service # 若是出问题了,可使用下面命令查看: systemctl status docker.service
经过ps -ef | grep docker
能够查看刚才添加的信息:
[root@localhost ~]# ps -ef | grep docker root 8262 1 0 23:50 ? 00:00:00 /usr/bin/docker daemon -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock -H fd:// --label name=server_1
解决centos7和docker1.9没有配置文件问题 - 建站 - IT精英团 http://www.itnpc.com/news/web/145083113731628.html
咱们能够从一台安装了docker的机器访问另外一台安装了docker的机器。通常状况下咱们使用当前机器的docker客户端访问当前机器的Server端。下面演示如何访问其余docker服务端。
第一台IP:192.168.12.3
第二台IP:192.168.12.4
使用第二台安装有docker的服务器作演示。为区分,设置label不一样。
修改守护进程(Server)默认的启动配置:
默认是:-H fd://
,可修改成:-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H fd:// --label name=server_1
可设置多个链接方式。
第一台访问第二台机器的docker服务:
经过http链接Server:
curl http://192.168.12.4:2375/info
访问的是服务器192.168.12.4:2375的info接口,返回服务器相关信息。
经过docker客户端访问Server:
docker -H tcp://192.168.12.4:2375 info
若是是是第一台机器访问第一台机器Docker的服务端,则使用127.0.0.1:2375就好了。
和服务器端同样,客户端也支持三种链接方式,默认是 -H unix:///var/run/docker.sock
:
-H unix:///path/to/sock
tcp://host:port
fd://socketfd
docker客户端使用docker info
默认访问的是本地Server。能够修改环境变量DOCKER_HOST改变默认链接。命令行直接输入:
export DOCKER_HOST="tcp://127.0.0.1:2375"
127.0.0.1:237
能够替换为实际的Server地址。
若是想恢复本地链接,将 DOCKER_HOST 置空便可:
export DOCKER_HOST=""
咱们能够从镜像中建立容器。
Docker run IMAGE [COMMOND] [ARG...] 在新的容器中执行命令
该命令每运行一次,就建立了一个新的容器。下面演示从下载好的ubuntu镜像中建立并运行一个新的容器:
# 只运行一次命令 docker run ubuntu echo 'hello world' 运行一个新的容器,并执行命令echo # 建立并运行容器,而后进入容器 docker run -i -t --name test ubuntu /bin/bash 以交互式终端运行一个新的容器,镜像是ubuntu,使用bash,容器别名test
-i
交互式界面,默认是false
-t
伪终端,默认false
--name
容器别名,默认随机命名
exit
退出交互式界面,容器中止运行。Crtl+P
或者 Crtl+Q
退出交互式界面,容器在后台运行。(注意是大写P和Q)
查看容器:
docker ps 查看正在运行的容器 docker ps -a 查看全部容器 docker ps -l 查看最近一次运行的容器
示例:
[root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8c52c83c1903 redis "docker-entrypoint.sh" 2 hours ago Exited (0) 2 hours ago myredis
容器操做:
docker create 容器名或者容器ID 建立容器 docker start [-i] 容器名 启动容器 docker run 容器名或者容器ID 运行容器,至关于docker create + docker start docker attach 容器名或者容器ID 进入容器的命令行 docker stop 容器名 中止容器 docker rm 容器名 删除容器 docker top 容器名 查看WEB应用程序容器的进程 docker inspect 容器名 查看Docker的底层信息
删除容器时,容器必须是中止状态,不然会报错误。
咱们可使用守护式容器运行一个或者多个服务,例如运行lamp服务、redis服务、mysql服务等。
什么是守护式容器?
可以长期运行
没有交互式会话
适合运行应用程序和服务
启动守护式容器:
docker run -d IMAGE [COMMOND] [ARG...]
-d
让容器在后台运行
后台运行任务:
docker run -d --name d1 ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done;" b89b9ce64d34bd202a642c8190428f4776f15e882f138949259722f22120201a
返回了一个守护进程的惟一ID。
查看守护进程的运行状况:
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b89b9ce64d34 ubuntu "/bin/sh -c 'while tr" 3 minutes ago Up 3 minutes d1 [root@localhost ~]# docker logs -f b89b9ce64d34 hello world hello world hello world hello world hello world [root@localhost ~]# docker logs -f -t --tail 2 b89b9ce64d34 2016-06-26T10:13:19.786516589Z hello world 2016-06-26T10:13:20.788871572Z hello world 2016-06-26T10:13:21.791921389Z hello world [root@localhost ~]# docker top b89b9ce64d34 UID PID PPID C STIME TTY TIME CMD root 4156 4148 0 06:05 ? 00:00:00 /bin/sh -c while true;do echo hello world;sleep 1;done; root 4850 4156 0 06:16 ? 00:00:00 sleep 1
docker logs [-f] [-t] [--tail] 容器名或id 查看容器内WEB应用程序日志
-f --follow=true|false
,默认false,一直跟随log变化
-t --timestamps=true|false
,默认false,加上时间戳
--tail="all"
,返回最新多少条日志
在运行的容器中启动新的进程:
docker exec [-d] [-i] [-t] 容器名 [COMMOND] [ARG...]
中止守护式进程:
docker stop 容器名 发送中止信号,等待关闭 docker kill 容器名 直接关闭容器
docker run -d -p 80 -i -t ubuntu /bin/bash 主机端口随机 docker run -d -p 8080:80 -i -t ubuntu /bin/bash 主机端口自定义 docker run -d -p 0.0.0.0:80 -i -t ubuntu /bin/bash docker run -d -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash
-P --publish-all=true|false
,默认false
-p --publish=[]
,自定义端口,将容器内部使用的网络端口映射到咱们使用的主机上
docker run -d -P training/webapp python app.py 后台运行一个容器应用 docker run -d -p 5000:5000 training/webapp python app.py 容器内部的 5000 端口映射到咱们本地主机的 5000 端口上
docker port 容器id 查看到容器的端口映射
Nginx部署示例:
# 建立映射端口为80的交互式界面: docker run -p 80 --name web -i -t ubuntu /bin/bash # 第一次使用更新源 apt-get update # 安装nginx apt-get install nginx # 安装vim apt-get install vim whereis nginx nginx: /usr/sbin/nginx /etc/nginx /usr/share/nginx vim /etc/nginx/conf.d/localhost.conf
发现配置文件在/etc/nginx/conf.d下面:
conf.d/localhost.conf
server { listen 80; server_name localhost; location / { root /var/www/; index index.html index.htm; } }
新建个目录:
mkdir -p /var/www/ vim /var/www/index.html
内容随便写。
# 启动nginx nginx
使用Crtl+P(即Crtl+shift+p)退出容器,并后台运行。查看:
[root@localhost ~]# docker port web 80/tcp -> 0.0.0.0:32769 [root@localhost ~]# docker top web UID PID PPID C STIME TTY TIME CMD root 12123 12113 0 07:14 pts/2 00:00:00 /bin/bash root 12159 12123 0 07:14 ? 00:00:00 nginx: master process nginx 33 12160 12159 0 07:14 ? 00:00:00 nginx: worker process [root@localhost ~]# curl http://127.0.0.1:32769
正常的话会显示网页内容。
若是exit退出了容器,想开启nginx服务,还能够:
docker start web docker exec web nginx
docker search [-s] IMAGE
docker pull [OPTIONS] NAME[:TAG|@DIGEST] [root@bogon ~]# docker pull ubuntu:16.04 [root@bogon ~]# docker pull daocloud.io/library/ubuntu:16.04
下载镜像名称其实由三部分组成:daocloud.io/library/ubuntu:16.04
其中其中daocloud.io是注册服务器地址,默认是 registry.hub.docker.com;ubuntu是仓库名,16.04是标签名,默认是latest。
docker images [-a] [root@bogon ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE daocloud.io/library/ubuntu 16.04 12543ced0f6f 2 weeks ago 122.4 MB ubutun latest 12543ced0f6f 2 weeks ago 122.4 MB daocloud.io/daocloud/dao-2048 latest 6c1ff658e77e 3 months ago 7.598 MB daocloud.io/daocloud/alpine latest e9f3e32a4303 3 months ago 11.52 MB daocloud.io/library/centos 7.1.1503 fac97c5c4748 8 months ago 212.1 MB daocloud.io/daocloud/dao-redis master-init 173a30377d85 13 months ago 190.4 MB
docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG] [root@bogon ~]# docker tag daocloud.io/library/ubuntu:16.04 ubuntu:latest
docker rmi [OPTIONS] IMAGE [IMAGE...] # 按标签删除:多个标签,仅会删除当前标签,不会删除镜像 [root@bogon ~]# docker rmi ubuntu:latest # 按ID删除:直接删除镜像 [root@bogon ~]# docker rmi 12543ced0f6f
选项:
-f, --force
强制删除镜像
--no-prune
不删除untagged parents
docker save [OPTIONS] IMAGE [IMAGE...] [root@bogon ~]# docker save -o ubuntu_latest.tar ubuntu:latest [root@bogon ~]# ls -l -rw-r--r--. 1 root root 128086528 Jun 28 12:39 ubuntu_latest.tar
选项:
-o, --output
写入到文件
docker load --input ubuntu_latest.tar # 或者 docker load < ubuntu_latest.tar
选项:
-i, --input
从压缩包载入镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
选项:
--disable-content-trust=true
跳过镜像签名
仓库是集中存放镜像的地方。官方提供的公共仓库是https://hub.docker.com。不用注册便可使用里面的众多仓库资源,包含了经常使用的ubuntu、centos、php、nginx、mysql等仓库。
因为国外仓库访问比较慢,可使用国内的仓库,通常须要注册,使用docker pull的时候须要指明注册服务器地址。
DaoCloud https://www.daocloud.io/
阿里云 https://dev.aliyun.com/search.html?spm=5176.775974865.0.0.Iot0iJ
网易蜂巢 https://c.163.com/
示例:
docker pull registry.aliyuncs.com/acs-sample/mysql
其中registry.aliyuncs.com
是注册服务器地址,acs-sample/mysql
是仓库名,全部者是acs-sample
,没有指定镜像标签,则默认是latest
。
根据所存储的镜像公开分享与否,Docker仓库能够分为公开仓库(Public)和私有仓库(Private)两种形式。
在使用容器的过程当中,咱们可能须要共享数据:
共享本地主机数据到容器;
共享容器数据到另外一个容器。
Docker里的数据卷及数据卷容器刚好知足了这个需求。
数据卷(Data Volumes)是一个可供容器使用的特殊目录,它提供了不少有用的特性:
对数据卷的修改会立马生效
数据卷会一直存在,直到没有容器使用
数据卷能够被多个容器使用
数据卷相似于Linux的mount。
建立或运行容器的时候,使用-v
建立一个数据卷,屡次使用-v
能够建立多个数据卷。
docker run -d -P --name test1 -v /data1 ubuntu # 挂载本地已有目录到容器中 docker run -d -P --name test2 -v /tmp/data2:/data2 ubuntu # 挂载本地已有目录到容器中,指定只读 docker run -d -P --name test3 -v /tmp/data3:/data3:ro ubuntu
挂载的数据卷默认权限是读写rw
。
数据卷容器(Data Volume Dontainers)其实就是一个普通的容器,只是咱们专门用它提供数据卷供其它容器挂载使用。
建立数据库容器很简单,建立一个普通容器就好了:
docker run --name db1 -v /data ubuntu
其余容器使用该数据卷容器:
docker run -it --name test4 --volumes-from db1 ubuntu
使用--volumes-from
指定数据卷容器。多个--volumes-from
将挂载多个数据卷容器。
注意:使用--volumes-from
参数所挂载的数据卷容器自己并不须要保持运行状态。若是删除了挂载的容器,数据卷并不会被自动删除,若是要删除一个数据卷,必需使用docker rm -v
命令来指定同时删除管联的容器。
(未完待续)
原文发表在:Docker学习笔记 - 飞鸿影~ - 博客园
http://www.cnblogs.com/52fhy/p/5638571.html