简单谈谈Docker

114 阅读11分钟

Docker

一、docker 基本概念

1.1 docker是什么

Docker 是一个用于开发、发布和运行应用程序的开放平台,通过利用 Docker 快速交付、测试和部署代码的方法,您可以显着减少编写代码和在生产环境中运行之间的延迟。隔离和安全性允许您在给定主机上同时运行多个容器。

  • 服务器是一种称为守护进程( dockerd命令)的长期运行程序。

  • 一个 REST API,它指定程序可以用来与守护进程对话并指示它做什么的接口。

  • 命令行界面 (CLI) 客户端(docker命令)。

    守护进程创建和管理Docker对象,例如镜像、容器、卷;

1.2 docker能干嘛

1.快速、一致的进行交付您的应用程序

2.响应式部署和扩展

1.3 docker架构

1.4 Docker的优缺点?

1.docker容器化:在docker环境中,要复制/启动/删除一个容器很简单,一行命令就可以。

2.兼容性:不需要在考虑操作系统,依赖环境的 影响,只要这个操作系统能够安装docker,那么对于容器来说都是ok的。因为各种依赖环境依赖与docker,不依赖于操作系统。

3.移植性:docker导入到处很方便,也可以上传到公共服务器上。

Docker 守护进程

Docker 守护程序 ( dockerd) 侦听 Docker API 请求并管理 Docker 对象,例如镜像、容器、网络和卷。

Docker 客户端

Docker 客户端 ( docker) 是许多 Docker 用户与 Docker 交互的主要方式。当您使用诸如docker run之类的命令时,客户端会将这些命令发送到守护进程执行它们。

Docker 注册表

当您使用docker pullordocker run命令时,将从您配置的注册表中提取所需的图像。当您使用该docker push命令时,您的图像会被推送到您配置的注册表中。

二、docker三要素

2.1 镜像:

镜像是一个只读模板,其中包含容器的说明;通常一个镜像基于另一个镜像进行创建的,并附带一些额外定义;这就有了分层概念,保持着镜像层之间的共享,所以镜像的磁盘空间远小于镜像的大小之和。Docker镜像通过联合文件系统将各层文件系统叠加到一起,用户看起来就像是一个文件系统。

通过docker history 镜像名 :进行查看镜像分了多少层

Docker 分层镜像有两个特性:一个已有的分层只能读不能修改,另外一个上层的镜像优先级高于下层镜像;

例如:B和C镜像都是基于A镜像进行构建的,所以B和C都可以看到A的文件内容,如果文件内容为“hello”,现在B想要进行修改文件内容,但是只在B才能看到修改之后的内容,C应该还是看到之前的数据,docker会在镜像B上层新建一个分层B·。这样只有B才能看到修改之后的文件内容,而C还是看到是之前的内容。

镜像相关命令

docker images:查看所有镜像

docker pull 镜像名称:获取镜像

docker search 镜像名称:搜索镜像

docker rmi 镜像名称:删除镜像名称

2.2容器:容器是镜像可运行的程序实例

容器相关的命令:

docker ps -a | grep 容器Id:查看容器的状态

docker start 容器id:启动容器

docker stop 容器id:停止容器

docker inspect 容器id:查询容器信息

docker logs -f 容器Id:查询日志

docker stats 容器Id:查看容器所占用的系统资源

docker exec +容器名+容器内执行命令:

docker inspect 容器名 |tail -n 20 :查看后20行

2.3 仓库:是集中存放镜像的地方

三、数据卷

3.1 卷是什么

卷就是目录或文件,存在一个或多个文件中。卷设计的目的就是数据的持久化,完全独立于容器的生命周期,因此容器的删除不会影响或删除其挂在的数据卷。将容器中的数据保存到宿主机的磁盘中。

命令:

docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1 ubuntu:12.04 :主机目录:docker目录

3.2 数据卷容器:多个容器中共享数据的一个容器

docker run -it -v /tmp/ubuntu1 --name u2 ubuntu:12.04

3.3 数据卷继承

