问题:①我在我的电脑上是可以运行的!②版本更新,导致服务器无法使用!
环境配置是十分麻烦的,每一台机器都要部署环境,费时费力。
传统:开发jar,运维来部署
现在:开发打包部署上线,一套流程做完。
Docker给出了解决方案
隔离:Docker的核心思想,打包装箱,每个箱子相互隔离。
Docker通过隔离机制,可以将服务器利用到极致
Docker历史Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。
Docker自2013年以来非常火热,无论是从 github 上的代码活跃度,还是Redhat在RHEL6.5中集成对Docker的支持, 就连 Google 的 Compute Engine 也支持 docker 在其之上运行。
2014年4月9日,Docker1.0发布。
在Docker容器技术之前,都是虚拟机技术
虚拟机:属于虚拟化技术,在Windows中装一个VMWare,通过这个软件可以虚拟出一台甚至多台电脑!笨重!
Docker容器技术,也是一种虚拟化技术,轻巧。
官网:Empowering App Development for Developers | Docker
文档:Docker documentation | Docker documentation
仓库地址:Docker Hub
Docker能干嘛虚拟化技术特点:1.资源占用多 2.冗余步骤多 3.启动很慢
容器化技术:容器化技术不是模拟的一个完整的操作系统
比较Docker和虚拟机的不同:
-
传统虚拟机,虚拟出硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。
-
Docker容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟硬件。
-
每个容器都是相互隔离的,每个容器都有属于自己的文件系统,互不影响。
DevOps(开发、运维)
应用更快速的交付和部署
传统:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运用
更快捷的升级和扩缩容
使用Docker后部署应用像搭积木一样!
项目打包为一个镜像,通过水平扩展
更简单的系统运维
在容器化后,开发测试环境高度一致
更高效的计算资源利用
Docker是内核级别的虚拟化,可以在一个物理机上运行很多容器实例,将服务器性能压榨到极致
Docker安装 Docker的基本组成镜像(Image):
docker镜像好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像-》run-》tomcat01容器
通过这个镜像可以创建多个容器,最终服务运行或项目运行就是在容器中
容器(container):
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建
基本命令:启动,停止,删除等
仓库(repository):
存放镜像的地方,分为公有,私有
DockerHub(默认为国外的)
阿里云(配置镜像加速)
安装Docker环境准备
CentOS 7、Xshell连接远程服务器进行操作
环境查看
#系统内核是3.10以上的 uname -r 3.10.0-1160.36.2.el7.x86_64
#系统版本 # 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"
安装
帮助文档
#1、卸载旧版本
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
#3、设置镜像的仓库(二选一)
yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo#默认国外的
yum-config-manager
--add-repo
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#阿里云(推荐)
#更新软件包索引
yum makecache fast
#4、安装docker相关的内容
yum install docker-ce docker-ce-cli containerd.io
#一路y下去
#5、启动docker
systemctl start docker
#6、docker version查看是否安装成功
#7、使用hello-world测试
docker run hello-world
#8、查看下载的镜像
docker images
#9、卸载docker
yum remove docker-ce docker-ce-cli containerd.io #删除依赖
rm -rf /var/lib/docker #删除资源
rm -rf /var/lib/containerd
阿里云镜像加速
1、登录阿里云找到容器服务
2、找到镜像加速地址
3、配置使用
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://g8h9tnqk.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
回顾HelloWorld流程
底层原理
Docker是怎么工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!
DockerServer接收到Docker-Client的指令,就会执行这个命令!
Docker为什么比VM快?
1、Docker有着比VM更少的抽象层
2、Docker利用的是宿主机的内核,vm需要的是Guest OS。
docker不需要像虚拟机一样重新加载一个操作系统内核。
Docker的常用命令 帮助命令docker version #显示docker的版本信息 docker info #显示docker的系统信息,包括镜像和容器的数量 docker 命令 --help #帮助命令
帮助文档地址:Reference documentation | Docker documentation
镜像命令docker images :查看所有本地主机上的镜像
#解释 REPOSITORY 镜像的仓库源 TAG 镜像的标签 IMAGE ID 镜像的ID CREATED 镜像的创建时间 SIZE 镜像的大小 #可选项 -a, --all #列出所有镜像 -q, --quiet #只显示镜像的ID
docker search:搜索镜像
docker search mysql NAME DEscriptION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 11526 [OK] mariadb MariaDB Server is a high performing open sou… 4373 [OK] mysql/mysql-server Optimized MySQL Server Docker images. Create… 851 [OK] percona Percona Server is a fork of the MySQL relati… 558 [OK] #可选项 -f, --filter eg:--filter=STARS=3000:搜索3000星以上的
doucker pull:下载镜像
docker pull 镜像名[:tag]
docker rmi:删除镜像
docker rmi-f 镜像ID #删除指定镜像
docker rmi-f 镜像ID 镜像ID 镜像ID... #删除多个镜像
docker rmi-f ${docker images -aq} #删除全部镜像
容器命令
新建容器并启动
docker run {可选参数} image
# 参数说明
--name="name" 容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P 随机指定端口
#测试,启动并进入容器
docker run -it centos /bin/bash
列出所有运行中的容器
docker ps #参数 #列出所有正在运行的容器 -a #列出所有正在运行的容器,带出历史运行过的容器 -n=? #显示最近创建的n个容器 -q #只显示容器的编号
退出容器
exit #直接容器停止并退出 ctrl + P + Q #容器不停止并退出
删除容器
docker rm 容器ID #删除指定容器
docker rm -f #{docker ps -aq} #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
#参数
-f 强制删除
启动和停止容器
docker start 容器id #启动容器 docker restart 容器id #重启容器 docker stop 容器id #停止当前正在运行的容器 docker kill 容器id #强制停止当前容器
常用其它命令
后台启动容器
#命令 docker run -d 镜像名 docker run -d centos #问题:docker ps发现centos被停止了 #常见的坑:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止 #容器启动后发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
docker logs -tf #显示日志 --tail n #显示n条日志
查看容器中的进程信息
docker top 容器ID
查看镜像的元数据
docker inspect 容器ID
进入当前正在运行的容器
#方式一 进入容器后开启一个新的终端,可在里面操作 docker exec -it 容器ID bashShell #方式二 进入容器正在执行的终端,不会启动新的进程 docker attach 容器ID
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的的主机路径可视化
- portainer(先用这个)
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true potainer/potainer
- Rancher(CI/CD)
什么是portainer?
Docker图形化界面管理工具!提供一个后台面板!
Docker镜像讲解 镜像是什么镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,方便扩展和部署。
如何得到镜像:
- 从远程仓库下载
- 拷贝
- 自己制作镜像DockerFile
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统是UnionFS联合文件系统。
Commit镜像docker commit #提交容器成为一个新的副本 docker commit -m="提交的描述信息" -a="作者" 容器ID 目标镜像名:[TAG]容器数据卷 什么是容器数据卷
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!就是卷技术!
实现容器的持久化与同步操作。
使用容器数据卷方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录 #测试 docker run -it -v /home/ceshi:/home centos /bin/bash具名挂载和匿名挂载
#匿名挂载 -v 容器内路径 docker run -d -P --name nginx01 -v /etc/nginx nginx #查看所有卷的情况 docker volune ls #具名挂载 docker run -d -P --name nginx02 -v xxxxxx:etc/nginx nginx
-v 容器内路径 #匿名挂载 -v 卷名:容器内路径 #具名挂载 -v /宿主机路径::容器内路径 #指定路径挂载
#通过 -v 容器内路径:ro/rw 改变读写路径 ro:只读 re:可读可写 docker run -d -P --name nginx02 -v xxxxxx:etc/nginx:ro nginx docker run -d -P --name nginx02 -v xxxxxx:etc/nginx:rw nginx初识Dockerfile
Dockerfile就是用来构建docker镜像的构建文件!命令脚本!
方式二:
dockerfile
FROM centos VOLUME ["volume01","volume02"] CMD echo "---end---" CMD /bin/bash
构建镜像
docker build -f /home/docker-test/dockerfile1 -t xxx/centos:1.0 .数据卷容器
可以使两个mysql甚至多个mysql同步数据
--volumes-from #例子 docker run -it --name docker02 --volumes-from docker01 xxx/centos:1.0
多个mysql实现数据共享
#启动mysql01 docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=XXXX --name mysql01 mysql:5.7 #启动mysql02 docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=XXXX --name mysql02 --volumes-from mysql01 mysql:5.7
容器的生命周期一直持续到没有容器使用为止。
持续化到了本地,本地数据不会被删除。
DockerFile DockerFile介绍dockerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
1、编写一个dockerfile文件
2、docker build构建成为一个镜像
3、docker run 运行镜像
4、docker push 发布镜像
DockerFile构建过程基础知识:
1、每个保留关键字(指令)都必须大写
2、指令从上到下顺序执行
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交
DockerFile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件
DockerFile指令FROM #基础镜像,一切从这开始构建 MAINTAINER #镜像作者,一般姓名+邮箱 RUN #镜像构建的时候需要运行的命令 ADD #添加内容 WORKDIR #镜像的工作目录 /bin/bash等 VOLUME #挂载的目录位置 EXPOSE #指定暴露端口 CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,会被替代 ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令 onBUILD #当构建一个被继承的DockerFile时,会运行该指令,触发指令。 COPY #将文件拷贝到镜像中 ENV #构建的时候设置环境变量
未完待续



