avatar

目录
Docker

参考:imooc 《第一个docker化的java应用》

docker概念

服务弹性伸缩、部署简单、解放运维、节省机器资源

应用:京东、阿里、腾讯

docker历史

  • 2010 dotCloud PAAS
  • 2013 docker开源
  • 2014.6 Docker 1.0
  • 至今…

docker是什么

docker理解

docker思想

![屏幕快照 2018-12-18 下午11.15.41](20181218225336118/屏幕快照 2018-12-18 下午11.15.41.png)

  • 集装箱(解决零散问题、货物就是程序)
  • 标准化
    • 运输方式:由鲸鱼统一运输(超级码头)
    • 存储方式:不需关心应用存在哪,用docker管理/运行
    • api接口:执行同样的命令控制所有应用
  • 隔离:理解为虚拟机

docker解决了什么问题

  • 我本地运行没问题啊??(javaweb依赖:操作系统、jdk、tomcat、代码、配置文件)

    • docker把这些环境统统打包装箱
  • 系统好卡(内存不够、服务变慢、别的应用疯狂吃cpu)

    • docker隔离性:限定本应用的cpu\内存\硬盘,违规就杀掉自己
  • 双11来了,服务器撑不住

    • 一年就那么关键几天并发量特高、按最高标准准备服务器对平时是浪费,所以在节日前临时扩展机器,过节完把节点下线:运维工作量巨大
    • docker标准化:让快速扩展、弹性伸缩变得简单

docker技术

docker核心技术

核心词汇:

  • 镜像(集装箱)
  • 仓库(超级码头)
  • 容器(运行程序的地方)

用docker运行一个程序的过程:去仓库把镜像拉到本地,然后用一条命令把镜像运行起来,变成容器

核心词汇:

  • Build:构建镜像

  • Ship:运输镜像

  • Run:运行镜像(运行的镜像就是容器)

docker镜像

镜像(image)就是集装箱

镜像就是一系列的文件,它可以包括我们应用程序的文件,也可以包括应用环境的文件。Docker会把这些文件保存到本地,存储方式采用Linux中的联合文件系统的分层概念方式。

联合文件系统:将不同文件夹的内容挂在到同一层目录下

存储方式见下图:

![屏幕快照 2018-12-18 下午11.49.28](20181218225336118/屏幕快照 2018-12-18 下午11.49.28.png)

由下而上:

  1. 操作系统的引导
  2. 具体的Linux操作系统
  3. 相关软件:tomcat、jdk等
  4. 应用代码
  5. 顶层为可写层(属于容器)

docker镜像每一层(除了顶层容器)都是只读的,每一层加载完后,这些文件被看作同一个目录,相当于只有一个文件系统。

(参考其他文章:镜像可以用来创建Docker容器的。一个镜像可以包含一个完整的操作系统环境和用户需要的其它应用程序。在docker hub 里面有大量现成的镜像提供下载。docker的镜像是只可读的,一个镜像可以创建多个容器,每个容器之间相互不干扰。)

docker容器

  • 运行程序之地

  • 容器本质是一个进程,和虚拟机的理解相似

  • 最顶层容器为什么可写:程序运行起来,会写入日志文件等

  • 容器是镜像创建的实例。它可以被启动、开始、停止、删除。每个容器都是 相互隔离的、保证安全的平台。

docker仓库

1、镜像构建来干嘛?

​ 为了搬运到其他环境上运行

2、所以镜像如何传输?

​ 先把镜像从运输起点传到docker仓库,再由运输终点(目的地)去docker仓库拉镜像。仓库是集中存放镜像文件的场所

3、谁提供了docker仓库?

​ ~ docker自己 hub.docker.com(国内被墙|慢)

​ ~ 国内:https://c.163yun.com/hub#/m/home

​ ~ 这些仓库是别人提供好的,我们可以把镜像传过去

​ ~ 如果出于安全等因素考虑,docker支持自己搭建镜像中心(比如在内网搭建公司自己的docker仓库,类似于maven的理解)

docker实践

docker安装

