目录

一、docker中的基本概念

1、什么是容器、镜像和仓库?

2、docker和虚拟机的区别?

3、docker的底层隔离机制? 

二、docker的安装和使用(CentOS Linux release 7.9.2009)

1、卸载旧的docker的版本(如果没装过的就不需要这一步了)

2、安装yum-utils包(提供yum-config-manager 实用程序)并设置稳定的存储库

3、安装 Docker 引擎

4、卸载

三、docker中的一些基本命令和问题

镜像的导入导出的方式

容器的三种状态:

创建一个服务和创建一个容器的区别?

容易出现的一些故障及解决方式

四、数据持久化-数据共享-volume

1、数据卷

五、容器的网络类型

前四种:

第五种:overly

六、镜像的制作

1、镜像的原理

2、dockerfile

指令详解

七、多容器之间的连接

--link 

常见文件的作用

八、compose

compose的好处:        1.快速批量启动容器,效率高        2.不容易出错,可靠

缺点:只能在一台宿主机上编排容器

安装


一、docker中的基本概念

1、什么是容器、镜像和仓库?

        容器(container)是一个标准的软件单元,运行镜像的地方、背后就是起到一个进程来运行镜像,docker就是一个容器管理的软件(平台)。

        镜像(image):镜像就是打包好的软件,程序代码、基础系统、依赖关系的软件包等等、西需要人去制作。

        仓库(repository):集中存放镜像的地方

2、docker和虚拟机的区别?

        容器和虚拟机具有相似的资源隔离和分配优势,但功能不同,因为容器虚拟化的是操作系统而不是硬件。容器更便携、更高效

        docker的优势:启动速度快、资源消耗小(资源可以控制、共用宿主机的内核,基础镜像消耗内存少)、扩展方便(HPA)

        docker的缺点:APP隔离这一块没有虚拟机彻底,层次不一样、虚拟机的的隔离级别是操作系统级的,而容器的隔离级别是进程级的,进程之间很容易通信

对比图

 

3、docker的底层隔离机制? 

 name space:命名空间

         Namespace是内核的一个功能。用来给进程隔离一系列(网络、进程、文件系统)系统资源的。

命名空间的种类:

  • 网络命名空间
  • IPC命名空间
  • 挂载命名空间
  • UTS命名空间
  • 用户命名空间

control groups:对资源进行限制,例如CPU、内存、磁盘等等。

        最初叫process groups ,顾名思义,就是将进程放到一个组里进行统一控制,后改名control groups(cgroups是它的缩写),它为资源管理提供了一个统一的框架

二、docker的安装和使用(CentOS Linux release 7.9.2009)

1、卸载旧的docker的版本(如果没装过的就不需要这一步了)

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2、安装yum-utils包(提供yum-config-manager 实用程序)并设置稳定的存储库

yum install -y yum-utils
#这是官方的源
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
#国内源,速度快一点
yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3、安装 Docker 引擎

yum install docker-ce docker-ce-cli containerd.io

到这一步,你的docker已经安装完成了,但是你还需要启动自己启动docker,并且可以试着运行一个命令

#启动docker
systemctl start docker
#设置开机自启动
systemctl enable docker
systemctl enable containerd
#运行一个hello-world 试试
docker run hello-world

4、卸载

#卸载 Docker 引擎、CLI 和 Containerd 软件包
yum remove docker-ce docker-ce-cli containerd.io
#主机上的映像、容器、卷或自定义配置文件不会自动删除。要删除所有映像、容器和卷
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

三、docker中的一些基本命令和问题

#查看docker的版本
docker version

#查看你在docker中下载了哪些镜像
docker images

#搜索镜像(nginx)可以从哪里拉取
docker search nginx

#拉取镜像
docker pull nginx

#查看有哪些容器正在运行
docker ps

#查看详细信息(容器、网络、volume)
docker network inspect bridge
docker container inspect nginx
#查看网络类型
docker network ls

