Docker虚拟容器技术应用完全解析

内容提要

  • Docker概述
  • Docker安装与配置
  • Docker应用解析
  • Docker常用命令参考

一、Docker概述

1. 什么是docker

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

2. 为什么使用Docker

简化程序、避免选择恐惧症、节省开支、持续交付和部署、更轻松的迁移。

3. docker的应用场景

web应用自动化打包和发布

自动化测试和持续集成、发布

在服务型环境中部署和调整数据库或其他的后台应用

从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境

IaaS:(Infrastructure-as-a-Service)(基础设施即服务)

PaaS:(Platform as a Service)(平台即服务)

SaaS:(Software-as-a-Service)(软件即服务

4. docker三个核心概念

镜像(Image)

容器(Container)

仓库 (Repository)

理解了这三个概念就理解了Docker的整个生命周期。

Docker中镜像、容器与仓库的关系

Docker

面向对象

容器

对象

镜像

仓库

版本控制中的代码仓库

容器与镜像的关系类似于面向对象编程中的对象与类。

仓库用来保存镜像,可以理解为版本控制中的代码仓库。Docker Hub提供了庞大的镜像集合供使用。

二、docker的安装与配置

2.1 在win10及以上中安装与配置

说明:win10家庭版可能需要打补丁,安装Micsoft visual c++或net framework等。

1.安装准备

(1)新建hyperv.cmd文件,内容如下

pushd "%~dp0"

dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt

for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"

del hyper-v.txt

Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL

(2)以管理员身份执行hyperv.cmd文件

(3)如果系统要重启则重启

在控制面板->程序和功能->启用或关闭Windows功能打开Hyper-V。

(4)伪装成win10专业版

以管理员身份打开cmd。

执行如下命令:

REG ADD "HKEY_LOCAL_MACHINE\software\Microsoft\Windows NT\CurrentVersion" /v EditionId /T REG_EXPAND_SZ /d Professional /F

2.下载带-ce后缀的版本或win10下使用的其它版本

(1)win10桌面版: Docker Desktop Installer-w10

(2)点击桌面启动图标Docker Desktop,点右下角启动图标->settings->Engine添加以下内容,实现镜像加速

{

  "registry-mirrors": [

    "https://registry.docker-cn.com"

  ],

  "insecure-registries": [],

  "debug": true,

  "experimental": false

}

特别提示:win10中启动docker后在右下角的启动图标单击->settings,将提示你复制一个命令(最后配置docker操作面板),到windows的命令窗口执行,完成后回到小图标位置;

再点击dashborad则出现docker容器中正运行的镜像文件,我们可管理它们,比如:停止、重启、删除等操作。

(3)启动Hello World

docker run  ubuntu:15.10  /bin/echo  "Hello world"

3. 使用docker

运行完成后在git的bash或者系统的cmd的环境就可以使用docker命令了

镜像加速:对于使用 Windows 10 的系统,在系统右下角托盘 Docker 图标内右键菜单选择 Settings,打开配置窗口后左侧导航菜单选择 Daemon。

在Registrymirrors一栏中填写加速器地址https://reg-mirror.qiniu.com(或你的加速地址),之后点击Apply保存后Docker就会重启并应用配置的镜像地址了。

4. 处理IP映射

需要注意的是,实现的方式仍然是虚拟机,就算你容器配好了端口映射仍然要在虚拟机中运行 ;

打开Oracle VM VirtualBox,点网击络标签设置mysql及ssh等映射端口号。

5. 其他问题

(1)进入容器时报错

输入 docker exec -it xxxx /bin/bash 的时候报错

在命令前加上winpty,调用bash的时候不要使用绝对路径

比如: winpty docker exec -it xxxx bash

(2)镜像Linux的root权限

镜像默认的用户是docker ,密码为tcuser

想取得root权限,直接输入 sudo -i 即可

2.2 在Linux中(centOS)的安装与配置

# 校验Linux内核版本

uname -r

[root@hecs-215393 ~]# uname -r

3.10.0-1160.59.1.el7.x86_64  # 内核版本3.10即可;

1. 安装

目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10以上;

Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。

注意:从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。

本文介绍 Docker CE 的安装使用。

  • 移除旧的版本,执行如下命令。

sudo yum remove docker

docker-client

docker-client-latest

docker-common

docker-latest

docker-latest-logrotate

docker-logrotate

docker-engine

如果报告未安装这些包,则没有问题。

  • 安装一些必要的系统工具,安装所需的软件包。

(1)yum-utils:提供了 yum-config-manager 应用;

(2)device-mapper-persistent-data 和 lvm2 :提供devicemapper 的存储驱动程序

sudo yum install -y  yum-utils   device-mapper-persistent-data   lvm2

  • 添加软件源信息

# 官方推荐

yum-config-manager --add-repo  https://download.docker.com/linux/centos/docker-ce.repo

#  阿里云源

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

  • 更新yum源

sudo yum makecache fast

  • 安装docker-ce

sudo yum -y install docker-ce

  • 启动Docker后台服务

sudo systemctl start docker

  • 安装成功后可查看Docker版本

docker   version

[root@hecs-215393 ~]# docker version

#  终端输出如下信息,则表示安装成功

Client: Docker Engine - Community

 Version:           20.10.12

 API version:       1.41

 Go version:        go1.16.12

 Git commit:        e91ed57

 Built:             Mon Dec 13 11:45:41 2021

 OS/Arch:           linux/amd64

 Context:           default

 Experimental:      true

三、docker应用解析

以Spring boot为例

1. idea工具创建Spring boot项目

2. 编译打包

idea或命令(mvn package)编译打包后在工程target目录下生成文件xxx.jar

xxx.jar为你项目生成的jar包

可以将.jar文件放在磁盘中的其它文件夹下(不能在磁盘的根文件夹)

3. 用Docker打包镜像并发布

(1)在xxx.jar包文件夹下编写Dockerfile文件(没有扩展名),内容参考

# 基础镜像使用java

FROM java:8

# 作者

MAINTAINER corday <1927886796@qq.com>

# VOLUME 指定了临时文件目录为/tmp。

# 其效果是在主机 /var/lib/docker目录下创建了一个临时文件,并链接到容器的/tmp

VOLUME /tmp

# 将jar包添加到容器中并更名为app.jar

ADD xxx.jar app.jar

# 运行jar包

RUN bash -c 'touch /app.jar'

#镜像在容器中启动时的入口设置,CMD有相似功能

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

(2)生成docker镜像文件

复制xxx.jar包和Dockerfile文件到一个文件夹下(不要在磁盘的根下,此文件夹要有操作权限)

通过docker命令窗口进入该文件夹

生成docker镜像文件myboot,运行以下命令

docker build -t myboot . (这里有个小点)

(3)检查是否已经存在镜像docker images

(4)运行myboot镜像

docker run -d -p 8099:8080 myboot

(5)浏览器地址栏验证,服务名为localhost

http://docker容器的ip地址:8099/网页或动作

比如:http://192.168.18.178:8099/user/login.html

4. MySQL镜像启动案例 

(1)拉取镜像

docker pull mysql

(2)启动镜像

docker run -p  3306:3306 --name ms --restart=always -e MYSQL_ROOT_PASSWORD=123456 -d mysql

(3)进入交互界面

docker exec -it ms /bin/bash

(4)登录mysql,然后输入初始密码123456

mysql -u root -p

(5)启动完成

 mysql>

(6)修改root用户的初始密码

alter user 'root'@'localhost' identified by '1234';

四、Docker常用命令参考

4.1 docker的启动与停止命令

  • 启动docker服务
sudo systemctl start docker
  • 停止docker服务
systemctl stop docker
  • 重启docker服务
systemctl restart docker
  • 查看docker服务状态
systemctl status docker
  • 设置docker开启自动启动
systemctl enable docker

4.2 Docker镜像加速器配置

鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们需要配置加速器来解决。

1. Docker官方提供的国内镜像registry mirror

  • 打开vi /etc/docker/daemon.json文件,如果该文件不存在,则会自动创建
  • daemon.json文件当中,写入如下内容
{
"registry-mirrors":["https://registry.docker-cn.com"]
}

注意: 一定要保证该文件符合 json 规范,否则 Docker 将不能启动

  • 重启docker

sudo systemctl daemon-reload   # 重启加速器服务
sudo systemctl restart docker # 重启docker

2. 阿里云加速器(云端)

阿⾥云的镜像源有个加速器,可以加速你获取容器的速度。这个加速器地址是每个专属的。
官网参考:https://dev.aliyun.com
登录阿里云的个人账号
点击控制台

4.3 Docker管理命令

        4.3.1 Docker容器信息

## 查看docker容器版本

docker version

## 查看docker容器信息

docker info

## 查看docker容器帮助

docker --help

        4.3.2 镜像操作

提示:对于镜像的操作可使用镜像名、镜像长ID和短ID

  1. 镜像查看

##列出本地images

docker images

##含中间映像层

docker images -a

##只显示镜像ID

docker images -q

##含中间映像层

docker images -qa

##显示镜像摘要信息(DIGEST列)

docker images --digests

##显示镜像完整信息

docker images --no-trunc

##显示指定镜像的历史创建;

#参数:-H 镜像大小和日期,默认为true;--no-trunc显示完整的提交记录;-q仅列出提交记录ID

docker history -H redis

  2. 镜像搜索

##搜索仓库MySQL镜像

docker search mysql

## --filter=stars=600:只显示 starts>=600 的镜像

docker search --filter=stars=600 mysql

## --no-trunc 显示镜像完整 DESCRIPTION 描述

docker search --no-trunc mysql

## --automated:只列出 AUTOMATED=OK 的镜像

docker search  --automated mysql

  3. 镜像下载(直接使用已有的镜像)

##下载Redis官方最新镜像,相当于:docker pull redis:latest

docker pull redis

##下载仓库所有Redis镜像

docker pull -a redis

##下载私人仓库镜像

docker pull bitnami/redis

  4. 镜像删除

##单个镜像删除,相当于:docker rmi redis:latest

docker rmi redis

##强制删除(针对基于镜像有运行的容器进程)

docker rmi -f redis

##多个镜像删除,不同镜像间以空格间隔

docker rmi -f redis tomcat nginx

##删除本地全部镜像

docker rmi -f $(docker images -q)

 5. 镜像构建

(1)编写自定义的容器配置文件,比如:mydemo

cd /docker/dockerfile

vim mycentos #内容请参考上边第五部分第3项“用Docker打包镜像并发布”中的配置

(2)构建docker镜像

docker build -f /docker/dockerfile/mydemo -t mydemo:1.0

如果配置文件为Dockerfile且与项目.jar文件在同一文件夹下,则使用如下方式构建

docker build -f  mydemo:1.0 .

直接拉远程库中的jdk

Docker pull

        4.3.3 容器操作

提示:对于容器的操作可使用CONTAINER ID 或 NAMES。

1. 容器创建与启动

(1)新建并启动容器

#参数:-i以交互模式运行容器;-t 为容器重新分配一个伪输入终端;--name为容器指定一个名称

# -p告诉Docker如何在容器中映射端口8086到主机操作系统

docker create -p 3000:8090 --name smbs1 mysmbs # 创建容器

docker start smbs1 #启动容器

(2)后台启动容器,参数:-d  以守护方式启动容器

docker run -d  smbs1

注意:此时使用"docker ps -a"会发现容器已经退出。这是docker的机制:要使Docker容器后台运行,就必须有一个前台进程。解决方案:将你要运行的程序以前台进程的形式运行。

(3)启动一个或多个已经被停止的容器

docker start redis

(4)重启容器

docker restart redis

2. 查看容器

(1)查看正在运行的容器

docker ps

或 docker container  ls -a

(2)查看正在运行的容器的ID

docker ps -q

(3)查看正在运行+历史运行过的容器

docker ps -a

(4)显示运行容器总文件大小

docker ps -s

(5)显示最近创建容器

docker ps -l

(6)显示最近创建的3个容器

docker ps -n 3

(7)不截断输出

docker ps --no-trunc

(8)获取镜像redis的元信息

docker inspect redis

(9)获取正在运行的容器redis的 IP

docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis

3.  容器的停止与删除

(1)停止一个运行中的容器

docker stop redis

(2)杀掉一个运行中的容器

docker kill redis

(3)删除一个已停止的容器

docker rm redis

(4)删除一个运行中的容器

docker rm -f redis

(5)删除多个容器

docker rm -f $(docker ps -a -q)

docker ps -a -q | xargs docker rm

(6)移除容器间的网络连接,连接名为 db,-l参数

docker rm -l db

(7)删除容器,并删除容器挂载的数据卷,-v参数

docker rm -v redis

4. 容器的进入与退出

(1)使用run方式在创建时进入

docker run -it centos /bin/bash

(2)关闭容器并退出

exit

(3)仅退出容器,不关闭

快捷键:Ctrl + P + Q

(4)直接进入centos 容器启动命令的终端,不会启动新进程,多个attach连接共享容器屏幕,参数:--sig-proxy=false  确保CTRL-D或CTRL-C不会关闭容器。

docker attach --sig-proxy=false centos

(5)在 centos容器中打开新的交互模式终端,可以启动新进程,参数:-i 即使没有附加也保持STDIN 打开;-t  分配一个伪终端

docker exec -i -t  centos /bin/bash

(6)以交互模式在容器中执行命令,结果返回到当前终端屏幕

docker exec -i -t centos ls -l /tmp

(7)以分离模式在容器中执行命令,程序后台运行,结果不会反馈到当前终端

docker exec -d centos  touch cache.txt

5. 容器日志

(1)查看rabbitmq容器日志,默认参数

docker logs rabbitmq

(2)查看redis容器日志,参数:-f 跟踪日志输出;-t 显示时间戳;--tail仅列出最新N条容器日志

docker logs -f -t --tail=20 redis

(3)查看容器redis从2019年05月21日后的最新10条日志。

docker logs --since="2019-05-21" --tail=10 redis

6. 容器进程(选学)

(1)列出redis容器中运行进程

#top支持 ps 命令参数,格式:docker top [OPTIONS] CONTAINER [ps OPTIONS]

docker top redis

(2)查看所有运行容器的进程信息

for i in  `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done

        4.3.4 生成镜像

基于当前redis容器创建一个新的镜像:

docker commit -a="DeepInThought" -m="my redis" [redis容器ID]  myredis:v1.1

参数说明:

-a 提交的镜像作者;

-c 使用Dockerfile指令来创建镜像;

-m :提交时的说明文字;

-p :在commit时,将容器暂停

        4.3.5 容器与主机间的数据拷贝

1. 将rabbitmq容器中的文件copy至本地路径

docker cp rabbitmq:/[container_path] [local_path]

2. 将主机文件copy至rabbitmq容器

docker cp  [local_path]  rabbitmq:/[container_path]/

3. 将主机文件copy至rabbitmq容器,目录重命名为[container_path],注意与非重命名copy的区别

docker  cp  [local_path]  rabbitmq:/[container_path]

更多精彩内容请关注本站其他分享!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值