Docker
- docker简介
- docker架构
- docker安装
- docker使用
- docker容器使用
- docker镜像使用
- docker容器连接
- docker实例
- docker安装Nginx
- docker安装PHP
- docker安装MYSQL
- docker安装Tomcat
- docker安装Python
- docker安装redis
- docker安装MongoDB
- docker安装Apache
- docker使用参考
- docker命令大全
- docker资源汇总
一 、 Docker简介
- Docker 是一个开源的应用容器引擎 , 基于GO语言并遵从Apache2.0 协议开源 。 Docker可以让开发者打包他们的应用的以及依赖包到一个轻量级 、 可移植性高的容器中 。 然后发布到任何流行的Linux 机器上 , 可以实现虚拟化 。
- 容器完全使用沙箱机制 , 相互之间没有任何接口(类似Iphone的app) , 更重要的是容器性能开销极低 。
- 学习前提:
- 学习Docketr 之前 , 你需要一定的Linux 基础
- Docker 的应用场景
- Web应用自动化打包和发布
- 自动化测试 、 持续集成 、 发布
- 在服务型环境中部署和调整数据库或其他的后台应用
- 从头编译后扩展现有的OpenShit 或Cloud Foundry 平台搭建自己的PaaS 环境 。
- Docker 的优点:
- 简化程序:
- Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的 任务,在Docker容器的处理下,只需要数秒就能完成。
- 避免选择恐惧症:
- 如果你有选择恐惧症,还是资深患者。Docker 帮你 打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。
- 节省开支:
- 一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
- 简化程序:
二 、 Docker 架构
- Docker使用 客户端、服务端(C/S)的架构模式 , 使用远程API来管理和创建Docket 容器
- Docker 容器通过Docker镜像来创建
- 容器和镜像的关系类似于java中对象和类的关系 。
- Docker中的概念:
名词 | 描述 |
---|---|
Docker 镜像 | Docker镜像是用于创建Docker容器的模板 |
Docker 容器 | 容器是独立运行的一个或一组应用 。 |
Docker 客户端 | Docker客户端通过命令行或者其他工具使用Docker API 与 Docker的守护进程进行通信 |
Docker主机 | 一个物理或者虚拟的机器用于执行Docker守护进程和容器 |
Docker仓库 | Docker仓库用来保存镜像 , 可以理解为代码控制中的代码仓库 |
Docker Machine | Docker Machine 是一个简化的Docker安装的命令行工具 , 通过一个简单的命令行即可在相应的平台上安装Docker |
三 、 Docker 安装
- WIN10专业版以下 Docker安装:
- Ubuntu Docker 安装
- CentOS Docker 安装:
- yum install -y docker-io
- sudo service docker start
- 测试docker服务
- MacOs Docker 安装:
四 、 添加镜像
- 鉴于国内网络的原因 , 在拉去镜像的时候会非常缓慢 , 我们可以访问国内的镜像的仓库来拉去镜像 。 , 这里我们使用网易的镜像仓库:http://hub-mirror.c.163.com。
在 /etc/docker/daemon.json文件中添加:
{ "registry-mirrors": ["http://hub-mirror.c.163.com"] }
五 、 docker 使用
- Docker hello world
- docker 允许你在容器内运行应用程序 , 使用docker run 命令来在容器内运行一个应用程序 并输出hello world。
- 参数解析:
- docker : docker 的二进制执行文件
- run : 与docker 组合 来运行容器内的镜像
- /bin/echo : 在镜像内运行的命令
- 以上命令的完整解释: 在docker中运行 Ubuntu:15.10 镜像 , 并在镜像内执行 /bin/echo “hello world”
- 运行交互式容器:
- 我们可以通过-i -t 实现docker对话能力:
2. 可以使用 exit 或Ctrl + D退出会话模式
3. 启动镜像(后台模式)
1. docker run -d ubuntu:15.10 /bin/sh -c “while true ; do echo hello world ; sleep 1 ; done;”
2. 使用ps 查看docker后台进程
3. 在后台启动镜像成功之后 , 返回一串字母+ 数字 , 这是启动的镜像的进程ID
1. 解析:
1. CONTAINER ID : 容器ID
2. NAMES : 自动分配的容器名称
3. 查看进程日志
4. 停止容器
1. docker stop 镜像进程ID| 容器自动为镜像进程分配的Name
2. docker 客户端
1. 输入docker 来查看docker客户端的所有命令:
2. 使用 docker common –help 查看某一命令具体的使用方法
3. 运行一个web 应用:
1. docker pull training/webapp # 拉取training/webapp镜像
2. docker run -d -P training/webapp python app.py
1. 说明: 运行一个 Python Flask 镜像来运行一个web应用。
2. 参数说明:
1. -d : 镜像在后台运行
2. -P : 将容器内部使用的端口映射到我们使用的主机上
3. 查看正在运行的web镜像进程:
1. 可以看到docker 中的Python Flask 框架使用了5000端口 , 并且将5000 端口欧映射到了主句32768端口上 , 可以使用浏览器访问该端口
2. 我们可以使用-p 参数来指定端口
3. 查看网络端口的快捷方式:
1. 除了在docker ps 中可以看到进程对应的端口之外 , 还可以 通过 docker port ID|名字 查看镜像占用的端口以及主机端口的映射情况
2. 查看日志:
1. docker logs -f ID|名字
1. 参数说明:
1. -f : 让docker像 tail -f一样来输出容器内部的标准输出
2. 查看 镜像内部进程
1. docker top ID|名字
2. 检查运行的镜像信息
1. docker inspect ID|名字 他会返回一个json 格式的数据 , 记录着该镜像的配置和状态信息
2. 容器内镜像的停止 、 重启 、 移除
1. docker stop ID|名字 //停止
2. docker start ID|名字 // 重启
3. docker rm ID|名字 // 移除容器内的应用
六 、 docker 镜像的使用
- 当运行容器中的应用时 , 需要提前获取该应用的镜像 , 如果本地没有这个镜像, 则会自动的从docker 中央仓库拉取镜像
- 列出本地镜像列表
- 选项说明
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
- 注意: 同一个镜像可以有多个不同的TAG , 代表镜像的不同版本 , 如果有不同版本的镜像 需要在使用时使用 REPOSITORY:TAG 来指定运行的镜像
- 选项说明
- 当运行一个本地不存在的镜像时, docker 会自动拉取资源, 后运行镜像 。 也可以通过docker pull 提前获取一个镜像
- 查找镜像
- 我们可以从docker-hub网站搜索镜像 , docker-hub 网址为 https://hub.docker.com/
- 我们也可以通过docker search 命令来搜索镜像 。
- 创建镜像:
- 当我们从docker镜像仓库中下载的镜像不能满足我们的需求时, 我们可以通过以下两种方式 对镜像进行更改 。
- 从已经创建的镜像中更新镜像 , 并且提交这个镜像 。
- 使用Dokcerfile 指令来创建一个新的镜像
- 当我们从docker镜像仓库中下载的镜像不能满足我们的需求时, 我们可以通过以下两种方式 对镜像进行更改 。
更新镜像
- 在运行的应用内执行 apt-get update
此时我们对应用进行了更新操作 , 我们可以通过docker commit 提交对应用的更新
runoob@runoob:~$ docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2 sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8
- 参数说明:
- -m : 提交的信息
- -a : 指定镜像作者
- e218edb10161 : 镜像ID
- runoob/ubuntu:v2: 指定要创建的镜像名
构建镜像:
可以使用docker bulid , 从零开始构建一个新的镜像 , 为此我们需要创建一个Dockerfile 文件 , 其中包含一组指令来告诉Docker 如何构建我们的镜像 。
runoob@runoob:~$ cat Dockerfile FROM centos:6.7 MAINTAINER Fisher "fisher@sudops.com" RUN /bin/echo 'root:123456' |chpasswd RUN useradd runoob RUN /bin/echo 'runoob:123456' |chpasswd RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local EXPOSE 22 EXPOSE 80 CMD /usr/sbin/sshd -D 每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。 第一条FROM,指定使用哪个镜像源 RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。 然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。 runoob@runoob:~$ docker build -t runoob/centos:6.7 . Sending build context to Docker daemon 17.92 kB Step 1 : FROM centos:6.7 ---> d95b5ca17cc3 Step 2 : MAINTAINER Fisher "fisher@sudops.com" ---> Using cache ---> 0c92299c6f03 Step 3 : RUN /bin/echo 'root:123456' |chpasswd ---> Using cache ---> 0397ce2fbd0a Step 4 : RUN useradd runoob 参数说明: -t :指定要创建的目标镜像名 . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径 使用docker images 查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec ......
七、 Docker 实例
- docker安装mysql
- docker pull mysql
- 参数说明:
- -p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。
- -v -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。
- -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。
- -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。
- -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
八 、 docker命令大全
- 容器生命周期管理
- run
- start /stop /restart
- kill
- rm
- pause /unpause
- create
- exec
- 容器操作
- ps
- inspect
- top
- attach
- events
- logs
- wait
- wait
- export
- port
- 容器rootfs命令
- commit
- cp
- diff
- 镜像仓库
- login
- pull
- search
- push
- 本地镜像管理
- images
- rmi
- tag
- build
- history
- save
- import
- info|version
- info
- version
九、 docker 资源
docker官网:http://www.docker.com
Docker windows入门:https://docs.docker.com/windows/
Docker Linux 入门:https://docs.docker.com/linux/
Docker mac 入门:https://docs.docker.com/mac/
Docker 用户指引:https://docs.docker.com/engine/userguide/
Docker 官方博客:http://blog.docker.com/
Docker Hub: https://hub.docker.com/
Docker开源: https://www.docker.com/open-source
Docker中文资源
Docker中文网站:https://www.docker-cn.com/
Docker安装手册:https://docs.docker-cn.com/engine/installation/
Docker 国内镜像
网易加速器:http://hub-mirror.c.163.com
官方中国加速器:https://registry.docker-cn.com
ustc的镜像:https://docker.mirrors.ustc.edu.cn
daocloud:https://www.daocloud.io/mirror#accelerator-doc(注册后使用)
遇到的问题及解决
无法开启docker服务:
解决:
- 进入/etc/docker目录 , 没有则创建
创建文件daemon.json 并写入内容
{"storage-driver": "devicemapper", "registry-mirrors": ["http://hub-mirror.c.163.com"]}