Docker

0 发展

虚拟机:就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。 但由于资源占用多,启动慢等缺点,因此发展了Linux容器。

Linux容器(LXC):是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。不是模拟一个完整的操作系统,而是对进程进行隔离。容器可以将软件运行需要的资源全部打包到一个隔离的容器中。容器与虚拟机不一样,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。
在这里插入图片描述
总结Docker是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而虚拟机是在硬件层面上实现虚拟化,因此Docker的优势体现为启动快、占用体积小。
Docker 与传统虚拟化对比

  • 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
  • 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
    在这里插入图片描述

Docker作用:消除协同合作编码时,环境不一致问题。不仅是源代码,而且把原始开发环境一模一样的复制过来。解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。

1 基本概念

Docker镜像(Image):一种轻量级、可执行的独立软件包,包含运行某个软件所需的全部内容。一个只读的模板,一个镜像可以创建很多容器。类似于Java类,可以创建很多个实例对象。
容器:一个容器运行一种服务,是镜像运行的实体。可以把容器看做一个简易版的Linux环境和运行在其中的应用程序。类似Java对象。
仓库(Repository):存放镜像的地方。

2 Docker安装

centos 7 64位,内核 3.8 版本以上

uname -r # 查看内核
cat /etc/redhat-release # 查看Linux版本

#  1.若之前安装,先卸载旧版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
 # 2.yum安装gcc
 yum -y install gcc
 yum -y install gcc-c++

# 3.Most users set up Docker’s repositories and install from them, for ease of installation and upgrade tasks. This is the recommended approach.
yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 用国内镜像

# 4.更新yum软件包索引 [可选]
yum makecache fast

# 5安装最新版的docker engine
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 6启动docker
systemctl start docker # systemctl stop docker

# 7 验证docker安装成功
docker version
docker run hello-world

配置镜像加速器[可选]

sudo mkdir -p /etc/docker


sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF

or
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF

or 
"http://hub-mirror.c.163.com

#  重新加载某个服务的配置文件,如果新安装了一个服务,归属于 systemctl 管理,要是新服务的服务程序配置文件生效,需重新加载。
sudo systemctl daemon-reload
sudo systemctl restart docker
# 8. 彻底卸载!!!!
sudo yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin 
	
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

3 Docker常用命令

3.1 帮助启动类命令
  • 启动docker: systemctl start docker
  • 停止docker: systemctl stop docker
  • 重启docker: systemctl restart docker
  • 查看docker状态: systemctl status docker
  • 开机启动: systemctl enable docker
  • 查看docker概要信息: docker info
  • 查看docker全部命令帮助文档: docker --help
  • 查看docker具体命令帮助文档: docker 具体命令 --help
3.2 镜像命令
  • 列出本地主机上的镜像:docker images
    -a :列出本地所有的镜像(含历史映像层)
    -q :只显示镜像ID。
  • 在仓库中搜索xxx镜像:docker search xxx
    –limit N: 只列出N个镜像,默认25个
  • 在仓库中拉取xxx镜像到本地:docker pull xxx [:TAG] 例如,docker pull redis:6.0.8,默认是:latest
  • 查看镜像/容器/数据卷所占的空间:docker system df
  • 删除镜像:·docker rmi 某个XXX镜像名字 或者 ID
    强制删除:-f
    删除多个:·docker rmi -f image1:TAG image2:TAG
    删除全部:·docker rmi -f $(docker images -qa)
  • 构建镜像:docker build -t 镜像名 Dockerfile所在目录docker build -t ubuntu:v1 .
3.3 容器命令

有镜像才能创建容器。

  • 新建、启动容器:docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
    –name=“容器新名字” 为容器指定一个名称;
    -d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
    -i:交互模式运行容器,通常-i -t同时使用,即-it
    -t:为容器重新分配一个伪输入终端 docker run -it ubuntu /bin/bashdocker run -it ubuntu /bin/sh
    -P:随机端口映射
    -p:指定端口映射 6379:666 docker的6379端口映射到内部的666端口

  • 列出正在运行的容器: docker ps [options]
    -a:列出所有正在运行的容器和历史运行过的
    -l:显示最近创建的容器
    -n:显示最近创建的n个容器
    -q:静默模式,只显示容器编号

  • 退出容器: run进去容器后,1. exit退出,容器停止; 2. ctrl+p+q退出,容器不停止

  • 启动已经停止运行的容器:docker start 容器ID 或者 容器名

  • 重启容器:docker restart 容器ID 或者 容器名

  • 停止容器: docker stop 容器ID 或者 容器名

  • 强制停止容器:docker kill 容器ID 或者 容器名

  • 删除已停止的容器:docker rm 容器ID 或者 名字

  • 查看容器日志:docker logs 容器ID
    -f, --follow 跟踪实时日志
    –since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
    –tail string 从日志末尾显示多少行日志, 默认是all

  • 查看容器内运行的进程:docker top 容器ID

  • ·查看容器内部细节:docker inspect 容器ID

  • ·进入正在运行的容器并以命令行交互:·docker exec -it 容器ID /bin/bash
    exec与attach的区别:
    ①attach 直接进入容器启动命令的终端,不会启动新的进程 用exit退出,会导致容器的停止
    ②exec 是在容器中打开新的终端,并且可以启动新的进程 用exit退出,不会导致容器的停止(推荐这个)

  • 从容器内拷贝文件到主机上:·docker cp 容器ID:容器内路径 目的主机路径
    或者:docker cp 本地文件路径 ID全称:容器路径

  • 导入和导出容器
    export 导出容器的内容留作为一个tar归档文件[对应import命令] docker export 容器ID > 文件名.tar
    import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export命令] cat 文件名.tar | docker import -镜像用户/镜像名:镜像版本号

  • 提交容器副本使之成为一个新的镜像:Docker commit
    docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
    在这里插入图片描述

