Docker学习指南

初识docker

一、基本概念

开发过程中,会接触到三个环境:开发环境测试环境以及生产环境。以java项目为例,开发中使用 jdk8,而在测试中环境是 jdk7,难免会遇到bug
在这里插入图片描述
这种由环境引起的问题非常常见,最好的做法是将项目的运行环境全部移植给测试工程师。docker容器能够实现这一功能。
在这里插入图片描述
docker 是一个开源的应用容器引擎;
● 该容器是完全使用沙箱机制,相互隔离;
● 该容器性能开销极低。

小结:docker是一种容器技术,解决软件跨环境迁移的问题

二、安装 docker

开发环境为Ubuntu 16.04 LTS 64位系统,通过aptdocker官方源安装最新的Docker CE(Community Edition),即Docker社区版,是开发人员和小型团队的理想选择。

安装步骤如下:

● 由于 apt 官方库里的 docker 版本可能比较旧,所以先卸载可能存在的旧版本:

sudo apt-get remove docker docker-engine docker-ce docker.io

● 更新 apt 包索引:

sudo apt-get update

● 安装以下包以使 apt 可以通过 HTTPS 使用存储库(repository):

sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common

● 添加 Docker 官方的 GPG 密钥:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

● 使用下面的命令来设置 stable 存储库:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

● 再更新一下 apt 包索引:

sudo apt-get update

● 安装最新版本的 Docker CE

sudo apt-get install -y docker-ce

● 在生产系统上,可能会需要应该安装一个特定版本的Docker CE,而不是总是使用最新版本:

列出可用的版本:

apt-cache madison docker-ce

说明:选择要安装的特定版本,第二列是版本字符串,第三列是存储库名称,它指示包来自哪个存储库,以及扩展它的稳定性级别。要安装一个特定的版本,同时需要将版本字符串附加到包名中,并通过等号(=)分隔它们:

sudo apt-get install docker-ce=<VERSION>

验证 docker

● 查看 docker 服务是否启动:

systemctl status docker

● 若未启动,则启动 docker 服务:

sudo systemctl start docker

● 查看 docker 版本,验证是否安装成功:

sudo docker -v

● 经典的 hello world:

sudo docker run hello-world
三、docker 架构

在这里插入图片描述
配置 Docker 镜像加速器:

阿里云官网–>登录–>控制台–>产品与服务–>手动输入:镜像–>点击:容器镜像服务–>镜像加速器 [注:每个人的加速 url 是唯一的]
在这里插入图片描述

docker 命令

一、docker 服务相关命令

● 查看docker 服务状态(见上文)
● 启动docker 服务(见上文)
● 停止docker 服务:

sudo stop docker

● 重启docker 服务:

sudo restart docker

● 开机启动docker 服务:

systemctl enbale docker
二、docker 镜像相关命令

● 查看镜像

sudo docker images

在这里插入图片描述
第一个字段表示镜像名称(含有环境);第二个字段表示版本信息;第三个字段表示镜像的 id ;第四个字段表示创建时间;第五个字段表示镜像大小。

● 搜索镜像

sudo docker search redis

在这里插入图片描述

● 拉取镜像

sudo docker pull redis:3.2	//冒号后面紧接版本号,如果不写,默认拉取最新的,即 latest

如果并非需要下载 latest 的版本,如何去查询服务器上是否具体该版本,一般到 Docker Hub 寻找存在的版本。

● 删除镜像

sudo docker rmi ImageId(镜像对应的 id)

● 查看所有镜像 id

sudo docker images -q

● 删除所有镜像:(组合命令)

sudo docker  rmi `sudo docker images -q`	// 将获得的全部镜像的 id 作为参数
三、docker 容器相关命令

容器是通过镜像来创建的。

● 查看容器:

sudo docker ps	// 如果容器是通过 -it 参数进行创建并进入的,执行 exit 指令后退出了该容器,是查看不到的。
sudo docker ps -a // 无论容器关闭与否,都可以查看到

● 创建并启动容器:docker run + 参数

sudo docker run -i -t --name=demo1  centos:7 /bin/bash
sudo docker run -id --name=demo2 centos:7 

● 进入容器

sudo docker exec 参数 // 退出容器后,容器不会关闭

看到上述这些指令中参数,肯定会存有疑惑,现在对参数进行说明:
(1)-i:保持容器运行。通常与 -t同时使用。加入 -it 这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。
(2)-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。
(3)-d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。
(4)-it 创建的容器-般称为交互式容器-id 创建的容器一般称为守护式容器。
(5)--name:为创建的容器命名。

● 启动容器

sudo docker start 容器名称 

● 停止容器

sudo docker stop 容器名称 

● 删除容器:如果容器是运行状态则删除失败,需要停止容器才能删除

sudo docker rm 容器名称或者容器 id
sudo docker rm `sudo docker ps -aq`

● 查看容器信息

sudo docker inspect 容器名称

docker 容器的数据卷

一、数据卷概念及作用