docker run -it --volumes-from u3 --name u6 ubuntu:12.04

3.4 数据卷备份

先创建一个数据卷容器,进入容器中添加一个数据

docker run -it -v /opt --name test_1 centos:latest /bin/bash

echo "123321" > /opt/1.txt

docker run -it --volumes-from test_1 -v /mnt:/mnt centos:7 tar cvf /mnt/opt.tar /opt

#--volumes-from test_1 :指定数据卷容器所在 #-v /mnt:/mnt :共享该容器中mnt目录到主机的mnt #tar cvf /mnt/opt.tar /opt :这个较为绕,mnt是该容器跟主机之间共享的一个目录。所以将备份后的数据放到这个文件中,好备份之后直接导到主机。 /mnt/opt.tar /opt:/mnt/opt.tar: 压缩到主机下的目录 /opt :是docker容器中的目录

3.5 数据卷数据恢复

docker run -it -v /opt --name test_2 ubuntu:12.04 /bin/bash

docker run -itd --volumes-from test_2 -v /mnt:/mnt ubuntu:12.04 tar xvf /mnt/opt.tar -C /opt/

四、数据库主从同步

(130条消息) mysql在docker中实现主从复制_ChangeNone的博客-CSDN博客

set global sql_slave_skip_counter=1

五、Dockerfile

5.1 Dokerfile

Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfie快速创建自定义的镜像;

分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时命令

5.2 Dockerfile 关键字

1.FROM :基础镜像,当前镜像时基于哪个镜像

2.MAINTAINER:

3.RUN:容器构建时需要运行的命令,shell和exec

shell执行 RUN apk update exec执行 RUN ["executable", "param1", "param2"]

4:EXPOSE:指定于外界交互的端口

EXPOSE 8080

5.ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget

ADD hom* /mydir/ # 添加所有以"hom"开头的文件 ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt" ADD test relativeDir/ # 添加 "test" 到 WORKDIR/relativeDir/ ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/

6.COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源

7.CMD:构建镜像后调用,也就是在容器启动时才进行调用。

格式: ​ CMD ["executable","param1","param2"] (执行可执行文件,优先) ​ CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数) ​ CMD command param1 param2 (执行shell内部命令) 示例: ​ CMD echo "This is a test." | wc -l ​ CMD ["/usr/bin/wc","--help"]

注:CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。docker run -it -p 8080:8080 tomcat /bin/bash

8.ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。

格式: ​ ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先) ​ ENTRYPOINT command param1 param2 (shell内部命令) 示例: ​ FROM ubuntu ​ ENTRYPOINT ["ls", "/usr/local"] ​ CMD ["/usr/local/tomcat"] 之后,docker run 传递的参数,都会先覆盖cmd,然后由cmd 传递给entrypoint ,做到灵活应用

注:ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT, 而docker run命令中指定的任何参数,都会被当做参数再次传递给CMD;Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。通常情况下,ENTRYPOINT 与CMD一起使用,ENTRYPOINT 写默认命令,当需要参数时候使用CMD传参。

是否传参按照DOCKERFILE编写执行传参运行
Docker命令docker run nginx:testdocker run nginx:test -c /etc/nginx/new.conf
衍生出的实际命令nginx -c /etc/nginx/nginx.confnginx -c /etc/nginx/new.conf

9.ENV:设置环境变量

ENV myCat=fluffy

10.VOLUME:用于指定持久化目录(指定此目录可以被挂载出去)

VOLUME ["/data"]

11.WORKDIR:类似于cd命令

WORKDIR /a (这时工作目录为/a) WORKDIR b (这时工作目录为/a/b) WORKDIR c (这时工作目录为/a/b/c)

12.ARG:用于指定传递给构建运行时的变量(给dockerfile传参),相当于构建镜像时可以在外部为里面传参

ARG site

5.3 制作镜像

  • 如果有多个RUN,自上而下依次运行,每次运行都会形成新的层,建议&& 放入一行运行

  • 如果有多个CMD,只有最后一个运行

  • 如果有多个Entrypoint,只有最后一个运行

  • 如果CMD和entrypoint共存,只有entrypoint运行,且最后的CMD会当做entrypoint的参数。

