0%

虚拟化之docker使用文档

[TOC]

docker 是什么

  • docker 是一个基于镜像的应用容器引擎,它用于管理应用。
  • 如虚拟操作系统一般,docker虚拟了进程,将程序运行环境和操作系统剥离。虚拟操作系统的虚拟是在硬件上,docker的虚拟是相当于在操作系统上多了一层。
  • 有很多可以类比的,如JVM隔离了java程序和操作系统,实现了跨平台。又例如python的虚拟环境将程序执行环境和系统环境剥离。

docker优点

docker 解决的问题就是程序运行的环境问题,镜像一次创建,到处运行(因为有内核支持)

  • 并且极高的启动速度。
  • 和虚拟机相比,占用极少的io,磁盘资源。

虚拟化技术

沙箱

Sandboxie(又叫沙箱、沙盘)即是一个虚拟系统程序,允许你在沙盘环境中运行浏览器或其他程序,因此运行所产生的变化可以随后删除。它创造了一个类似沙盒的独立作业环境,在其内部运行的程序并不能对硬盘产生永久性的影响。其为一个独立的虚拟环境,可以用来测试不受信任的应用程序或上网行为。

例如:GreenBorder为IE和firefox构建了一个安全的虚拟执行环境。用户通过浏览器所作的任何写磁盘操作,都将重定向到一个特定的临时文件夹中。这样,即使网页中包含病毒,木马,广告等恶意程序,被强行安装后,也只是安装到了临时文件夹中,不会对用户pc造成危害。(这里的临时文件夹就是一个沙箱)。

LXC

Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。镜像包含了容器应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。

和虚拟化的区别

  • 虚拟化使得许多操作系统可同时在单个系统上运行。
  • 容器则可共享同一个操作系统内核,将应用进程与系统其他部分隔离开。

docker使用

Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。 Docker容器通过 Docker镜像来创建。容器(对象)与镜像(类)的关系类似于面向对象编程中的对象与类.。

Docker采用C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。客户端和服务端既可以运行在一个机器上,也可通过socket 或者RESTful API 来进行通信。Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。Docker客户端则为用户提供一系列可执行命令,用户用这些命令实现跟Docker daemon 交互。

Dockerfile

Dockerfile一般包含下面几个部分:

  • 基础镜像:以哪个镜像作为基础进行制作,用法是FROM 基础镜像名称
  • 维护者信息:需要写下该Dockerfile编写人的姓名或邮箱,用法是MANITAINER 名字/邮箱
  • 镜像操作命令:对基础镜像要进行的改造命令,比如安装新的软件,进行哪些特殊配置等,常见的是RUN 命令
  • 容器启动命令:当基于该镜像的容器启动时需要执行哪些命令,常见的是CMD 命令或ENTRYPOINT

编写 Dockerfile 常用指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 指定容器运行的用户
USER percy

# 指定后续命令的执行目录
WORKDIR /var/www/django

# 设置环境变量
ENV命令能够对容器内的环境变量进行设置

# 增加文件,COPY, ADD, add 会解包
ADD html.tar /var/www

# from
FROM指定基础镜像,是Dockerfile中必备指令,且必须放在第一个,镜像可指定为scratch,表示不以任何镜像为基础

Dockerfile golang代码示例

1
2
3
4
5
6
7
8
9
FROM registry.cn-zhangjiakou.aliyuncs.com/xiaoduoai/golang:1.13-pulsar2.41

WORKDIR /app

# 只需要将二进制文件放进镜像即可
ADD ./go-mod ./

# 容器启动的的指令
CMD ["./go-mod", "-path", "/etc/config/go-mod.toml"]

docker指令

1
2
3
4
docker --help

# 清除不用的镜像和缓存
docker system prune

镜像指令

1
2
3
4
5
6
7
8
9
# 从Dockerfile创建镜像
docker build -t ${repository}:${tag} -f Dockerfile basedir

# 登陆
docker login -u 用户名 -p 密码

# 镜像推拉
docker pull ubuntu:12.04
docker push ${repository}:${tag}

容器指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 创建容器
docker run -d --name container-name -p 0.0.0.0:9988:9977 repository:tag
-d: 后台运行,如果需要到后台看看的,需要指定
-it:交互式的
-p: 端口映射:宿主机端口9988映射到容器端口9977
-v: 目录映射, 例如`-v /var/log/xiaoduo:/var/log/xiaoduo`, 前面是宿主机的路径
-w: 指定容器的工作路径, 例如 `-w /app`
--net: 指定容器的网络模式

