目录

一、Docker介绍

诞生背景

Docker介绍

虚拟机技术与容器虚拟化技术

虚拟机技术

容器虚拟化技术

官方网站

二、Docker安装

安装Docker

Docker管理命令

Docker底层原理

Docker结构图

工作原理

Docker为什么比Vm虚拟机快

三、Docker常用命令

仓库命令

怎么把镜像push进仓库?

从仓库搜索镜像

从仓库拉取镜像busybox

向仓库推进镜像

帮助命令

镜像命令

容器命令

基本命令

重要命令

四、通过Docker安装软件

MySQL

Redis

RabbitMQ

MongoDB


一、Docker介绍

诞生背景

操作系统的更新迭代、物理机器的损坏更新、不同环境版本的兼容,对于运维人员来说都是考验。

Docker之所以发展迅速,也是因为它对此给出了一个标准化的解决方案。

 

环境配置配置如此麻烦,但是当我们更换一台新的机器时,就要重新配置环境,费时费力,但这却又是我们不得不面临的问题。

那么能否从根本上解决问题,软件可以带环境安装?

在我们安装软件的时候,把原始环境一模一样的复制过来。

开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。

 

但是就算开发清楚的告诉运维部署团队全部的配置文件以及所有软件环境,任然常常会发生部署失败的状况。

Docker镜像的设计,使得Docker得以打破过去“程序即应用”的观念

通过镜像将作业系统核心除外,运作应用程式所需要的系统环境,

由下而上打包,达到应用程式跨平台间的无缝接轨运作。

Docker:“镜像即应用”

 

Docker介绍

Docker的主要目标是“Build、ship and run any app,anywhere”

也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,

使用户的APP(可以是web应用或数据库应用等等)及其运行环境能做到“一次封装,到处运行”

Linux容器技术的出现就解决了这样一个问题,而Docker就是在它的基础上发展过来的。

将应用运行在Docker容器上面,而Docker容器在任何操作系统上都是一致的

这就实现了跨平台、跨服务器只需要一次配置好环境,换到别的机子上就可以一键部署好。

总结:

Docker是解决运行环境和配置问题的软件容器,方便做持续集中并有助于整体发布的容器虚拟化技术

 

虚拟机技术与容器虚拟化技术

虚拟机技术

虚拟机(vm)就是带环境安装的一种解决方案。

它可以在一种操作系统里面运行另一种操作系统,比如Windows系统里面运行Linux系统。

应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样。

缺点:资源占用多、冗余步骤多、启动慢

 

容器虚拟化技术

容器:轻量级的虚拟化(共享同一系统内核),容器是由容器镜像来运行

优点:容器密度高,启动快,没有太多额外的开销

缺点:只能在linux操作系统

Linux容器(Linux Containers 缩写LXC)

Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。

有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。

容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置

系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。

 

二者区别

1、传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整的操作系统,在该系统上再运行所需应用进程;

2、容器内的应用进程直接运行于宿主机(容器所在主机)的内核容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器比传统虚拟机更轻便。

3、每个容器之间互相隔离,每个容器都有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。

 

官方网站

官方网址:https://www/docker.com

Docker社区:https://hub.docker.com/

 

二、Docker安装

安装Docker

Docker安装教程(CentOS 7)

Docker安装教程(CentOS 7)

Docker(CentOS 6)

Docker管理命令

# 重新载入后台启动进程

systemctl daemon-reload

 

# 启动docker容器 ,每次关闭虚拟机/运服务器时需要启动( 重要!!! )

sudo service docker start

 

# 查看Docker容器状态

sudo service docker status (should see active (running))

 

# 运行hello-world镜像/测试Docker是否可以使用

sudo docker run hello-world

Docker底层原理

Docker结构图

虚拟化技术和容器化技术的区别 图_虚拟化技术

鲸鱼背上有集装箱

蓝色的大海里边——宿主机系统Windows10

鲸鱼———————docker

集装箱——————容器实例    from  我们的镜像模板

 