docker build . #默认使用当前目录下Dockerfile

docker build . -f centosdockerfile #其他名称dockerfile,需要指定

docker build -f /path/to/a/Dockerfile . #递归目录下的dockerfile

docker build -t ghostwritten/app . #指定镜像名

docker build -t ghostwritten/app:1.0.2 -t ghostwritten/app:latest . #指定多个tag

Dockerfile文件中的每条指令会被独立执行,并会创建一个新镜像,Docker 会重用已生成的中间镜像,以加速docker build的构建速度,也可以通过--cache-from指定

docker build -t ghostwritten/app --cache-from 31f630c65071 .

docker build -t ghostwritten/app --no-cache . #不使用缓存

六、Docker 网络

6.1 虚拟机网络

lo:回环接口:表示主机的回坏地址,这个一般是用来测试一个网络程序,但又不想让局域网或外网的用户能够查看,只能在此台主机上运行和查看所用的网络接口。

eth0:以太网接口,eth0 表示第一块网卡

br-xxxx:命令列出的br-xxx的网桥一般是docker创建的

6.2 docker 网络命令

1.docker network ls:查看网路模式

2.docker network create aa_net :创建某网络模式

3.docker network rm aa_net:删除某网络模式

6.3网络的基本模式

网络模式简介
bridge为每个容器分配、设置Ip,并将容器链接到一个docker0虚拟网桥,默认为该模式
host容器不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的Ip
none容器有独立的Network nameSpace,但是没有对其进行任何网络设置,如分配Veth pair和网桥链接。

bridge

Docker 服务默认会创建一个docker0的网桥,该网桥网络的名称为docker0 ,它在内核层通过连通了其他物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络下。

Docker 使用Linux桥连接,在宿主机虚拟一个容器网桥,Docker启动一个容器会根据Docker网桥的网段分配给容器一个Ip地址,称为Container_ip ,同时Docker网桥是每个容器的默认网关,因为在同一宿主机内的容器接入同一网桥,这样容器之间就能通过容器的Container_Ip进行通信。

整个宿主机的网桥模式都是docker0 类似一个交换机有一堆接口,每个接口叫做veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此连通。

host

容器不会获得一个独立的Network Namespace ,而是和宿主机共用一个Network Namespace ,容器将不会虚拟出自己的网卡而是使用宿主机的Ip和端口。

none:

自定义网络:

创建网络文件:aa_network

七、Docker-Compose

7.1 docker-compose是什么?

Compose是管理多个docker容器组成的一个应用,需要定义一个YAML格式的配置文件,docker-compose.yml文件,写好多个容器之间的调用关系,然后只需要一个命令就可以进行启动、关闭这些容器。解决容器和容器之间快速编排。

7.2 docker-compose安装

安装docker-compose,运行命令:

curl -L "github.com/docker/comp…(unames)(uname -s)-(uname -m)" -o /usr/local/bin/docker-compose

给docker-compose执行权限,运行命令:

chmod +x /usr/local/bin/docker-compose

查看docker-compose 版本

docker-compose --version,

7.3 docker-compose的核心概念

docker-compose.yml :

服务+工程:

docker-compose使用三个步骤:

1:编写DockerFile文件定义各个微服务应用并构建出对应的镜像文件,

2:使用docker-compose.yml文件定义一个完整的业务单元,安排好整体应用中的各个服务器;

3:最后执行 docker-compose up 命令来启动并运行整个程序,完成一键部署。

Compose的常用命令:

docker-compose up:启动docker-compose服务

docker-compose up -d :启动服务并在后台运行

docker-compose down :停止并删除容器、网络、卷和镜像

docker-compose ps:查看当前docker-compose编排过的运行的所有容器

docker-compose config -q :检查配置,有问题才输出

docker-compose logs yml文件里面的服务Id :查看容器输出的日志