4 Docker镜像

是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。

4.1 Docker镜像是分层的

这种层级文件系统为UnionFS,镜像分层最大的一个好处就是共享资源,方便复制迁移,复用。比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像,同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

4.2 UnionFS(联合文件系统)

是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。UnionFS是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像

4.3 Docker镜像加载原理

bootfs(boot file system 引导文件系统):主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file system) :在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

因此,对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。
在这里插入图片描述

Docker镜像层都是只读的,容器层是可写的 当容器启动时,一个新的可写层被加载到镜像的顶部。 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

4.4 虚悬镜像(dangling image)

仓库名、标签都是<none>的镜像。构建时,或者强制删除运行时容器的镜像导致的。

  • 查看:docker image ls -f dangling=true
  • 删除:docker image prune
4.5 本地镜像发布到阿里云 并从阿里云下载

阿里云官网选择控制台,进入容器镜像服务,选择创建的个人实例,进入命名空间,创建命名空间;选择镜像仓库,在创建的的命名空间中创建镜像仓库。最后,创建的镜像仓库中有具体操作教程,按照流程操作即可。

4.6 搭建私有镜像库(暂无)
4.7 容器数据卷
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录   镜像名
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:[rw/ro]   镜像名 # 设置容器内可以读写/只读
 # 容器卷的继承如下
docker run -it  --privileged=true --volumes-from 父类的容器名  --name u2 ubuntu

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

  1. 数据卷可在容器之间共享或重用数据
  2. 卷中的更改可以直接实时生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止
  5. 容器卷和主机是互通互联的,docker修改,主机同步获得;主机修改,docker同步获得;docker容器stop,主机修改,docker容器还是可以同步获得。

5 Dockerfile

5.1 Dockerfile定义

Dockerfile用来构建Docker镜像的文本文件,由一条条构建镜像所需的指令和参数构成的脚本。
Dockerfile文件语法:

  • 1:保留字指令必须为大写字母,且后面要跟随至少一个参数
  • 2:每条指令都会创建一个新的镜像层并对镜像进行提交
  • 3:#表示注释

Docker执行Dockerfile的大致流程:

  • (1)docker从基础镜像运行一个容器
  • (2)执行一条指令并对容器作出修改
  • (3)执行类似docker commit的操作提交一个新的镜像层
  • (4)docker再基于刚提交的镜像运行一个新容器
  • (5)执行dockerfile中的下一条指令直到所有指令都执行完成
5.2 Dockerfile常用保留字指令

FROM:基础镜像,指定一个已经存在的镜像作为模板,第一条必须是from。

MAINTAINER:镜像维护者的姓名和邮箱地址。

RUN:容器构建(build)时需要运行的命令(本地Linux中可用的命令)。①shell格式:RUN yum -y install vim 。 ②exec格式:RUN [‘可执行文件’,‘参数1’, ‘参数2’],例如,RUN [‘./test.php’, ‘dev’, ‘offline’]。

EXPOSE:当前容器对外暴露出的端口。

WORKDIR:·指定在创建容器后,终端登陆进来后的默认工作目录,比如linux默认工作目录为~。

USER:指定该镜像以什么样的用户去执行,不指定默认root。

ENV:用来在构建镜像过程中设置环境变量。定义:ENV MY_PATH /usr/mytest。引用:WORKDIR $MY_PATH

VOLUME:容器数据卷,用于数据保存和持久化工作。但是无法指定主机上对应的目录,自动生成。

COPY:拷贝文件和目录到镜像中。 COPY src dest。dest路径不存在的话,会自动创建。

ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包。

CMD:指定容器启动(run)后的要干的事情。①shell格式:CMD yum -y install vim 。 ②exec格式:CMD [‘可执行文件’,‘参数1’, ‘参数2’],例如,CMD [‘./test.php’, ‘dev’, ‘offline’]。③参数列表格式:CMD [‘参数1’, ‘参数2’],在指定ENTRYPOINT指令,用CMD指定具体的参数。

  • ·Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效。如果执行docker run -it -p 8080:8080 tomcat /bin/bash,那么/bin/bash生效,原dockerfile中的CMD将不会生效。

ENTRYPOINT:·也是指定一个容器启动后要运行的命令。但是,ENTRYPOINT不会被docker run后面的命令覆盖, 而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

6 Docker Network

6.1 docker网络常用命令

查看网络:docker network ls
查看网络源数据:docker network inspect 网络名字
删除网络:docker network rm 网络名字

6.2 docker网络模式
bridge

为每个容器分配设置IP等,将容器连接到docker0虚拟网桥,默认模式。
每个容器都有自己的eth0与docker0上对应的veth匹配。
在这里插入图片描述

host

容器不会虚拟出自己的网卡和IP等,而是使用宿主机的IP和端口。
在这里插入图片描述

none

容器有独立的Network namespace,但没有进行任何网络设置,只有一个lo网卡,其它需要自己配置。

container

新创建的容器不会创建自己的网卡和IP,而是指定一个容器共享IP、端口范围等。当指定容器关闭后,新建容器的IP、网卡就没有了,只剩lo。
在这里插入图片描述

自定义网络模式——自动配置 容器名:IP 映射

自定义网络维护好了主机名和ip的对应关系。
通过自定义网络(默认bridge)docker network create xxx_network后,处于该网络下的容器就可以通过容器名称进行互相访问。比如spring容器访问mysql,直接设置mysql:3306。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值