内容提要
- 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]
更多精彩内容请关注本站其他分享!!!