仅为个人学习笔记,内容更新中。。。
Docker 介绍
- 快速持续集成
- 服务弹性伸缩
- 部署简单,解放运维
- 节省机器资源
- 很多公司在生产环境大规模使用 docker
- IT 从业人员必备技能
- 开发
- 运维
- 测试
- 。。。
什么是 docker
Docker is the world's leading software containerization platform.
- Docker 公司开发,开源
- Docker CE 社区免费版
- Docker EE 企业收费版
- Docker Github 仓库
- Docker 是一个用来安装应用容器(应用本身,应用的依赖环境,例如 nginx、mysql)
- 可以把 hello world、网站、你想得到的应用程序 放到 Docker
- 跨平台
- Linux
- Windows
- macOS
Docker 和 Moby
Moby主要针对的人群是想要组装一个基于容器的系统的人,包括
- 想要定制化Docker构建的hacker
- 想要构建一个容器系统的系统工程师
- 想要将已经存在的容器系统适配到自己环境的 基础设施提供方
- 想要体验最新容器技术的容器爱好者
- 想要在不同系统中测试项目的开源开发者
- 任何对Docker内部原理与如何构建感兴趣的人
但对于如下人群,Moby并不适合:
- 寻求一种简单的在容器中运行应用程序的应用开发者。推荐使用Docker CE。
- 想要一个带有商业支持且开箱即用容器平台的企业IT与开发团队。推荐使用Docker EE。
- 任何对容器感兴趣并且寻求一种简单易学的方式的人。请访问docker.com吧。
前置知识
- 了解 Linux 基础命令
- 了解 Git 使用更好
- Docker 命令和 Git 命令很像
发展历史
- 2010 dotCloud PASS
- 2013 Docker 开源
- 2014.6 Docker 1.0
- 2014.7 C轮融资 $4000 万
- 2015.4 D轮融资 $9500 万
- 至今 Docker 18.x
docker 基本思想
一句话概括:类似于超轻量级的“虚拟机”
- 集装箱
- 标准化
- 运输方式
- 存储方式
- API 接口
- 隔离
Docker 解决了什么问题
第1个问题:我本地运行没问题啊!
一个应用如果需要正常的运行需要什么?例如一个 Java Web 应用:
- 底层操作系统
- JDK
- tomcat
- 程序代码
- 数据库
- 配置文件
- 。。。
任何一个环节的改变都可能导致程序的运行失败。
现在只需要把以上这些环节都放到 Docker 集装箱中去运行,集装箱可以放到任何地方,在任何机器的运行结果都是一致的。
Docker 解决了程序的运行环境不一致打来的问题。
第2个问题:系统好卡,哪个哥们儿又写死循环了?!
和别人共用服务器的时候发现我们的应用变慢了,各种原因。可能根本不是你的原因。Docker 的隔离性可以解决这个问题。Docker 可以限定容器使用的资源(CPU、内存、硬盘、网络等)。
问题3:双11来了,服务器撑不住了!
- 容器快速复制化
Docker 让快速扩展,弹性伸缩变得更简单了。
Docker 核心概念
- 镜像(集装箱)
- 仓库(超级码头)
- 容器(运行程序的地方)
Docker 运行程序的过程:
- 去仓库把镜像拉到本地
- 在本地把镜像运行起来
- 运行起来的镜像称之为容器
- Build 构建镜像
- Ship 运输镜像
- Run 运行镜像
Docker 镜像
镜像就是一系列文件,可以包括应用程序文件或是运行环境依赖文件等。 镜像的存储结构类似于 Linux 的联合文件系统(Union File System),一种分层的文件系统,可以将不同的文件目录挂到同一个虚拟文件系统下。
下面是镜像的存储格式:
- 镜像的每一层文件系统都是只读的,只有最上面的可改。
Docker 容器
容器的本质就是一个进程。
镜像是静止的,不运行;而容器相当于是镜像的拷贝品,用于运行。镜像是只读的,但是用户需要对镜像进行自定义,所以将自定义修改放到容器的最上层。当应用读取文件的时候从顶层开始查找,如果没有,才会查找下一层。
由于容器的顶层可以修改,而镜像不可以修改,这样就可以保证同一个镜像可以生成不同的容器,不同容器独立运行而且不会干扰。
Docker 仓库
构建镜像的目的也是为了在其他机器或者其他环境去运行我们的程序。如果只是本地运行就不需要构建镜像了。既然我们的目的是也需要在其他环境运行,那我们就需要把镜像传输到目的地。如何完成传输过程?Docker 提供了一个标准化的存储和传输:Docker 仓库。
- 先把镜像传输到 Docker 仓库
- 然后由目的地主机拉取仓库中的镜像
Docker 仓库地址
- hub.docker.com
- c.163.com
Docker 镜像、仓库、容器 运作关系
- docker deamon 守护进程
- 下载 docker 镜像
- 运行 docker 容器
- 和远端镜像仓库进行交互
- 。。。
- 通过客户端命令和 docker deamon 进行交互
- docker build
- docker pull
- docker run
- Registry
- 一个互联网 SASS 服务,提供公共镜像服务
安装 Docker 环境
docs.docker.com/ 官方指南,里面有详尽的各种操作系统 Docker 安装指南。
检查 Docker 环境
docker --version
Docker version 18.09.2, build 6247962
复制代码
或者 docker version
查看更多详细信息。
docker version
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:31 2019
OS/Arch: windows/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:13:06 2019
OS/Arch: linux/amd64
Experimental: false
复制代码
Hello World
第一个 Docker 镜像
先了解两个命令:
- docker pull [OPTIONS] NAME[:TAG]
- 作用:从 Docker 仓库拉取镜像到本地
NAME
用来指定要拉取的镜像名称[:TAG]
可选的,用来指定镜像的版本标签,不写就是:latest
,表示镜像的最新版本- [OPTIONS] 可选的,可以用来指定拉取相关的一些选项参数
- docker images [OPTIONS] [REPOSITORY][:TAG]
- 作用:查看本机都有哪些镜像
- [OPTIONS] 可选的选项参数
- [REPOSITORY][:TAG] 使用非常少,只有当本地的镜像非常多的时候用于筛选查看结果
接下来拉取第1个 Docker 镜像
docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:5f179596a7335398b805f036f7e8561b6f0e32cd30a32f5e19d17a3cda6cc33d
Status: Downloaded newer image for hello-world:latest
复制代码
然后查看本地镜像列表
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 4 months ago 1.84kB
复制代码
- REPOSITORY 镜像名称
- TAG 镜像标签
- IMAGE ID 镜像 id
- CREATED 创建时间
- SIZE 镜像大小
第1个 Docker 容器
- docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
- [OPTIONS] 可选参数
- IMAGE 镜像名称
- [:TAG] 可选的,镜像的版本标签
- [COMMAND] 可选的,由镜像执行的命令
- [ARG...] 为前面命令所依赖的参数
我们来运行刚才拉取到本地的 hello-world
镜像
docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
复制代码
一张图了解
docker pull
、docker run
的运作流程。
使用 nginx 镜像托管静态网站
实践前奏:
- 持久运行的容器
- 前台运行 & 后台运行
- 进入容器内部
常用命令
# 获取 image
docker pull
# 创建 image
docker build
# 删除 image
docker rmi 镜像id
# 列出 image
docker images
# 运行 container
docker run
# 列出正在运行的 container
docker ps
# 列出所有 container
docker ps
# 删除 container
docker rm 容器id
# 在 host 和 container 之间拷贝文件
docker cp
# 保存改动为新的 image
docker commit
docker run docker-image
# 查看本地 images 列表
docker images
docker run -p 8080:80 -d daocloud.io/nginx
# 查看当前正在运行的 container
docker ps
# 查看所有 container
docker ps -a
# 删除容器
docker rm 容器id
# 拷贝文件到容器
docker cp 文件路径 容器id://usr/share/nginx/html
# 停止 docker 容器
docker stop 容器id
# docker 对容器的改动都是临时的
# 如果需要保存需要提交更新
docker commit -m "提交日志" 容器id [image名称]
# 删除 image
docker rmi 镜像id
复制代码