版本说明:

  • CentOS Linux release 7.4.1708

docker是用ubunto开发的(支持好些)

在centos和redhat上安装docker

bash
1
2
3
4
5
# 启动docker
$ systemctl start docker.service

# 查看版本
$ docker version

docker体验hello world

第一个docker镜像

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# docker pull [OPTIONS] NAME[:TAG]
# docker images [OPTIONS] 查看本机所有镜像

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
# 默认从docker官网提供的仓库拉取镜像 hub.docker.com
$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 4ab4c602aa5e 3 months ago 1.84kB

第一个docker容器

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]

$ docker run hello-world
...
Hello from Docker!
This message shows that your installation appears to be working correctly.
# 一个docker容器运行起来经历的步骤
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.
...

图解执行流程:

![屏幕快照 2018-12-19 上午11.16.42](20181218225336118/屏幕快照 2018-12-19 上午11.16.42.png)

从左至右分别为 Client、Host、Registry。前两个属于本机,Registry在hello-world例子中相当于远程仓库,整个流程为:

  1. docker pull 过程

    • 先向 docker daemon(在Host中)发送拉取镜像请求
    • daemon先在本机查找是否由符合版本要求的镜像,如果有,则不会做其他操作;
      没有的话,daemon就去 Registry中查找,Registry返回相应镜像到本地。
  2. docker run 过程

    • 先向 docker daemon发送请求,镜像不存在则再执行一次 docker pull过程。

    • 然后通过一定方式把镜象变成容器

docker运行Nginx静态网站

运行nginx镜像

前奏

  • 持久运行的容器
  • 前台挂起 & 后台运行
  • 进入容器内部
bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ docker pull hub.c.163.com/library/nginx:latest
# 前台运行nginx
$ docker run hub.c.163.com/library/nginx
# 查看正在运行的docker容器
$ docker ps
$ docker run --help

# 后台运行
$ docker run -d hub.c.163.com/library/nginx
# 容器id
cbafcbc3b313ccabca6ee604fe5ae27d165cdbea50a27635894a8ad67c350406
# 进入容器
$ docker exec -it cba bash
# 退出容器
$ exit

docker网络

如何访问到nginx?

  • 网络类型:
    • Bridge(默认)
      bridge模式是Docker默认的网络设置,此模式会为每一个容器 分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。
    • Host
      不会创建独立的network namespace。Docker容器中的进程处于宿主机的网络环境中,相当于Docker容器和宿主机共同用一个network namespace,使用宿主机的网卡、IP和端口等信息。
      但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
    • None
      没有网络,Docker不会和外界进行通讯。Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
    • Container
      Container模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
    • 端口映射
      ​ 使容器的端口在主机上访问到,采用端口映射,Docker可以将容器里面的端口与主机的端口进行映射,这样就可以通过访问主机端口去访问容器端口。

![屏幕快照 2018-12-19 下午1.41.07](20181218225336118/屏幕快照 2018-12-19 下午1.41.07.png)


访问nginx

bash
1
2
3
4
5
6
7
# 默认桥接 端口映射
$ docker run -d -p 8080:80 hub.c.163.com/library/nginx
# 浏览器访问nginx
http://10.211.55.6:8080/

# -P : 开放容器内所有端口,并映射到容器外随机端口
$ docker run -d -P 8080:80 hub.c.163.com/library/nginx

docker运行java web应用

制作自己的镜像

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vi Dockerfile

-------------
//继承基础镜像,tomcat镜像包括了jdk
from hub.c.163.com/library/tomcat

//关于作者
MAINTAINER mxx hhdwwt@163.com

//项目代码(在本配置文件的当前路径)
COPY jpress.war /usr/local/tomcat/webapps

-------------

docker build -t jpress:latest .

运行自己的容器

Code
1
2
3
4
5
docker run -d -p 8888:8080 jpress

netstat -na|grep 8888
// 开放8888端口
10.211.55.6:8888/jpress
文章作者: Machine
文章链接: https://machine4869.gitee.io/2018/12/18/20181218225336118/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 哑舍
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论