思考:
(1) docker容器删除后,在容器中产生的数据还在吗?
(2) docker 容器和外部机器器可以直接交换文件吗?
(3)容器之间想要进行数据交换如何实现?
在这里插入图片描述

数据卷
● 数据卷是宿主机中的一个目录或文件;
● 当容器目录和数据目录绑定后,对方的修改会立即同步;
● 一个数据卷可以被多个容器同时挂载;
● 一个容器也可以挂载多个数据卷;

数据卷作用
● 容器数据持久化;
● 外部机器和容器间接通信;
● 容器之间数据交换;

二、配置数据卷命令

● 创建启动容器时,使用 -v 参数设置数据卷

sudo docker run ... -v  宿主机目录(文件):容器内目录(文件)...  
sudo docker run -it --name=c1 -v /root/data:/root/data_container centos:7 /bin/bash

注意:
(1)目录都要绝对路径;
(2)如果目录不存在,会自动创建;
(3)可以挂载多个数据卷;

一个数据卷可以被多个容器同时挂载案例:
在这里插入图片描述

sudo docker run -it --name=c3 -v /root/data:/root/data centos:7 /bin/bash
sudo docker run -it --name=c3 -v /root/data:/root/data centos:7 /bin/bash
操作c3中的内容,c4中查看,能够看到跟新后的文件
三、数据卷容器

思考:如何实现多容器进行数据交换
(1)多个容器挂载同一个数据卷
(2)数据卷容器
在这里插入图片描述
● 创建启动C3数据卷容器,使用 -v 参数 设置数据卷。C3要挂载数据卷

sudo docker run -it --name=c3 -v /volume centos:7 /bin/bash

● 创建启动C1 C2容器,使用 --volumes-from 参数 设置数据卷

sudo docker run -it --name=C1  --volumes-from C3 centos:7 /bin/bash
sudo docker run -it --name=C2  --volumes-from C3 centos:7 /bin/bash

数据卷小结

  1. 数据卷概念
    ● 宿主机的一个目录或文件 (需要通过 -v 对容器的某个目录文件进行映射)
  2. 数据卷作用
    ● 容器数据持久化
    ● 客户端和容器数据交换
    ● 容器间数据交换
  3. 数据卷容器
    ● 创建一个容器,挂载一个目录,让其他容器继承自该容器(–volume-from)
    ● 通过简单方式实现数据卷配置

docker 应用部署

一、MySQL部署

需求:docker 容器中部署 MySQL,并通过外部 MySQL客户端操作 MySQL Server

案例:实现步骤
(1)搜索MySQL镜像
(2)拉取MySQL镜像
(3)创建容器
(4)操作容器中的MySQL

在这里插入图片描述

● 搜索MySQL镜像

sudo docker search mysql

● 拉取MySQL镜像

sudo docker pull mysql:5.6

● 创建容器,设置端口映射、目录映射
在这里插入图片描述
● 进入容器,操作MySQL

sudo docker exec -it c_mysql /bin/bash // 进入容器,操作mysql
mysql -uroot -p // 登录mysql
show database; //
create database db1; // 创建数据库
...

● 使用外部机器链接容器中的MySQL

图形化客户端操作:
MySQL host address: 宿主机的ip
Usename:
Password: 
Port: 映射的端口 3307
二、Tomcat部署
三、Redis部署

dockerfile

一、docker镜像原理

思考:
(1)docker 镜像本质是什么?
(2)docker中一个 centos 镜像为什么只有200MB,而一个 centos 操作系统的 iso 文件却有几个G?
(3)docker中一个tomcat 镜像为什么有500MB,而一个 tomcat 安装包只有70多MB?

镜像的原理其实和 Linux 操作系统有关系,先来简单介绍一些 OS 相关知识:

回顾:
操作系统的组成部分:(docker 一般是基于linux安装)
  (1)进程调度子系统
  (2)进程通信子系统
  (3)内存管理子系统
  (4)设备管理子系统
  (5)文件管理子系统
  (6)网络通信子系统
  (7)作业控制子系统

Linux文件系统由 bootfsrootfs 两部分组成:
(1)bootfs:包含 bootloader(引导加载程序)和 kernel(内核)
(2)rootfsroot 文件系统,包含的就是典型 Linux 系统中的 /dev,
/proc,/bin,/etc 等标准目录和文件
(3)不同的 Linux 发行版,bootfs基本一样,而 rootfs 不同,如ubuntu,centos等
在这里插入图片描述
原理:
docker 镜像是由特殊的文件系统叠加而成;
● 最低端是 bootfs,并使用宿主机的 bootfs
● 第二层是 root 文件系统 rootfs,称为 base image
● 然后再往上可以叠加其他的镜像文件;
● 统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
●一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
●当从一个镜像启动容器时,docker会在最顶层加载一个读写文件系统作为容器。
在这里插入图片描述

所谓只读镜像,就是这些镜像都不能修改。如果需要改时,docker 在最顶层加载一个读写文件系统作为容器,在此容器上进行修改,得到一个新的镜像。

总的来说,分层的好处就是:方便复用

思考答案:
(1)docker 镜像本质是什么?
      是个分层文件系统。