# 基本遵循规则是从宿主机映射到容器,默认是tcp,如果使用udp,比如5600,要记得在运行时或者yaml文件端口处比如写:5000/udp, 使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端口。

# 停止容器
docker stop container_id

# 删除容器
docker rm container_id

# 复制
## 从主机复制到容器
sudo docker cp host_path containerID:container_path

## 从容器复制到主机
sudo docker cp containerID:container_path host_path

# logs
docker logs -f --tail=20 configure-tb

启动 redis 容器

基本启动方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 镜像: redis:5.0.5。 或者国内镜像副本: daocloud.io/library/redis:latest

# 本地 6379 可能被占用了

# 关闭
docker stop myredis
docker rm -f myredis

# 直接启动
docker run -d --name myredis daocloud.io/library/redis:latest

# 持久化
docker run -d --name myredis daocloud.io/library/redis:latest --appendonly yes -v /docker/host/dir:/data

# 启动最简单的 redis 容器, 指定网络类型, 指定 redis 端口
docker run -d --net=host --name myredis -p 0.0.0.0:7379:7379 daocloud.io/library/redis:latest redis-server --port 7379
docker ps | grep myredis

# 使用这个容器
docker exec -it myredis redis-cli -p 7379

# 环境变量
export REDIS_URI=127.0.0.1:7379
指定配置文件

redis默认是没有配置的,需要手动加配置,然后后面加上配置。

从这里搞到配置文件:https://gitee.com/percyg/redis, 并修改对应的项

1
docker run -v /myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf --name myredis daocloud.io/library/redis:latest redis-server /usr/local/etc/redis/redis.conf

启动 mongo 容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 关闭
docker stop mymongo
docker rm -f mymongo

# 直接启动
docker run -d --name mymongo mongo

# 指定网络类型及端口
docker run -d --net=host --name mymongo -p 0.0.0.0:28017:28017 mongo --port 28017

# 使用
docker exec -it mymongo mongo --port 28017

# 设置环境变量
export MONGO_URI=mongodb://127.0.0.1:28017/

docker的网络类型

docker四种网络模式如下:

  • Bridge contauner 桥接式网络模式(默认)
  • Host(open) container 开放式网络模式,和宿主机共享网络
  • Container(join) container 联合挂载式网络模式,和其他容器共享网络
  • None(Close) container 封闭式网络模式,不为容器配置网络

可以通过docker network命令查看

1
docker network ls

bridge网络模式—默认

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上,所以有默认地址172.17.0.0/16的地址。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

Host类型

简介:与主机共享Network Namespace,–net=host, 容器IP、主机名与宿主机一致

docker-compose

1
2
3
4
5
6
7
8
9
10
# 方法一

# pip 安装
# 安装pip yum install python3-pip
pip3 install docker-compose

# 方法二
# 从github上下载docker-compose二进制文件安装
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

镜像

大小

  • 相同的基础镜像会被复用,减少文件占用
  • 镜像的大小就是每一层大小的累加

镜像系统

  • 首先需要区分Linux内核与Linux发行版
    • Linux内核是Linux操作系统的核心, 负责硬件管理, 比如管理内存、管理磁盘(文件系统)、管理CPU(进程)等等…
    • Linux发行版是在Linux内核的基础上添加了一些工具软件,比如图形界面、函数库、软件包管理系统等等…
  • Docker容器技术是基于Linux内核实现的, 它主要用到了两个内核模块
    • Namespace: 用于容器的隔离, 例如PID Namespace使得容器中的进程无法感知宿主机以及其他容器中的进程
    • Cgroups: 用于容器的资源控制, 比如限制容器所使用的内存大小或者CPU个数

容器的理解

  • 基础镜像是一个包含rootfs的镜像。Kernel启动后是需要把启动文件解压到rootfs上的,然后kernel找到init文件启动就可以得到一个Linux环境了,Docker做的事情就是模拟这个过程,让kernel给出一个独立的隔离环境。

参考

docker镜像仓库:https://hub.docker.com/explore/

极客学院:http://wiki.jikexueyuan.com/project/docker-technology-and-combat/

dockerfile: https://www.cnblogs.com/wangmo/p/6811321.html

docker run:http://dockone.io/article/152

使用国内镜像仓库:http://mirrors.ustc.edu.cn/help/dockerhub.html?spm=a2c4e.10696291.0.0.502219a4uycHwi&highlight=docker