Docker教程一

在这里插入图片描述

一、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)然后查看并退出。
然后就可以实现父到子,子到父的相互共享和传递
在这里插入图片描述
删除容器数据卷后的共享:
在这里插入图片描述

总结:只要数据没有死绝,都可以在其他备份中找到他。在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值