Docker&Docker命令学习

Docker&Docker命令学习

  1. Docker概述
    开发与运维之间的历史扯皮,导致开发与运维在代码的部署环境与配置不同,导致后续开发能够运行,但是运维部署就会产生问题。软件带环境安装,于是就产生了Docker.

Docker项目的目标是实现轻量级的操作系统虚拟化的解决方案,Docker的基础是Linux容器(LXC)等技术卷

传统虚拟化

Docker

虚拟机:每一个个虚拟机引用不仅仅包含应用、必要的依赖库以及二进制文件,还包含客户操作系统(可以理解为当前应用的操作系统)

Docker:Docker容器仅包含应用程序及其依赖项,它在主机操作系统上将用户空间当做孤立的容器角色对待运行,与其他容器共用一个内核。因此,它享有虚拟机的资源隔离和分配优势,同时具有更高的可移植性和效率。

容器是在操作系统层面上实现虚拟化,直接服用本地主机的操作系统,而传统方式则是在硬件层面上实现的。

Docker在任何地方开发、部署和运行任何应用
Docker是一款针对程序开发人员和系统管理员来开发、部署、运行应用的一款虚拟平台。Docker可以让你像使用集装箱一样快速的组合成应用,并且可以像运输标准集装箱一样,尽可能屏蔽代码层面的差异。Docker会尽可能的缩短从代码测试到产品部署的时间。

目标理念:Build,Ship and run anywhere

Docker组件

The Docker Engine:Docker Engine是一个基于虚拟化技术的轻量级并且功能强大的开源容器引擎管理工具,可以将不同的work flow组合起来构建你的应用
Docker Hub:可以分享和管理个人的images镜像的Saas服务
三个理念:容器、镜像、仓库

Docker的优势
快速交付应用程序

Docker帮助开发人员、系统管理人员、QA和版本控制工程师在一个生产环节中一起协同工作。制定了一套容器标准,这套容器标准能够使系统管理员更改容器的时候,程序员不需要关系容器的变化,从而专注自己的应用程序代码,从而隔离开发和管理,简化开发和部署
使应用的构建方式更为简单,可以快速迭代应用,并且可以可视化的来查看应用的细微更改。能够帮助组织里面的成员更好的理解一个应用从构建到运行的全过程
Docker是一个轻量级的容器,运行速度非常快,容器的启动时间只需要一秒钟,从而大大说减少了开发、测试和部署的时间,轻松部署和扩展
Docker容器可以运行在大多数的环境中,你可以再桌面环境、物理主机、虚拟主机再到数据中、私有或者公有云中部署
Docker可以多平台运行,可以很容易的迁移应用程序。如果需要可以非常简单的将应用程序从测试环境迁移到云或者从云迁移到测试环境。
Docker是一个轻量级的容器,可以再很短的时间内启动和关闭。需要的时候,可以快速启动多个容器引擎,在不需要的时候,可以关闭所有
Get higher density and run more workloads.

Docker容器本身不需要额外创建虚拟机管理系统,因此可以启动多套Docker容器,可以充分发挥主机服务器的物理资源,可以降低因为采购服务器而带来的额外成本。

快速构建,轻松管理

因为Docker轻便、快速的特性,可以让应用达到快速迭代的目的。每次小的变更,可以立马看到效果,而不用将若干个小的变更积攒到一定程度再执行变更,每次变更已小部分其实是一种非常安全的方式。
Docker
Docker解决了运行环境和配置文件软件容器,方便做持续继承并有助于整体发布的容器虚拟化技术。

Docker能干什么
虚拟机是带环境安装的一种解决方案。

缺点:

资源占用多
冗余步骤多
启动慢
Docker是利用了Linux容器技术(LXC技术),Linux不是模拟一个完整的操作系统,而是对进程进行隔离。

与传统虚拟机的不同:

传统虚拟技术是虚拟出一套硬件后,在其上运行一个操作系统,在该系统上再运行所需应用进程
容器内的应用进程直接运行于宿主的内核,容器没有自己的内核,也没有进行硬件虚拟,因此容器更为轻便
每个容器之间互相隔离,每个容器有自己的文件系统,容器之间不会相互影响,能区分计算资源
DevOps(开发自运维)
2. 镜像image
在Docker的术语中,一个只读层被称为一个镜像,一个镜像永久不会改变。

由于Docker使用一个统一文件系统,Docker进程认为整个文件系统是以读写方式进行挂载的,但是所有的变更都发生在顶层的可写层,而下层原始的只读镜像文件并未发生变化,由于镜像不可写,故镜像是无状态的。

2.1 父镜像
镜像层次

每一个镜像都可能依赖由一个或者多个下层的镜像组成的另一个镜像,则称为下层的镜像是上层镜像的父镜像

2.2 基础镜像
一个没有任何父镜像的镜像,称为基础镜像