(2)docker中一个 centos 镜像为什么只有200MB,而一个 centos 操作系统的 iso 文件却有几个G?
      Centos 的 iso 镜像文件包含 bootfsrootfs, 而 dockercentos 镜像复用操作系统的 bootfs, 只有 rootfs和其他镜像层。
(3)docker中一个tomcat 镜像为什么有500MB,而一个 tomcat 安装包只有70多MB?
      由于 docker 中镜像时分层的, tomact 虽然只有70MB,但是它需要依赖于父镜像(如 JDK镜像)和基础镜像,所有整个对外暴露的 tomact 镜像大小有 500MB。

制作镜像
(1)容器转为镜像

sudo docker commit 容器id  镜像名称:版本号 // 目录挂载的不生效
sudo docker save -o 压缩文件名称  镜像名称:版本号
sudo docker load -i  压缩文件名称

在这里插入图片描述

(2)通过dockfile 进行制作,详见案例。

二、dockerfile概念及作用

dockerfile 是一个文本文件,该文件包含了很多条指令,每一条指令构建一层,基于基础镜像就最终能够构建出一个新的镜像。
对于开发人员:可以为开发团队提供一个完全一致的开发环境;
对于测试人员:可以直接拿开发时所构建的镜像或者通过 dockerfile 文件构建一个新的镜像开始工作;
对于运维人员:在部署时,可以实现应用的无缝移植;
在这里插入图片描述
可以在docker hub官网查询 dockerfile。

三、dockerfile关键字
关键字作用备注
FROM指定父镜像指定dockerfile是基于哪个image构建的
MAINTAINER作者信息用来标明这个dockerfile是谁写的
LABEL标签用来标明dockerfile的标签可以使用Label代替Maintainer,最终都是在docker image基本信息中可以查看
RUN执行命令执行一段命令默认是/bin/bash格式:RUN command 或者RUN[“command”,“param1”,“param2”]
CMD容器启动命令提供启动容器时候的默认命令和ENTRYPOINT配合使用。格式CMD command param1 param2或者CMD[“command”,“param1”,“param2”]
ENTRYPOINT入口一般在制作一些执行就关闭的容器中会使用
COPY复制文件build的时候复制文件到image中
ADD添加文件build的时候添加文件到image中不仅仅局限于当前build上下文可以来源于远程服务
ENV环境变量指定build时候的环境变量可以在启动的容器的时候通过-e覆盖格式ENV name=value
ARG构建参数构建参数只在构建的时候使用的参数如果有ENV那么ENV的相同名字的值始终覆盖arg的参数
VOLUME数据卷指定build的image哪些目录可以启动的时候挂载到文件系统中启动容器的时候使用-V绑定格式VOLUME[“目录”]
VOLUME数据卷指定build的image哪些目录可以启动的时候挂载到文件系统中启动容器的时候使用-V绑定格式VOLUME[“目录”]
四、案例

在这里插入图片描述
实操步骤:

# 第一步: 编辑 dockerfile
FROM centos:7
MAINTAINER  xxx <xxx_yyy@163.com>

RUN yum install -y vim
WORKDIR /usr

cmd /bin/bash
# 第二步:通过build命令构建镜像
sudo docker build -f ./centos_dockerfile -t  别名:版本号 .

dockerfile 服务编排

一、服务编排概念

微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多 个实例,如果每个微服务都要手动启停维护的工作量会很大。

● 要从Dockerfile build image或者去dockerhub拉取image;
● 要创建多个container;
● 要管理这些container(启动停止删除);

服务编排:按照一定的业务规则批量管理容器

二、docker compose 概述

Docker Compose 是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。使用步骤:
(1)利用Dockerfile定义运行环境镜像
(2)使用docker-compose.yml定义组成应用的各服务
(3)运行docker-compose up启动应用
在这里插入图片描述
在这里插入图片描述

三、案例

docker 私有仓库

一、搭建私有仓库

Docker官方的 Docker hub是一 个用于管理公共镜像的仓库,我们可以从上面拉取镜像到本地,也可以把我们自己的镜像推送上去。但是,有时候我们的服务器无法访问互联网,或者你不希望将自己的镜像放到公网当中,那么我们就需要搭建自己的私有仓库来存储和管理自己的镜像。

在这里插入图片描述

二、上传镜像到私有仓库

在这里插入图片描述

三、从私有仓库拉取镜像
sudo docker pull 镜像名:版本

docker容器虚拟化与传统虚拟机比较

容器就是将软件打包成标准化单元,以用于开发、交付和部署。
● 容器镜像是轻量的、可执行的独立软件包,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
● 容器化软件在任何环境中都能够始终如一地运行。
● 容器赋予了软件独立性,使其免受外在环境差异的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。

相同:
● 容器和虚拟机具有相似的资源隔离和分配优势;
不同:
● 容器虚拟化的是操作系统,虚拟机虚拟化的是硬件;
● 传统虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统;

配合该笔记的资料可以联系作者邮箱:xsx_2018@yeah.net。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值