工作原理

Docker是一个client-Server结构的系统,Docker守护进程运行在主机上,

然后通过Socket连接,从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。

容器,一个运行时环境,就是我们上边所说的集装箱。

虚拟化技术和容器化技术的区别 图_docker_02

 

Docker为什么比Vm虚拟机快

(1)docker有着比虚拟机更少的抽象层。

由于docker不需要Hypervisor实现硬件资源虚拟化,

运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。

因此在CPU、内存利用率上Docker将会在效率上有明显优势。

虚拟化技术和容器化技术的区别 图_虚拟化技术_03

 

(2)Docker利用的是宿主机的内核,而不需要Guest OS

因此当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。

因而避免了引寻、加载操作系统内核这个比较费时费资源的过程。

当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的。

而docker由于直接利用宿主机的操作系统,则省略了这个过程,因此新建一个docker容器只需要几秒钟。

虚拟化技术和容器化技术的区别 图_镜像_04

 

三、Docker常用命令

仓库命令

docker search 镜像名

从仓库搜索镜像

docker pull 镜像名

从仓库拉出镜像,默认拉取的最新版

docker push 镜像名

向仓库推进镜像(hub.docker.com必须在网页注册一个账号,然后命令行使用docker login登录,进行镜像打标签,才能把镜像推到参仓库)

怎么把镜像push进仓库?

step1——找到本地镜像的ID:docker images ls
step2——登陆Hub:docker login --username=username --password=password --email=email
step3——镜像打标签tag:docker tag <imageID> <namespace>/<image name>:<version tag eg latest>
step4——push镜像:docker push <namespace>/<image name>
 

从仓库搜索镜像

[root@manager ~]# docker search centos  
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   6061                [OK]                
ansible/centos7-ansible            Ansible on Centos7                              130                                     [OK]
consol/centos-xfce-vnc             Centos container with "headless" VNC session…   116                                     [OK]
jdeathe/centos-ssh                 OpenSSH / Supervisor / EPEL/IUS/SCL Repos - …   114 
...................

从仓库拉取镜像busybox

[root@manager ~]# docker pull busybox 
Using default tag: latest
latest: Pulling from library/busybox
76df9210b28c: Pull complete 
Digest: sha256:95cf004f559831017cdf4628aaf1bb30133677be8702a8c5f2994629f637a209
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest

向仓库推进镜像

hub.docker.com必须在网页上注册一个账号,才能把镜像推到仓库

docker push 镜像名
docker login

 

帮助命令

# 查看docker版本信息
docker version

# 查看docker所有安装信息
docker info

# 查看docker帮助 ( 最为重要,学会利用帮助文档来学习 ,这是成为高手的必经之路!!! )
docker --help

镜像命令

# 1.列出本地镜像(图1)
docker images

# option说明
 -a :列出所有镜像
 -q:只列出镜像id
 -digests :显示镜像的摘要信息
--no-trunc :显示相信信息


# 2.搜索某个镜像名字 (会在docker社区搜索相关的镜像, 而我们配置的阿里源只是帮我们同步了docker社区的镜像,图2)
docker search 

# option说明
	- s显示收藏数不小于指定值的镜像
    --no-trunc :显示相信信息
    - automated :只列出automated类型的镜像

# 3. 下载镜像(图3)
docker pull 镜像的名字:[TAG](不写默认为 lasted)

# 4. 删除镜像
docker rmi  -f 镜像名/镜像id
docker rmi -f $(docker images -qa )

各个选项说明

 

REPOSITORY

表示镜像的仓库源

TAG

镜像的标签

IMAGE ID

镜像ID

CREATED

镜像创建时间

SIZE

镜像大小

同一仓库源可以有多个TAG,代表这个仓库源的不同版本,我们

使用REPOSITORY:TAG来定义不同的镜像

如果你不指定一个镜像的版本标签,例如你只使用Ubuntu,

docker将默认使用ubunbu:latest镜像

图一