#开起或者停止和删除一个镜像
docker stop(start、rmi) 

#运行一个容器  -d(表示后台运行) -p(端口映射) --name(容器的名字) 最后接要使用的镜像
#--cpu-share 限制容器可以使用的的CPU,-m(限制容器可以使用的内存资源,单位byte),如果一个容超出了限制,会被docker软件重启
docker run -d -p 80:80 --name --cpu-shares 30 -m 1000000 chen-nginx nginx

#查看容器启动的过程中的日志,排错使用
docker logs

#查看容器的节点
docker node ls 

#创建一个服务
docker create service

# 查看容器内部的进程,后接容器名
docker top 

#进入容器,运行bash程序 -i(interactive) 交互式方式进入容器 -t(tty) 开启一个终端,exit(退出容器),进入容器很多命令不能使用是因为没有安装
docker exec -it chen-nginx /bin/bash

镜像的导入导出的方式

#导出镜像,压缩打包成nginx.tar文件
docker save -o nginx.tar nginx 
# 导入镜像
docker laod -i nginx.tar

#动态导出一个正在运行的镜像
docker export -o nginx.tar my_nginx
# 导入一个正在运行的镜像
docket import nginx.tar


#docker commit :从容器创建一个新的镜像
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停

docker commit -a "runoob.com" -m "my apache" a404c6c174a2  mymysql:v1 

容器的三种状态

  •        up
  •        created
  •        exited

创建一个服务和创建一个容器的区别?

        使用run命令创建一个container,是为单主机的解决方案构建的,一次只能创建一个容器,

没有扩大/缩小的概念

        而使用docker create service 创建服务主要是用于swarm集群中,使用--replicas()可以一次

创建很多的副本,也就是多个服务,而且使用docker create service 创建服务还有一个好处就

是当其中容器出现问题之后它会自动帮我们重新创建容器,保持副本的数量,而docker run 就没有

这个功能

        在需要创建多个服务的(群组模式下)使用docker create service ,单主机模式使用 docker run

容易出现的一些故障及解决方式

连接不到容器:有可能是网络问题导致的,虚拟机挂起之后再开最好重启一下docker服务

容器上不了网:查看一下是否打开了路由功能 

#临时开起路由功能
echo 1 >/proc/sys/net/ipv4/ip_forward
#永久开起
vim /etc/sysctl.conf
末行添加net.ipv4.ip_forward=1

docker logs chen-nginx :查看日志,启动不了的原因

四、数据持久化-数据共享-volume

正常停止容器,容器里的数据不会丢失,会保存在 /var/lib/docker/volumes/文件下

修改了容器对应的配置文件通过重容器来使配置文件生效

1、数据卷

卷是保存由 Docker 容器生成和使用的数据的首选机制

实现容器和宿主机之间共享数据

卷比绑定挂载更容易备份或迁移

 创建和管理卷

#创建卷
docker volume create my-vol

#查看卷
docker volume ls

#查看卷的详细信息
docker volume inspect my-vol

#删除卷
docker volume rm my-vol

卷的使用

一般有两种方式  -v 和  --mount

#第一种
docker run -d \
  --name devtest \
  -v my_vol:/app \
  nginx:latest

#第二种
docker run -d \
  --name devtest \
  --mount source=my_vol,target=/app \
  nginx:latest

使用卷来启动服务

docker service create -d \
  --replicas=4 \
  --name devtest-service \
  --mount source=my_vol,target=/app \
  nginx:latest

# 查看服务是否运行
docker service ps devtest-service

#删除服务将停止所有的任务,但是不会删除卷
docker service rm devtest-service


#运行这些示例中的任何一个后,运行以下命令来清理容器和卷。注意卷删除是一个单独的步骤
 docker container stop nginxtest #停止容器
 docker container rm nginxtest #删除容器
 docker volume rm nginx-vol # 删除卷


#删除所有卷
docker volume prune