2.3 镜像ID
所有镜像都是通过一个64位十六进制的字符串(内部是一个256bit的值)来标识的。为了简化使用,前面12个字符可以组成一个短ID,可以再命令行中使用,短ID存在一定的碰撞概率,故服务器总是返回长ID。

  1. Docker架构
    img

容器使用镜像创建的运行实例。可以把容器看作是一个简易版的Linux环境。

唯一区别是容器的最上层是可读可写的。

仓库集中存放镜像文件的场所。

Docker本身是一个容器运行载体或者称之为管理引擎,我们把应用程序和配置依赖打包好行程一个可以交付的运行环境,这个打包好的运行环境就是image镜像文件,只有通过这个镜像文件才能够生成Docker容器,image文件可以看做是容器的模板,Docker根据image文件生成容器的实例,同一个image文件,可以生成多个同时运行的容器实例

image文件生成的容器实例,本身也是一个文件,称为镜像文件
一个容器运行一种服务,当我们需要的时候,可以通过docker客户端创建一个对应的运行实例,即容器
仓库存放一堆镜像的地方,可以将镜像发布到仓库中,需要的时候从仓库中拉下来即可
安装的话可以参照官网步骤,只是在安装完成之后,修改阿里云的镜像库

– 阿里云镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF’
{
“registry-mirrors”: [“https://apwoss2m.mirror.aliyuncs.com”]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
4. Docker底层工作原理
4.1 Docker是怎么工作的?
Docker是一个client-server结构的系统,Docker系统进程运行在主机上,然后通过socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器,容器则为一个运行时环境,即前面所说的集装箱。

4.2 Docker为什么比VM快?
Docker有这比虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在CPU、内存利用率上docker将会在小路上有这明显的优势。
Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器的时候,docker不需要和虚拟机一样重新加载一个操作系统内核。为避免引寻、加载操作系统内核是个比较费时费资源的过程,当 新建一个虚拟机时,虚拟软件需要加载Guest OS,新建过程是分钟级别的,而docker直接利用宿主机的操作系统,省略了整个的返回过程,因此新建一个docker容器只需要几秒钟。
img

  1. Docker常用命令
    docker安装

具体参照官网:https://docs.docker.com/engine/install/centos/

docker安装

1.卸载之前的docker

$ sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine

2.安装工具类

yum install -y yum-utils

整理注意更换为阿里的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

4.启动docker

systemctl start docker

5.查看状态

systemctl status docker

6.更换阿里云加速(每个人不同,建议进入阿里云镜像中获取自己的)

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF’
{
“registry-mirrors”: [“https://apwoss2m.mirror.aliyuncs.com”]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
5.1 帮助命令
docker version:查看当前docker版本
docker --help:docker使用帮助命令
docker info:docker的详细信息
5.2 镜像命令
docker images:列出本地主机上的镜像
-a:列出所有的镜像
-q:列出镜像的主键ID
–digests:列出镜像的摘要信息
–no-trunc:显示完整的镜像信息
docker search [镜像名称]:查询某个镜像
-s:列出star数不小于指定值的镜像
–no-trunc:显示完整的镜像描述
–atuomated:只列出automated build类型的镜像自动构建
docker pull [镜像名称]:拉取某个镜像如果未指定版本,则自动拉取最新的版本
docker rmi [镜像名称|镜像ID]:删除某个镜像
-f:指定强制删除
docker rmi -f 镜像名1:Tag 镜像名2:Tag:表示删除多个镜像
docker rmi -f ${docker images -qa}:表示删除全部的镜像
5.3 容器的相关命令
docker pull centos: 拉取centos镜像
docker run [options] image: 对本地image则直接运行,如果没有的话从远处仓库拉
-d:后台运行容器
–name:指定名称
-P:随机端口,-p指定端口
-i:以交互模式启动
-t:为容器分配一个伪终端(-it配合使用)
docker ps: 查看运行的容器,-l表示上一个容器,-a表示当前和历史,-q只显示id
exit: 退出容器,停止镜像运行
ctrl+p+q:退出容器,不停止镜像
docker start [id]: 启动容器
docker stop [id]: 停止容器,会慢慢等待容器完全停止 实际调用exit推出当前需要停止的容器
docker kill [id]: 直接杀死容器,强制停止 实际调用kill直接杀死进程
docker rm [id]: 删除已经停止的容器
docker rm -f ${docker ps -q}: 删除所有的停止的容器
docker ps -a -q | xargs docker rm: 删除所有停止的容器
docker logs -f -t --tail [num日志条数] id: 表示查看当前的日志,-t加入时间戳,-f刷新日志,–tail尾部追加
docker top id: 查看当前容器的进程相关的性能分析数据
docker attach id: 进入当前运行的容器 这是直接操作运行的当前的容器,会因为执行exit命令而退出
docker exec id: 进入当前运行的容器,执行一个任务 这里操作的是当前运行的容器的副本,不会因为exit命令容器退出
docker exec id ls /展示当前目录下的内容
docker cp id:/filedir /localhostdir:将文件从容器中拷贝到本地
img

注意这里直接启动tomcat的话,需要修改webapps文件夹

rm -rf webapps
cp -r webapps.dist webapps
6. Docker镜像
Docker镜像

特点:一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行软件开发的软件。包括代码、云从事、库、环境变量、配置文件。

UnionFS联合文件系统

一种分层的、轻量级的文件系统,对文件系统的修改作为一次提交层层层叠加,是docker分层继承的基础斜体样式。

**Doker加载的原理:**bootfs+rootfs

bootfs:包括最基本命令,工具,程序库(内核来自宿主机)
rootfs:控制centos/ubntu等发行版本
基础镜像

Centos与Ubntu的Linux版本中,bootfs是否相同

相同

UnionFS联合文件系统的优点?

复用,共享资源

6.1 镜像操作
docker commit:提交容器副本,保存修改过后的容器,使之成为一个新的镜像

操作方法:当我们run一个容器之后,对容器内容进行了修改之后,可以保存此容器,作为一个新的镜像。

docker commit -m=“描述” -a=“作者" 容器id 镜像名称:[标签名]
7. Dockerfile
img

Dockerfile是Docker中用来构建镜像的脚本文件,类似于Linux中的shell脚本。

相关关键字

FROM:基于某个源头的创建
ENV:配置当前镜像的环境
EXPOSE:当前镜像启动之后向外暴露的端口
CMD:启动命令
7.1 容器卷
容器卷是为了Docker中数据持久化而产生的,容器之间,主机与容器之间,共享数据,相当于挂载的概念,可以使主机与容器内同步更新数据。

容器卷的两种使用方式

使用命令,在创建镜像的时候直接添加容器卷

docker run -it -v /主机绝对路径:/容器内相关目录路径 镜像名称 –注意默认是含有所有权限的

docker run -it -v /主机绝对路径:/容器内目录: ro 镜像名称 –注意这里设置了ro,即read only模式,即仅读取权限

在Dockerfile中编写,使用VOLUME指令

VOLUME["/file1","/file2","/file3"] –注意这里只支持容器内的目录,不支持主机目录(为了可移植性)

docker inspect Id; –可以直接查看当前的详细信息

容器卷的继承或者直接获取共享的命令

–volumes-from 容器名称[别名] 文件路径

测试开启centos中建立与本地的容器卷共享

表示启动centos,别名c1,建立容器内的tmp文件与本地的data文件夹关联,-it表示交互模式&终端

docker run -it --name c1 -v /data/:/tmp/ centos

新启动一个centos容器,别名c2,与c1共享容器卷

docker run -it --name c2 --volumes-from c1 centos
7.2 Dockerfile介绍
img

具体文件命令上面都有解释,写一个简短的Dockerfile文件实现centos镜像的自制

基于centos

FROM centos

创建人

MAINTAINER cdx1315020626@qq.com

编译镜像时运行的脚本

RUN echo “hello world to my first docker images, success”
RUN yum install vim -y

设置镜像的标签

LABEL version=“1.1”

向外面暴露的端口

EXPOSE 80

设置容器环境变量

ENV CDX=“caoduanxi”

ADD具有压缩特性的添加,这里暂时不用

COPY仅仅拷贝文件,从本机拷贝到镜像中

设置容器卷,等待共享数据

VOLUME ["/datafile1","/datafile2","/datafile3"]

设置启动命令,即到/usr/local目录下

CMD /usr/local

ENTRYPOINT也是设置命令,与CMD的区别在于CMD的命令在Dockerfile中只有最后一条会生效,通过docker命令启动的话,则算作命令的替换,而ENTRYPOINT则是不可变,即按照脚本命令不改变

ONBUILD类似于钩子函数,即如果有其他镜像继承自己,则在其他镜像执行的时候会调用自己执行相关设置的操作

写完了Dockerfile之后需要将当前的文件进行构建,使之变为可以执行的文件,类似于在Linux中写了shell脚本之后会执行的chmod +x xxx.sh使之具有执行的资质。

docker build -f /data/Dockerfile/Dockerfile -t cdx/centos .
img

img

上图可以得到自己定制的centos成功了

此时对其进行启动即可

启动重命名,且与容器中的容器卷建立联系 执行自己定制的centos 且追加/bin/bash的命令

docker run -it --name cdx1 -v /data/datafile1/:/datafile1/ cdx/centos /bin/bash
这里有个小问题,上面我CMD设置的/usr/local,这是一个目录,执行的时候会出错,所以可以在执行的时候追加/bin/bash即可

  1. 实战演练
    8.1 MySQL安装

拉取MySQL5.7版本

docker pull mysql:5.7

启动MySQL==>具体解释,设置端口映射12345映射到容器的3306,设置容器卷数据共享,获取其日志,以及产生的数据相关信息,以及配置文件。-e的话表示给mysql设置相关环境参数

docker run -p 12345:3306 --name mysqldocker -v /data/docker/mysql/conf:/mysql/conf.d -v /data/docker/mysql/logs -v /data/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

进入当前mysql即可使用

docker exec -it 5923229f07c4 /bin/bash

使用mysql

mysql -u root -p
如果需要再windows中或者项目中使用到当前数据库只需要给出自己云服务器的地址以及映射的端口号即可完成连接服务器的操作。

在这里插入图片描述

在这里插入图片描述

8.2 Redis安装
Redis的安装与MySQL基本一致,只是在指定容器卷地址不同以及启动方式指定的初始命令处有些许不同

查看响应版本的话可以去dockerhub官网看:https://hub.docker.com/

拉取Redis,这里我指定的是5.0.10,如果不指定的话,默认是按照最新版本拉取,或者选择自己想要的版本拉取

docker pull redis:5.0.10

启动redis: 指定映射端口6379,设置容器卷对应地址,最后的语句是默认使用redis-server /etc/redis/redis.conf来启动redis服务器

docker run -it -p 6379:6379 --name redis -v /data/redis/data:/data -v /data/redis/conf/redis.conf:/etc/redis/redis.conf -d redis:5.0.10 redis-server /etc/redis/redis.conf

进入redis的客户端redis-cli

docker exec -it 601dacb1bb8c redis-cli

注意redis默认是没有持久化的可以在redis.conf中修改

appendonly yes开启AOF持久化机制,如果是单独开启的话,修改完配置文件需要:docker restart 容器id

在这里插入图片描述

  1. Docker提交镜像至阿里云
    因为需要提交到阿里云,所以先要到阿里云的开发者中心中去找到我们的容器镜像,如果看不到的话直接搜索容器镜像即可开通,地址:https://cr.console.aliyun.com/cn-hangzhou/instances/repositories,然后的话,创建镜像仓库,取名字即可。

完成之后,管理界面如下:

在这里插入图片描述

点击上图中的管理即可进入到具体的镜像上传界面的操作指引界面。

示例

我创建的是redis

首先登陆

docker login --username=xxxxxx registry.cn-hangzhou.aliyuncs.com

输入密码验证

给需要推送的镜像打tag以及版本号

docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/aaroncdx/redis:[镜像版本号]

完成镜像的推送

docker push registry.cn-hangzhou.aliyuncs.com/aaroncdx/redis:[镜像版本号]
在这里插入图片描述

大致过程如上图,只是推送的网速有点慢!

img

  1. 小结
    本次Docker学习,之前听过Docker,知道Docker是容器,可以配置镜像,配置一整套环境,极其方便,但是听一万遍不如自己学习一遍,于是就把Docker学习了一遍,学习是跟着B站的视频:尚硅谷_Docker核心技术(基础篇),学习完了之后自己也有感觉,这个Docker确实是很方便,消除了那些繁杂的配置条件,之前自己学习Redis、MySQL的时候,每次换虚拟机的时候都要重新装一遍,十分的麻烦,而且如果自己买了云服务器的话,还需要自己去重新装任何的软件,有了Docker的话就可以自己构造一个属于自己的镜像,然后发布到阿里云镜像库中,下次自己换了环境,直接使用docker一套部署就完事了。

主要学习了docker的相关的操作命令:

启动docker

service docker start
service docker restart

查询当前镜像

docker search [软件名称]

查看镜像

docker images [-a]

拉取镜像

docker pull [需要的软件名称]

查看当前运行的镜像

docker ps -l

查看当前运行的镜像的容器id

docker ps -q

查看当前运行和历史上运行过的镜像

docker ps -a

删除镜像

docker rmi -f [镜像名]

删除运行的镜像

docker rm -f 容器id

停止当前运行的容器

docker stop 容器id
docker kill 容器id

运行当前镜像

docker run -it [–name 指定的名称] [-v 指定的容器卷] [-d 静默运行] [-e 需要设置的环境变量] 容器名称 [运行的命令]

提交新的镜像

docker commit -m=“镜像信息” -a=“镜像作者” 容器id 镜像名称:[版本号]

Dockerfile可以被执行生成镜像的docker脚本文件,但是执行前需要先执行build命令

最后的一个.不要漏了,否则命令是无效的

docker build -f [文件路径] -t 镜像名称 .

在docker运行时利用当前容器执行命令

docker exec 容器id [相关执行操作]

进入当前docker运行的某个容器内部执行命令

docker exec -it 容器id /bin/bash

查看当前容器的详细信息

docker inspect 容器id

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值