虚拟化技术和容器化技术的区别 图_docker_05

图二

虚拟化技术和容器化技术的区别 图_容器_06

图三

虚拟化技术和容器化技术的区别 图_虚拟化技术和容器化技术的区别 图_07

容器命令

基本命令

# 1. 新建并启动容器
docker run [OPTIONS] IMAGE [COMMOND] [ARGS...]

# OPTIONS 说明
	--name="容器新名字": 为容器指定一个名称;
	-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
	-i:以交互模式运行容器,通常与 -t 同时使用;
	-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
	-P: 随机端口映射;
	-p: 指定端口映射,有以下四种格式
	      ip:hostPort:containerPort
	      ip::containerPort
	      hostPort:containerPort
	      containerPort
	      
# eg: 使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it centos /bin/bash 

 
# 2. 查询当前正在运行的容器(类比虚拟中的查看进程)
docker ps [OPTIONS] 

# OPTIONS说明(常用):
	-a :列出当前所有正在运行的容器+历史上运行过的
	-l :显示最近创建的容器。
	-n:显示最近n个创建的容器。
	-q :静默模式,只显示容器编号。
	--no-trunc :不截断输出。


# 3. 退出容器
exit  容器停止后退出
ctrl+p+q  容器不停止退出

# 4 .启动容器
docker start 容器ID/容器名

# 5. 重启容器 
docker restart

# 6. 停止容器
docker stop 容器ID/容器名

# 7. 强制停止容器
docker kill 容器ID/容器名

# 8. 删除已经停止的容器(如果没有停止,删除后悔停止)
docker rm 容器ID
删除多个容器(特别是第二种 ,先查询所有运行的进程, 然后通过管道传到后面的删除操作中)
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm

重要命令

# 1. 新建并启动容器
docker run [OPTIONS] IMAGE [COMMOND] [ARGS...]

# OPTIONS 说明
	--name="容器新名字": 为容器指定一个名称;
	-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
	-i:以交互模式运行容器,通常与 -t 同时使用;
	-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
	-P: 随机端口映射;
	-p: 指定端口映射,有以下四种格式
	      ip:hostPort:containerPort
	      ip::containerPort
	      hostPort:containerPort
	      containerPort
	      
# eg: 使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it centos /bin/bash 

 
# 2. 查询当前正在运行的容器(类比虚拟中的查看进程)
docker ps [OPTIONS] 

# OPTIONS说明(常用):
	-a :列出当前所有正在运行的容器+历史上运行过的
	-l :显示最近创建的容器。
	-n:显示最近n个创建的容器。
	-q :静默模式,只显示容器编号。
	--no-trunc :不截断输出。


# 3. 退出容器
exit  容器停止后退出
ctrl+p+q  容器不停止退出

# 4 .启动容器
docker start 容器ID/容器名

# 5. 重启容器 
docker restart

# 6. 停止容器
docker stop 容器ID/容器名

# 7. 强制停止容器
docker kill 容器ID/容器名

# 8. 删除已经停止的容器(如果没有停止,删除后悔停止)
docker rm 容器ID
删除多个容器(特别是第二种 ,先查询所有运行的进程, 然后通过管道传到后面的删除操作中)
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
# 2. 查看容器日志
docker logs -f -t --tail 容器ID

eg :(图1)
docker run -d centos /bin/sh -c "while true;do echo hello testLogs;sleep 2;done"
docker logs -tf --tail 10 02c81778b0e0

-t 是加入时间戳
-f 跟随最新的日志打印
--tail 数字 显示最后多少条


# 3. 查看容器内运行的进程(图2)
docker top 容器ID

# 4. 查看容器内部细节(图3)
docker inspect 容器ID

# 5.进入正在运行的容器并进行交互(图4)
docker exec -it 容器ID bashShell

# 6. 重新进入容器(图5)
docker attach 容器ID bashShell(不写的话默认 /bin/bash下)