五、容器的网络类型

所有容器上网都需要经过有宿主机,底层使用的是iptables 的SNAT和DNAT

前四种:

  • bridge(桥接)
  • host:容器和宿主机共享ip地址,端口号要区别开
  • null模式:只有io接口,没有其他接口
  • container模式:很多容器共享一个IP地址(k8s)

以上四种模式,只是考虑宿主机和容器之间的通信,在同一台机器里

第五种:overly

overly网络用于连接不同机器上的docker容器,允许不同机器上的容器相互通信,同时支持对消

息进行加密,实现跨主机的docker容器之间的通信,底层原理是VXLAN

overly网络实际上是目前最主流的容器跨节点数据传输和路由方案

#namespace 命名空间: 一个隔离的空间,里面可以存放数据

#创建一个命名空间
docker network create --driver bridge sc

#创建一个容器使用新建的命名空间
docker run -it -d --name fan-centos-1 --network sc  centos:7


#不同命名空间的容器之间不能通信
#创建一个网络命名空间,相当于在宿主机里创建了一个接口,会配置ip地址

六、镜像的制作

1、镜像的原理

base镜像:提供的是最小安装的linux发行版

scratch:该镜像是一个空的镜像,可以用于构建busybox等超小镜像

bootfs:容器启动的时候需要的内容

分层的思想:镜像的层数可能会有很多,所有的镜像层会联合在一起组成一个统一的文件系统。

 copy-on-write

容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。

所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。

容器启动的时候,内核启动bootfs后直接将基础镜像加载,然后一层一层的加载--》自下而上
容器运行后访问文件的时候,从上而下,从可写层,一层一层往下访问

1.添加文件
在容器中创建文件时,新文件被添加到容器层中。

2.读取文件
在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,打开并读入内存。
3.修改文件
在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。
4.删除文件
在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。

2、dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明.

以制作一个nginx镜像为例:

#FROM命令就是指定基础镜像
FROM nginx

RUN echo 'we are running some # of cool things'
#RUN命令就是用于执行后面跟着的命令行命令,有两种形式
RUN <命令行命令>
RUN ["可执行文件", "参数1", "参数2"] 
RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

#Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大

构建镜像:docker build -t nginx:v3 .  点表示通过当前目录下的Dockerfile文件创建

指令详解

COPY:复制指令,从上下文目录中复制文件或者目录到容器里指定路径

ADD:ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似

  • ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
  • ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。

CMD:

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

  • CMD 在docker run 时运行。
  • RUN 是在 docker build。

WORKDIR-:切换当前执行的工作目录

ENTRYPOINT:

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序

ENV:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

VOLUME:指定容器挂载点到宿主机自动生成的目录或其他容器

七、多容器之间的连接

--link 

docker run -d -p 7702:80 --name schello3  --link sc_redis:redis schello2
#sc_redis:redis  sc_redis是容器名 redis是hosts文件里的主机名

容器之间可以使用主机名访问

主动链接的容器绘制到被链接的容器的信息:ip和端口

在容器的hosts文件里添加名字对应的IP地址

e9b9c4a2077b3]# cat hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.10	redis add142e7eb43 sc_redis
172.17.0.11	3a43e6e2cdf0

常见文件的作用

  • config.v2.json 存放容器配置的数据
  • resolve.conf  容器里的dns服务器的地址使用的是宿主机里的dns的配置
  • hostname  存放主机名的
  • hosts  域名解析
  • var/lib/docker/containers 存放容器的目录

八、compose

        Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用Docker Compose不再需要使用shell脚本来启动容器。

        Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。

compose的好处:
        1.快速批量启动容器,效率高
        2.不容易出错,可靠

缺点:只能在一台宿主机上编排容器

安装

curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#对二进制文件授予可执行权限
chmod +x /usr/local/bin/docker-compose

测试

[root@localhost Dockerfile]# docker-compose --version
docker-compose version 1.29.2, build 5becea4c

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