一. Docker概述
1. Docker为什么会出现?
-
一款产品: 开发–上线 两套环境!应用环境,应用配置!
-
开发 — 运维。 问题:我在我的电脑上可以允许!版本更新,导致服务不可用!对于运维来说考验十分 大
-
环境配置是十分的麻烦,每一个机器都要部署环境(集群Redis、ES、Hadoop…) !费事费力。
-
发布一个项目( jar + (Redis MySQL JDK ES) ),项目能不能带上环境安装打包!
-
之前在服务器配置一个应用的环境 Redis MySQL JDK ES Hadoop 配置超麻烦了,不能够跨平台。 开发环境Windows,最后发布到Linux!
-
传统:开发jar,运维来做!
现在:开发打包部署上线,一套流程做完! -
安卓流程:java — apk —发布(应用商店)
docker流程: java-jar(环境) — 打包项目帯上环境(镜像) — ( Docker仓库:商店)
-
Docker给以上的问题,提出了解决方案!
2. 虚拟机技术缺点
1. 虚拟机运行模式
-
模式
-
资源占用比较多
-
冗余步骤多
-
启动很慢
2. docker运行模式
- 模式
3. Docker能做什么
1. 比较Docker和虚拟机技术的不同
- 传统虚拟机, 虚拟出一个硬件, 运行一个完整的操作系统, 然后再这个系统上安装和运行软件
- 容器里的应用直接运行在虚拟机, 容器是没有自己的内核的, 也没有虚拟我们的硬件, 所以就轻便了
- 每个容器间相互隔离, 每个容器内部都有一个属于自己的文件系统, 互不影响.
2. 应用更快捷的交付和部署
- 传统: 一堆帮助文档, 安装程序
- Docker: 打包镜像发布测试, 一键运行
3. 更便捷的升级和扩缩容
使用了Docker之后, 部署应用就像搭积木一样
4. 更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的
4. 跟高效的计算资源利用
Docker是内核级别的虚拟化, 可以在一个物理机上运行更多的容器实例
4. 架构
1. 组成
- 架构图
2. 镜像(image):
- Docker镜像就好比一个模板, 可以通过这个模板来创建容器服务
- tomcat --> run --> tomact01容器(提供服务器)
- 通过这个镜像可以创建多个容器(最终服务运行或项目运行就在容器中)
3. 容器(container):
- Docker利用容器技术, 独立运行一个或一组应用, 通过镜像来创建的.
- 启动, 停止, 删除, 基本命令
- 目前就可以把这个容器理解为一个简易的Linux系统
4. 仓库(repository):
- 仓库就是存放镜像的地方
- 仓库分为公有仓库和私有仓库
- Docker Hub(默认是国外的)
二. Docker安装
1. 前提
-
系统版本3.10以上
# 显示操作系统的发行版号 [root@Jiangfengtime ~]# uname -r 3.10.0-514.26.2.el7.x86_64
-
系统环境查看
[root@Jiangfengtime ~]# cat /etc/os-release NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:7" HOME_URL="https://www.centos.org/" BUG_REPORT_URL="https://bugs.centos.org/" CENTOS_MANTISBT_PROJECT="CentOS-7" CENTOS_MANTISBT_PROJECT_VERSION="7" REDHAT_SUPPORT_PRODUCT="centos" REDHAT_SUPPORT_PRODUCT_VERSION="7"
2. 安装步骤
-
卸载旧版本
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
需要的安装包
yum install -y yum-utils
-
设置镜像仓库
yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的 # 阿里云的镜像 yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
更新yum软件包索引
yum makecache fast
-
安装docker
# docker-ce: 社区版 docker-ee: 企业版 yum install docker-ce docker-ce-cli containerd.io
-
启动docker
# 启动 systemctl start docker # 重启 systemctl reload docker # 关闭 systemctl stop docker
-
查看docker版本
-
运行hello word
docker run hello-world
-
查看下载的镜像
docker images
-
卸载Docker
# Uninstall the Docker Engine, CLI, and Containerd packages # 卸载依赖 yum remove docker-ce docker-ce-cli containerd.io # 删除资源 # docker的默认工作路径: /var/lib/docker rm -rf /var/lib/docker
3. 配置阿里云镜像加速
-
官网位置
-
命令位置
-
执行
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://21yhdus0.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
-
操作
三. 底层原理
1. Run干了什么
-
流程图
2. Docker工作原理
-
Docker 是一个Client-Server结构的系统, Docker的守护进程运行在主机上, 通过Socket从客户端访问
-
Docker Server接受到Docker-Client的指令, 就会执行这个命令
3. Docker为什么比VM快?
-
Docker有着比虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在Cpu、内存利用率上Docker将会在效率上有明显优势。
-
Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker容器只需要几秒钟
-
所以说, 新建一个容器的时候, docker不需要像虚拟机一样重新加载一个操作系统内核, 避免用到, 虚拟机时加载Guest OS, 分钟级别.
而Docker时利用宿主机的操作系统, 省略了这个复杂的过程; 秒级别.
四. Docker命令
1. 帮助命令
# 显示docker的版本信息
docker version
# 显示docker的系统信息, 包括镜像和容器数量
docker info
2. 镜像命令
1. docker images
:
-
帮助命令
# 帮助命令 docker images --help
-
docker images
docker images # REPOSITORY TAG IMAGE ID CREATED SIZE # hello-world latest bf756fb1ae65 9 months ago 13.3kB # 解释 # REPOSITORY: 镜像的仓库源 # TAG: 镜像的标签 # IMAGE ID: 镜像的ID # CREATED: 镜像的创建时间 # SIZE: 镜像的大小 # 可选项 Options: -a, --all # 列出所有镜像 -q, --quiet # 只显示镜像ID
2. docker search
: 搜索镜像
-
命令
docker search mysql
-
可选项
Options: -f, --filter filter Filter output based on conditions
provided
–format string Pretty-print search using a Go template
–limit int Max number of search results (default 25)
–no-trunc Don’t truncate outpu# --filter=STARS=3000: 搜索STARS大于3000的镜像 docker search mysql --filter=stars=3000
3. docker pull
: 下载镜像
-
docker pull --help
docker pull --help
-
docker pull 镜像名 [:tag]
[root@Jiangfengtime ~]# docker pull mysql:5.7 [root@Jiangfengtime ~]# docker pull mysql Using default tag: latest # 如果不写tag, 默认就是latest latest: Pulling from library/mysql bb79b6b2107f: Pull complete # 分层下载, docker image的核心, 联合文件系统 49e22f6fb9f7: Pull complete 842b1255668c: Pull complete 9f48d1f43000: Pull complete c693f0615bce: Pull complete 8a621b9dbed2: Pull complete 0807d32aef13: Pull complete 9eb4355ba450: Pull complete 6879faad3b6c: Pull complete 164ef92f3887: Pull complete 6e4a6e666228: Pull complete d45dea7731ad: Pull complete Digest: sha256:86b7c83e24c824163927db1016d5ab153a9a04358951be8b236171286e3289a4 # 签名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest # 真实地址 # 等价于 docker pull mysql docker pull docker.io/library/mysql:latest
4. docker rmi -f
-
命令
# 通过IMAGE ID 删除镜像 docker rmi -f bf756fb1ae65 # 通过REPOSITORY 删除镜像 docker rmi -f hello-world # 删除所有镜像 docker rmi -f $(docker images -aq)
3. 容器命令
说明: 我们有了镜像才可以创建容器,linux, 下载一个centos镜像来测试学习
-
下载contos
docker pull centos
1. 启动容器
-
启动容器
docker run [可选参数] image # 参数说明 --name="Name" 容器名称 tomcat01, tomcat02, 用来区分容器 -d 后台方式运行 -it 使用交互方式运行, 进入容器查看内容 -p 指定容器的端口 -p 8080:8080 -p ip:主机端口:容器端口 -p 主机端口:容器端口(常用) -p 容器端口 容器端口 -P 随机指定端口
-
实践
docker run -it centos /bin/bash
2. 退出容器
-
命令
# 从容器中退出到主机(退出并停止运行) exit ctrl + p + q(退出, 在后来运行)
3. 列出所有运行的容器
-
命令
docker ps docker ps -a # -a: 列出正在运行的容器 + 历史运行过的容器 # -n=?: 显示最近创建的?个容器 # -q: 只显示容器的编号
4. 删除容器
-
命令
# 删除指定的容器, 不能删除正在运行的容器 # -f: 强制删除, 可以删除正在运行的容器 docker rm 容器id # 删除所有的容器 docker rm -f $(docker ps -aq) docker ps -a -q|xargs docker rm
5. 启动和停止容器的操作
-
命令
docker start 容器id # 启动容器 docker restart 容器id # 重启容器 docker stop 容器id # 停止当前正在运行的容器 docker kill 容器id # 强制停止当前容器
4. 常用其他命令
1. 后台启动容器
-
命令:
-d
# docker run -d 镜像名 docker run -d centos
-
问题:
docker ps
时, 发现contos停止了
-
原因
[常见的坑] docker容器使用后台运行时, 必须要有一个前台进程, docker发现没有应用, 就自动停止
nginx容器启动后, 发现自己没有提供服务, 就会立即停止
2. 查看日志
-
命令
# 先启动一个容器 # 容器中会产生日志 docker run -d centos /bin/sh -c "while true; do echo hjf; sleep 1; done" # 查看容器的日志 docker logs -f -t --tail 10 5a94aa135611
-
参数说明
-f: follow, 动态输出, 如果不加-f参数, 则只输出运行命令时的日志 -t: timestamps, 显示时间戳 --tail n: 显示日志的最后n条
3. 查看容器中的进程信息
-
命令
docker top 容器id
4. 查看镜像的元数据
-
命令
docker inspect 容器id
此时可以发现, 之前写的容器id, 实际上是真实ID的前12位
5. 进入当前正在运行的容器
-
说明
容器通常都是使用后台方式运行, 需要将进入后台修改一些配置
-
命令1
# docker exec -it 容器id bashShell docker exec -it 5a94aa135611 /bin/bash
-
命令2
# docker attach 容器id # 进入到正在执行的代码 docker attach 5a94aa135611
-
说明
docker exec
: 进入容器后开启一个新的终端, 可以在里面操作(常用)docker attach
: 进入容器正在执行的终端, 不会启动新的进出
6.从容器内拷贝文件到主机
-
命令
# docker cp 容器id:文件路径 /主机路径 docker cp 5750731000b1:/home/hjf.txt /home
-
示例
# 进入容器 docker attach 5750731000b1 # 新建文件 touch /home/hjf.txt # 退出容器 exit # 拷贝容器文件到主机 docker cp 5750731000b1:/home/hjf.txt /home
-
说明
拷贝是一个手动过程, 未来我们使用
-v
卷的技术, 可以实现容器中的数据和主机里的数据自动同步
说明
- 本文参考了狂神的Docker教程
- 【狂神说Java】Docker最新超详细版教程通俗易懂