# 比较5与6的区别
attach 直接进入容器启动命令终端, 不会启动新的线程
exec 是在容器中打开新的终端, 并且可以启动新的线程

图1

虚拟化技术和容器化技术的区别 图_虚拟化技术和容器化技术的区别 图_08

图二

虚拟化技术和容器化技术的区别 图_docker_09

图三

虚拟化技术和容器化技术的区别 图_docker_10

图4

虚拟化技术和容器化技术的区别 图_镜像_11

图5

虚拟化技术和容器化技术的区别 图_虚拟化技术和容器化技术的区别 图_12

四、通过Docker安装软件

MySQL

# 1. 以安装mysql5.6为例(不知道什么原因5.7下不来)
docker pull mysql:5.6

# 2. 运行镜像,启动容器(端口3306,root用户密码:root,运行镜像:mysql5.6)
docker run -p 3306:3306 --name mysql -v /datebase/mysql/conf:/etc/mysql/conf.d -v /datebase/mysql/logs:/logs -v /datebase/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.6

# 3. 进入msql内部测试登陆
docker ps
## 进入mysql的当前目录下
docker exec -it MySQL运行成功后的容器ID/name     /bin/bash
## 输入账号密码
mysql -u 账号 -p(然后根据提示输入密码)

# 4.连接数据库的图形化界面
## Mysql 解决连接客户端时出现1251 client does not support ...问题
ALTER USER  'root'@'%' IDENTIFIED WITH mysql_native_password BY 'mysql密码';
ALTER USER  'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysql密码';

# 5. 备份数据库数据,之后我们可以通过直接读取这个sql文件恢复数据
docker exec myql服务容器ID sh -c ' exec mysqldump --all-databases -uroot -p"root" ' > /datebase/all-databases.sql

虚拟化技术和容器化技术的区别 图_容器_13

 

Redis

# 1.下载最新版redis镜像
docker pull redis

# 2.运行镜像(redis端口2333, -d后的redis不加参数默认为redis:latest)
# 注意本地数据卷与容器内数据卷目录的对应
docker run -p 2333:6379 -v /myuse/myredis/data:/data -v /myuse/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf  -d redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes

# 3.上传redis.conf到本地数据卷所在目录
本地数据卷坐在目录 : /myuse/myredis/conf
文件地址(太大了 ,这里放不下) :

# 4. 运行redis的cil----shell命令行
docker exec -it 运行着Rediis服务的容器ID redis-cli
# 远程连接 docker redis
docker exec -it redis_s redis-cli -h 192.168.1.100 -p 6379 -a your_password //如果有密码 使用 -a参数
 

 

RabbitMQ

# 1.下载镜像
docker pull rabbitmq:3.7.7-management

# 2.运行镜像
docker run -d --name rabbitmq3.7.7 -p 5672:5672 -p 15672:15672 -v `pwd`/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=/ -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin df80af9ca0c9

-d 后台运行容器;
--name 指定容器名;
-p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号);
-v 映射目录或文件;
--hostname  主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);
-e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码)

# 3.访问 (如下图)
http://ip:15672 账号 :admin
密码: admin
 

 

MongoDB

# 1.查看docker+MongoDB版本(图1)
docker search

# 2.下载最新的MongoDB
docker pull MongoDB

# 3.将镜像运行成容器
docker run -itd --name mongo -p 27017:27017 mongo --auth
## 参数说明:
-p 27017:27017 :映射容器服务的 27017 端口到宿主机的 27017 端口。外部可以直接通过 宿主机 ip:27017 访问到 mongo 的服务。
--auth:需要密码才能访问容器服务。

# 4.使用以下命令添加用户和设置密码,并且尝试连接。
$ docker exec -it mongo mongo admin
# 创建一个名为 admin,密码为 123456 的用户。
>  db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'}]});
# 尝试使用上面创建的用户信息进行连接。
> db.auth('admin', '123456')
 

虚拟化技术和容器化技术的区别 图_虚拟化技术和容器化技术的区别 图_14