目录
一、Docker简介
(1)docker为什么会出现:
(2)Docker历史:
Docker的思想:
1.集装箱:
会将所有需要的内容放到不同的集装箱中,谁需要这些环境就直接拿这个集装箱就可以了。
2.标准化:
1.运输的标准化:Docker有一个码头,所有上传的集装箱都放在了这个码头上,当谁需要某一个环境,就直接指派大海豚去搬运这个集装箱就可以了。
2.命令的标准化:Docker提供一系列的命令,帮助我们去获取集装箱等等操作。
3.提供了REST的API:衍生出了很多图形化界面,Rancher。
3.隔离性:
Docker在运行集装箱的内容时,会在Linux的内核中,单独开辟一片空间,这片空间不会影响其他的程序。
注册中心。(超级码头,上面放的就是集装箱)
镜像。(集装箱)
容器。(运行起来的容器)
docker介绍:
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)。
docker和虚拟机的区别:
应用docker的案例公司
docker下载:
官网地址:http://www.docker.com
中文网:https://www.docker-cn.com/
二、Docker安装
(1)安装的前提:
环境查看:当我们使用的是ContOS7的linux系统的时候,系统内核必须是3.10以上
执行命令:查看自己的linux版本
uname -r
然后查看配置文件:查看自己的ContOS版本:
cat /etc/os-release
如下:
docker的架构图:
(2)Docker的基本组成有三:
(1)镜像(image):
(2)容器(container):
(3)仓库(repository:
总结:
(3)Docker安装开始
去官网看文档安装:文档地址(可以在页面右键–》设置成中文):
https://docs.docker.com/get-started/
第一步:先卸载旧的版本:
命令为:
sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
可以省略掉sudo,sudo 为管理员运行;
第二步:需要的安装包:
yum install -y yum-utils
第三步:设置镜像的仓库(建议国内的,比较快):
yum-config-manager
–add-repo
https://download.docker.com/linux/centos/docker-ce.repo
更新yum软件包索引
yum makecache fast
第四步:安装docker相关的引擎:安装最新版本的 Docker Engine 和 containerd
yum install docker-ce docker-ce-cli containerd.io
提示我们选择y继续即可。
第五步:启动并测试:
systemctl start docker
docker version
第六步:测试helloworld程序:
docker run hello-world
第七步:查看下载的hello-world 镜像
docker images
卸载 Docker 引擎:
1.卸载 Docker Engine、CLI 和 Containerd 包:
yum remove docker-ce docker-ce-cli containerd.io
2.主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有镜像、容器和卷:
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
您必须手动删除任何已编辑的配置文件。
镜像加速配置:
登录阿里云官网,注册一个账号登录,找到容器镜像服务
找到镜像加速器:
直接复制命名分开执行四个,(sudo开始的的是一个命令)执行即可:
推荐阿里云的,也可以使用网易云的。
Hello-World镜像:
run干了什么:
docker服务重启很快:
docker是怎么工作的:
docker底层原理:
三、Docker常用命令:
镜像命令:
(1)帮助命令:
docker version #显示docker的版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker --help #帮助命令
docker --helf
(2)镜像命令:
2.1 显示本地镜像:docker images
docker images命令后的说明:
可选项Options:
-a, --all # 列出所有的镜像
-q, --quiet # 只显示镜像的ID
用法实例:docker images -qa
docker images -a
2.2 搜索官网镜像:docker search
docker search [OPTIONS] TERM
选项
–automated:弃用,只列出自动构建类型的镜像
–filter , -f:基于给定条件过滤输出
–format:使用模板格式化显示输出
–limit:Max number of search results ,默认值25
–no-trunc:禁止截断输出
–stars , -s:弃用,只显示收藏数不小于几颗星的镜像,移到–filter中使用
:
可选项,通过收藏来过滤:过滤–filter的使用(stars 收藏星数)
收藏数大于3的显示:
docker search --filter stars=3 tomcat
搜索结果表头说明:
Description 镜像描述
StarCount star数量
IsOfficial “OK” 表示官方镜像
IsAutomated “OK” 表示自动构建
2.3 拉取/下载 镜像:docker pull
命令:docker pull 镜像名字[:tag即版本标签号]
案例演示:
[root@hsStudy ~]# docker pull mysql
Using default tag: latest #如果不写tag,默认就是latest
latest: Pulling from library/mysql
69692152171a: Pull complete #分层下载,docker images核心 联合文件地址
1651b0be3df3: Pull complete
951da7386bc8: Pull complete
# 等价于
docker pull mysql
docker pull docker.io/library/mysql:latest
# 指定版本下载
[root@hsStudy ~]# docker pull mysql:5.7
2.4 删除本地镜像:docker rmi
删除一个镜像:docker rmi -f 镜像id
删除多个指定镜像:docker rmi -f 镜像名1:tag1 镜像名2:tag2
或者这样,删除多个指定镜像:docker rmi -f 镜像id1 镜像id2
删除全部镜像:docker rmi -f $(docker images -qa)
容器命令:
我们有了镜像才可以创建容器,linux,下载一个CentOS镜像来测试学习
先拉取一个centos的命令:docker pull centos
(1)新建容器并启动容器进入:
docker run [选项] 镜像名/镜像id
option选项说明(重要):
docker run [可选参数] image
#参数说明
--name="Name" 容器名字 tomcat01 tomcat02 用来区分容器
-d 以后台方式运行,ja nohub
-it 使用交互模式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip主机端:容器端口
-p 主机端:容器端口 主机端口映射到容器端口 (常用)
-p 容器端口
容器端口
-P 随机指定端口
#测试,启动并进入容器
[root@hsStudy ~]# docker run -it centos /bin/bash
[root@9f8cb921299a /]#
[root@9f8cb921299a /]# ls #查看容器内的centos,基础命令很多都是不完善的
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
#从容器中退回主机
[root@9f8cb921299a /]# exit
exit
#退出容器也可以使用:ctrl+p+q 类似于exit命令
[root@hsStudy /]# ls
bin dev home lib64 media opt root sbin sys usr
boot etc lib lost+found mnt proc run srv tmp var
启动并进入容器:docker run -it 镜像id如:300e315adb2f
或者这样也可以:docker run -it 镜像名字如centos
或者这样:docker run -it 镜像名字 /bin/bash
运行容器的时候给一个别名:
docker run -it --name mycentos的别名 centos
(2)列出当前所有正在运行的容器:docker ps:
命令:docker ps [options]
案例:
再打开一个终端,查看:docker ps
docker ps -ql :只显示容器的编号
docker ps -l :显示最近创建的容器
docker ps -a :列出当前正在运行的容器+带出历史运行过的容器
docker ps -n 2 :显示最近n个创建的容器
(3)退出容器:
exit #直接让容器停止并退出
Ctrl + P + Q #容器不停止退出
(4)启动/重启 容器:
docker start 容器id/容器名 #启动容器
docker restart 容器id/容器名 #重起容器
(5)停止 容器:
docker stop 容器id或者容器名 #停止当前正在运行的容器
docker kill 容器id或者容器名 #强制停止当前容器
(6)删除 容器:
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要强制删除,rm后加 -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有容器(使用linux管道命令)
要删除正在运行的容器我们加-f
如:docker rm -f 容器id
一次性删除多个容器:
docker rm -f $(docker ps -aq)
其中docker ps -a -q 可以写成docker ps -qa
(7)其他重要的命令:
7.1 后台启动容器
# 命令 docker run -d 镜像名
[root@hsStudy ~]# docker run -d centos
# docker ps , 发现centos停止了
# 常见的坑,docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
#nginx,容器启动后,发现自己没有提供服务,就会立即停止,没有程序了
7.2 查看日志命令:
使用帮助文档:docker logs --help
如:docker logs -t 容器的id
如:docker logs -tf --tail 3 容器的id号
3 代表最后三条日志,也可以不加。
t代表时间戳 timestamps
7.3 查看容器中的进程信息
查看容器内运行的进程:docker top 容器id
7.4 查看镜像的元数据(重要)
查看容器内部详细细节:docker inspect 容器id
7.5 进入正在运行的容器并以命令行交互(重要):
我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置的:
(1)decker exec -it 容器id bashShell #进入容器后开启一个新的终端,并且可以启动新的进程。可以在里面操作(常用),如docker exec -it 容器id /bin/bash
(2)docker attach 容器id #进入容器正在执行的终端,不会启动新的进程!
案例:
进入正在运行的容器并以命令行交互案例命令:
1.systemctl start docker:启动docker服务
2.docker images :查看docker的本地镜像,运行容器,必须有对应的本地镜像
3.docker run -it centos :以交互方式运行centos
4.docker ps :在主机/宿主机查看docker中当前运行的进程
5.复制容器id等待使用。
6.docker exec -it 3dd42b801aa1 ls -l /tmp
7.6 从容器内拷贝文件到主机上:
docker cp 容器id:容器内路径 目的的主机
docker cp 容器id:容器内路径 目的的主机
#查看当前主机目录下
[root@hsStudy home]# ls
depp hansuo.java
[root@hsStudy home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
afb3e7611084 centos "/bin/bash" 3 minutes ago Up 3 minutes epic_galileo
#进入docker容器内部
[root@hsStudy home]# docker attach afb3e7611084
[root@afb3e7611084 /]# cd /home
[root@afb3e7611084 home]# ls
#在容器内新建一个文件
[root@afb3e7611084 home]# touch test.java
[root@afb3e7611084 home]# ls
test.java
[root@afb3e7611084 home]# exit
exit
[root@hsStudy home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@hsStudy home]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
afb3e7611084 centos "/bin/bash" 5 minutes ago Exited (0) 8 seconds ago epic_galileo
#将这个文件拷贝出来到我们的主机上
[root@hsStudy home]# docker cp afb3e7611084:/home/test.java /home
[root@hsStudy ]# cd /home
[root@hsStudy home]# ls
depp hansuo.java test.java
[root@hsStudy home]#
docker常用命令总结:
四、 镜像原理
底层是联合文件系统
五、容器数据卷:(容器的持久化和继承和数据共享)
就是将宿主机的某个目录,映射到容器中,作为数据存储的目录,我们就可以在宿主机对数据进行存储
1.数据卷可以在容器之间共享和重用,本地与容器间传递数据更高效;
2.对数据卷的修改会立马有效,容器内部与本地目录均可;
3.对数据卷的更新,不会影响镜像,对数据与应用进行了解耦操作;
4.卷会一直存在,直到没有容器使用。
数据卷是什么:
数据卷能干啥:
容器数据卷的添加:
方式一:
docker run -it -v 主机目录:容器内目录 镜像名
类似于我们的-p 主机端口:容器内端口 镜像名
容器数据卷挂载是否成功的测试:docker inspect 容器id
容器停止后,数据也可以共享:
写保护的:docker run -it -v 主机目录:容器目录:ro 容器id
ro:即read only只读的意思
总结:好处:我们以后修改只需要再本地进行修改即可,容器内会自动同步的。
实战进行mysql的数据持久化:
第一步:下载镜像(可以不用搜索):docker pull mysql:8.0.22
第二步:运行镜像:docker run -d -p 3307:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql8.0.22 mysql:8.0.22
参数说明:
-d 后台运行
-p 端口映射
-v 数据卷的挂载
-e 环境配置
–name 定义别名
第三步:
外部win10连接docker中的mysql:
服务器命令行操作:
进入容器:docker exec -it 容器id /bin/bash
登录mysql: mysql -uroot -p(u,p后面跟的是用户名和密码)
授权:ALTER user ‘root’@’%’ IDENTIFIED WITH mysql_native_password BY ‘root’;
刷新:FLUSH PRIVILEGES;
然后:show databases;
然后界面这里连接:
在可视化的sql页面创建一个数据库和表,然后在容器中查看:看是否进行数据的同步了:
在本机下:
[root@fancentos7 home]# cd mysql
[root@fancentos7 mysql]# ls
conf data
[root@fancentos7 mysql]# cd data
[root@fancentos7 data]# ls
auto.cnf client-cert.pem ib_logfile0 performance_schema test
binlog.000001 client-key.pem ib_logfile1 private_key.pem undo_001
binlog.000002 #ib_16384_0.dblwr ibtmp1 public_key.pem undo_002
binlog.index #ib_16384_1.dblwr #innodb_temp server-cert.pem
ca-key.pem ib_buffer_pool mysql server-key.pem
ca.pem ibdata1 mysql.ibd sys
[root@fancentos7 data]#
#发现多了一个test文件夹。即数据库文件夹
方式二:使用dockerfile添加
第一步:mkdir /mydocker
cd /mydocker
第二步:编写文件:vim Dockerfile
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,-------success1"
CMD /bin/bash
这里的VOLUME后的"/dataVolumeContainer1","/dataVolumeContainer2"是匿名挂载了两个卷/目录。
而匿名挂载的卷的名字可以通过docker inspect 容器id:sroucese后就是对应容器外的目录(随机给的名字)
第三步:构建生成镜像:
file构建:-f 后跟的是一个Dockerfile文件的绝对路径。
docker build -f /mydocker/Dockerfile -t fan/centos .
第四步:并查看镜像:docker images
第五步:查看容器卷:
[root@fancentos7 mydocker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
fan/centos latest 9ab1e9ac88a2 7 minutes ago 209MB
hello-world latest d1165f221234 5 months ago 13.3kB
centos latest 300e315adb2f 8 months ago 209MB
[root@fancentos7 mydocker]# docker run -it fan/centos
[root@ac00f073ee49 /]# ls -l
可以看到主机上的默认给的一个容器卷名:
匿名挂载和具名挂载:
docker volume inspect 卷名:
六、 数据卷容器:(多个容器之间共享 数据)
若需要在多个容器之间共享持续更新的数据,可使用数据卷容器。数据卷容器也是容器,它专门提供数据卷以供其他容器挂载。
数据卷容器概念:
简单理解:活动硬盘上(主硬盘)挂活动硬盘,实现数据的传递依赖
准备工作:有挂在好的两个数据卷:
容器间传递共享命令:(–volumes-from):
案例一:
先进入启动docker服务:systemctl start docker
然后按照以下做:
然后进入一个容器卷:比如dataVolumeContainer2:
cd dataVolumeContainer2
然后在其中新建一个文件作为测试用:
touch dc01_add.txt
并ctrl+p+q退出
然后运行dc02并继承于dc01:
docker run -it --name dc02 --volumes-from dc01 fan/centos
然后查看共享文件夹的文件:
然后在dc01中增加一个文件dc01_add.txt作为测试。
[root@ff36896a0693 dataVolumeContainer2]# touch dc02_add.txt
[root@ff36896a0693 dataVolumeContainer2]# ls
dc01_add.txt dc02_add.txt
以此类推:先退出到主容器ctrl+p+q,然后创建一个dc03(docker run -it --name dc03 --volumes-from dc01 fan/centos),并在其中创建共享的文件,并查看:
可以在三中看到共享的一二文件:
[root@42d8dfecd673 dataVolumeCOntainer2]# ls -l
total 0
-rw-r--r--. 1 root root 0 Aug 20 07:28 dc01_add.txt
-rw-r--r--. 1 root root 0 Aug 20 07:35 dc02_add.txt
[root@42d8dfecd673 dataVolumeCOntainer2]#
然后同理,可以在dc03中增加自己独有的文件dc03_add.txt
(touch dc03_add.txt)然后查看并退出。
然后就可以实现父到子,子到父的相互共享和传递。
删除容器数据卷后的共享:
总结:只要数据没有死绝,都可以在其他备份中找到他。