Docker学习

阅读声明:
1.本文为个人学习笔记,内有多图,需要看图片中的控制台的代码,以便理解;
2.文中所出现的服务器ip地址与暴露端口均为无效地址。服务器实例已被注销,请 勿尝试连接或进行无效的攻击。维护网络秩序,你我有责;
3.文章中的图部分引用与网络,侵权请联系删除;
4.部分知识理解均为个人见解,若有不当之处,欢迎指出,共同交流学习。

1. Docker 为什么会出现?

一款产品必经之路 开发 -> 上线,dev 与 prod 是两个环境。配置端口、配置环境都不同,每一个机器都要部署环境,配置起来非常麻烦,还可能出错。

常常会出现这样一种情况:程序在我的电脑上可以运行,换了个地方就不行了。

环境版本更新,导致服务不可用

在服务器配置应用环境,不能跨平台(windows 开发 -> Linux 上线)

于是,我们希望,发布一个项目可以连带环境一起打包 jar ->(jar + (Redis MySQL jdk) 一起上线?

Docker 给以上的问题,提出了解决方案

Java — jar(环境)— 打包项目带上环境(镜像)— (Docker仓库)— 下载镜像即可运行

2. Docker能做什么

Docker与虚拟机技术的不同

  • 传统虚拟机,虚拟出一套硬件,运行一个完整的操作系统,然后再这个系统上安装和运行软件
  • 容器内的应用直接运行在宿主机的内容,容器时没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
  • 每个容器间时相互隔离,每个容器内都有一个属于自己的文件系统,互不影响。

DevOps(开发、运维)

应用更快速的交付和部署

传统:一堆帮助文件,安装程序

Docker:打包镜像发布测试,一键运行

更便捷的升级和扩缩容

使用Docker之后,部署应用就像搭积木

项目打包成一个镜像,拓展 服务器A 拓展服务器B

更简单的系统运维

在容器化之后,我们的开发,测试环境都是高度一致的,不存在说“我的电脑能运行的情况了”

更高效的计算机资源利用

Docker是内核级别的虚拟化,可以在一个物理机上运行很多个容器实例,服务器的性能可以被压榨到极致。

3. Docker的组成

image: docker镜像就好比一个模板,可以通过这个模板来创建容器服务,tomcat镜像 -> run -> tomcat01容器(提供服务),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。

container: Docker 利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的

启动、停止、删除、基本命令

目前就可以把这个容器理解未就是一个建议的 linux 系统

repository: 仓库就是存放镜像的地方,仓库分为公有仓库和私有仓库

4. 环境准备

  1. 需要会Linux基础
  2. CentOS 7
  3. 使用 Xshell 连接远程服务器进行操作

5. Docker的安装

安装Docker

  1. 安装yum插件

    yum install -y yum-utils

看到后面的Complete!即表示插件安装成功

  1. 设置镜像的仓库为阿里云镜像仓库

    yum-config-manager
    –add-repo
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

  1. 更新yum软件包索引

    yum makecache fast

  1. 安装docker镜像 docker-ce 社区 docker-ee 企业版 默认安装最新版

    yum install docker-ce docker-ce-cli containerd.io

安装的过程中有两个地方需要输入y

等待片刻,最后出现Complete!即是安装完成

  1. 启动docker服务

    systemctl start docker

这样即表示启动成功

如果你还不相信的话,你可以输入个

docker version

来查看安装的版本号

  1. 运行Hello world程序

    docker run hello-world

  1. 查看下载的镜像

    docker images

  1. 卸载docker

    1. 卸载依赖

    yum remove docker-ce docker-ce-cli containerd.io

    2. 删除资源

    rm -rf /var/lib/docker

    /var/lib/docker 是docker的默认资源路径

6. 配置阿里云镜像加速

配置阿里云镜像加速



分别执行以下4个命令

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://jqwynzjh.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

在etc下创建docker目录

更换docker镜像

重新加载配置文件 重启docker

7. 底层原理

简单的Hello-World程序是怎么执行的?

底层原理

Docker 是怎么工作的?

Docker 是一个Client - Server 结构的系统,Docker的守护进程运行在主机上,通过Socker从客户端访问,DockerServer 接收到 Docker - Client 的指令,就会执行这个命令。

Docker 为什么比VM快?

  1. Docker有着比虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在Cpu、内存利用率上Docker将会在效率上有明显优势。

  2. Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker容器只需要几秒钟。

8. docker 的常用命令

帮助命令

1. 帮助命令

docker version # 查看版本信息

docker info # 显示docker的系统信息,包括镜像和容器的数量

下面还有一些系统硬件配置的信息

docker <指令> --help # 帮助命令

当然,还需要帮助文档

https://docs.docker.com/reference/

2. 镜像命令

docker images # 查看所有本地的主机上的镜像

  • REPOSITORY:镜像的仓库源

  • TAG:镜像的标签

  • IMAGE ID:镜像的ID

  • CREATED:创建的时间

  • SIZE:镜像的大小

    docker search # 从docker hub上搜索镜像

    可选操作

    –filter 过滤搜索结果
    docker search mysql --filter=STARS=3000 # 搜索STARS大于3000的结果

docker pull # 从docker hub上下载镜像docker pull 镜像名 [:tag版本号] 不写的tag话默认就是最新版本

指定版本下载

可以看到上面的Already exists,已经下载好的文件就可以共用,而不用再次下载,可以极大的节省内存,这就是linux联合文件系统的优点。

docker rmi 删除镜像
docker rmi -f 镜像id # 删除指定的容器
docker rmi -f 镜像id 镜像id # 删除多个容器
docker rmi -f $(docker images -aq) # 删除全部的容器

9. 容器命令

说明:有了镜像才可以创建容器,Linux,下载一个centos镜像(75.4MB)来测试学习。

docker pull centos

新建容器并启动

docker run [可选参数] image# 参数
--name="Name" 容器名字 tomcat01 tomcat02,用来区分容器
-d            后台方式运行
-it           使用交互方式运行,进入容器查看内容
-p            指定容器的端口 -p 8080:8080-p ip:主机端口:容器端口-p 主机端口:容器端口-p 容器端口容器端口
-p            随机指定端口

docker run -it centos /bin/bash 启动并进入容器

在容器内 使用 ls 指令发现和外部其实是一样的,这就是一个小型的服务器

服务器

镜像

退出并停止容器 exit

退出容器控制台 不停止容器 ctrl + p + q

查看运行中的容器

docker ps # 查看当前正在运行的容器
docker ps -a # 查看 当前 + 历史 运行的容器
docker ps -n=n # 显示最近创建的n个容器
-q # 只显示容器的编号

删除容器

docker rm 容器id # 不能删除正在运行的容器,如果要删除的话需要加 -f
docker rm -f $(docker ps -aq)

启动和停止容器

docker start 容器id   # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id    # 停止当前正在运行的容器
docker kill 容器id    # 强制停止当前容器

10. 常用的其它命令

1. 后台启动容器

# 命令 docker run -d 镜像名:
docker run -d centos

我们发现 centos 停止了

原因: docker 容器使用后台运行,就必须要有一个前台进程(比如说 -it 的那个界面就是前台应用),docker发现没有应用,就会自动停止

2. 查看日志

docker logs
docker logs -tf -tail N 容器Id    # 查看指定容器的最新N条记录# 参数解释
-t          # 日志加时间
-f          # 保留打印窗口,持续打印
--tail N    # 显示最后的N行

3. 查看容器中的进程信息

docker top 容器Id

UID

PID

PPID

C

STIME

TTY

当前用户

当前进程ID

父进程ID

CPU 使用率

开始时间

终端

4. 查看镜像的源数据

docker inspect 容器ID

5. 进入当前正在运行的容器

# 我们通常容器都是使用后台方式运行的,需要进入,修改一些配置# 方式一
docker exec -it 容器ID

# 方式二
docker attach 容器ID

区别:

docker exec 进入容器后开启一个新的终端,可以在里面操作(常用)

docker attach 进入容器正在进行的终端,不会启动新的进程

6. 容器内拷贝文件到主机上

docker cp 容器ID:/路径/文件 主机的位置# 案例
[root@e9e64b2c885b /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@e9e64b2c885b /]# cd /home
[root@e9e64b2c885b home]# ls
[root@e9e64b2c885b home]# touch test.txt
[root@e9e64b2c885b home]# ls
test.txt
[root@e9e64b2c885b home]# exit
exit
[root@iZf8zflm213bcx02dl4vxeZ ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED        STATUS                     PORTS     NAMES
e9e64b2c885b   centos    "/bin/bash"   31 hours ago   Exited (0) 4 seconds ago             strange_kapitsa
[root@iZf8zflm213bcx02dl4vxeZ ~]# docker cp e9e64b2c885b:/home/test.txt /home
[root@iZf8zflm213bcx02dl4vxeZ ~]# cd /home
[root@iZf8zflm213bcx02dl4vxeZ home]# ls
test.txt

7. 常用的命令总结

命令图

11. 案例一:安装Nginx

1. 寻找镜像 docker search Nginx

2. 下载镜像docker pull Nginx (注意: 镜像名一定要小写)

3. 查看镜像 docker images

4.后台运行Nginx

docker run -d --name nginx01 -p 3344:80 nginx-p 宿主机端口:容器内端口

外网访问

12. 案例二:安装Tomcat

# 官方文档的安装方式
docker run -it --rm tomcat:9.0# 属性解释
-it # 后台运行
--rm # 运行之后立刻把容器删除,用于测试

用这种方式启动的容器,一旦退出就会被删除

CTRL C 停止服务,使用docker ps 查看记录,并无此记录,不过镜像还是在的

docker images 查看镜像发现 tomcat 还在

正常启动 tomcat

值得注意的是:当你的容器镜像不是最新版的时候,若不带版本号,docker就会到docker hub上面给你下载了最新版然后启动。

访问tomcat

为什么会是404页面而不是tomcat欢迎页面呢?

由于docker镜像默认是最小的镜像,所有不必要的文件都剔除了,保证最小可运行的环境,因此webapps目录下是空白的,我们可以通过手动往webapps目录中添加文件即可。项目的发布也是如此。

13. 可视化

portainer:Docker图形化界面管理工具

docker run -d -p 8088:9000

–restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

在外网中打开(http://Ip/端口号),第一次加载会比较久

加载出来后,第一次登录需要设置密码

选择本地连接

14. Docker 镜像详解

1. 镜像是什么?

  • 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于环境开发的软件,它包括运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

  • 所有的应用都可以直接打包成docker镜像,放到容器中运行

  • 镜像的获取可通过远程仓库下载或者自己制作(DockerFile)

2. 镜像加载原理

UnionFS (联合文件系统)

UnionFS(联合文件系统):UnionFS是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。UnionFS是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。

特性:一次可以同时加载多个文件系统,但从外面看起来,智能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包括所有底层的文件和目录。

15. 创建镜像

docker commit 提交容器成为一个新的镜像# 与git相似
docker commit -m="提交的描述信息" -a="读者" 容器id 新的镜像名:[tag]

案例:创建一个自己的tomcat

我们发现tomcat默认是没有欢迎页面的,我们需要加上去

外网访问,出现欢迎页面,这就是我们想要的tomcat

提交镜像

docker commit -a="Aldrich" -m="add an index for tomcat" 3397174e6c52 mytomcat

原理:UnionFS,在原本的tomcat基础上加多了一层再发布

docker 进阶

16. 容器数据卷

什么是容器数据卷?

思考:在前面的学习中,我们知道,当容器运行时,数据都是存储在了容器内部的文件系统。那么当你运行 docker rm 命令的时候,容器将会连同它的文件系统一并被销毁。若这部分是有用的数据呢?比如说,上面放的是一个MySQL容器,我不希望数据会在容器销毁时消失。那唯一的解决办法就是别让数据只存到容器的文件系统,还应该保存一份到了宿主机。也就是将容器中的数据同步到本地。

这就是卷技术,目录的挂载,将我们的容器内的目录,挂载到宿主机上面。

容器数据卷有什么作用?

容器的持久化与同步操作,容器间的数据共享。

方式一:直接使用命令来挂载 -v

docker run -it -v 主机目录:容器目录

使用 docker inspect 查看挂载信息

已经实现了双向绑定

在主机这边修改文件也可以同步到容器中

以后修改配置文件只需要在本地修改,可以自动同步到容器中!

案例:安装MySQL

思考:MySQL的数据持久化,不能当容器摧毁时,数据也丢失

docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql#-d 后台启动
#-p 端口映射
# -v 可以写多个
# -e 配置环境
# mysql创建的时候需要配置密码

这时候服务已经启动成功了,我们来测试连接

在测试连接的时候出现了一个小插曲,数据库可视化工具报密码错误,但是通过dos窗口确实是可以登录的,无奈之下,将密码修改了一遍,就可以了。

我们来检查一下,是否已经将数据同步了

可以看到数据已经同步过来了,接下来我们要做一个测试,新建一个数据库

查看data中是否同步

思考:将mysql容器删除,数据是否还保留在宿主机?

数据依然保留在本地

具名挂载与匿名挂载

上面我们使用 -v 的挂载方式是属于 指定路径挂载 ,除此之后还有两种挂载的方式:具名挂载与匿名挂载

  • 匿名挂载

    # 匿名挂载
    -v 容器内路径
    docker run -d -P --name nginx01 -v /ect/nginx nginx

    属性讲解

    -P # 使用随机端口

使用docker volume ls 查看所有volume 的情况

可以看到没有名称,这就是匿名挂载

  • 具名挂载

    具名挂载

    -v 名称:容器内路径
    docker run -d -P --name nginx02 -v hasName-nginx:/etc/nginx nginx

可以在列表中看到是具体的名称

查看一下这个卷的详细信息

docker volume inspect hasName-nginx

所有的Docker容器内的卷,在没有指定宿主机路径的情况下,都是放在/var/lib/docker/volumes/.../_data

我们通过具名挂载可以方便的找到我们定义的卷,大多数情况都是使用 具名挂载

拓展:

# 通过 -v 容器内路径:ro 或者 rw 可以改变读写权限
ro # readOnly 只读
rw # read write 读写# 例如
docker run -d -P --name nginx03 -v hasName-nginx:/etc/nginx:ro nginx

注意的是:一旦设置了容器的权限,容器对挂载内容就有限制!

设置了 ro 表示这个路径只能通过宿主机来改修,容器内部无法修改!

17. Dockerfile

Dockerfile 是什么?

在之前,我们提交镜像是通过 docker commit 指令来手动创建的。Dockerfile 是一种命令脚本,用于创建 docker 镜像。

快速体验

创建一个Dockerfile文件

# 创建了一个dockerfile文件,名字随意
# 文件中的内容 指令(大写!) 参数
# 命令是分层的,如同UnionFS,一层一层的构建
FROM centos# 挂载目录
VOLUME ["volume01","volume02"]CMD echo "----end----"
CMD /bin/bash

执行Dockerfile文件

镜像生成成功

查看挂载的目录

这属于匿名挂载,我们可以通过查看详细信息的方式来获取挂载的路径

创建镜像是常有的操作,主要使用的方式是Dockerfile

详细介绍

1. Dockerfile 的构建步骤

  1. 编写一个Dockerfile文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(阿里云或者docker hup)

2. Dockerfile的注意事项

  1. 每个关键字都必须是大写字母!

  2. 从上到下的顺序执行

  3. # 表示注解

  4. 每个指令都会创建一个新的镜像层并提交

3. Dockerfile中的指令

FROM             # 基础镜像,一切从这里开始
MAINTAINER      # 镜像是谁写的 姓名+邮箱
RUN             # 镜像构建的时候需要运行的命令
ADD             # 需要添加的内容 如:centos + tomcat
WORKDIR         # 镜像的工作目录
VOLUME          # 挂载的目录
EXPOSE          # 暴露端口 -p
CMD             # 指定容器启动时进行的命令,指令会替换
ENTRYPOINT      # 指定容器启动时进行的命令,指令追加在后面
ONBUILD         # 当构建一个被继承 Dockerfile 时会运行ONBUILD指令,事件机制
COPY            # 类似ADD,将命令拷贝到镜像中
ENV             # 构建的时候设置环境变量

4. Dockerfile实战

# 由于默认的centos太纯净了,vim、clear 等常用指令都没有,我们需要手动创建一个
FROM centos     # 基于centos镜像进行包装
MAINTAINER aldrich<test@qq.com>  # 作者ENV MYPATH /user/local  # 指定环境变量
WORKDIR $MYPATH         # 设置工作目录RUN yum -y install vim  # 安装vim
RUN yum -y install net-tools    # 安装net-toolsEXPOSE 80              # 暴露端口CMD echo $MYPATH      # 打印一下环境变量
CMD echo "----end-----"   # 提示结束
CMD /bin/bash           # 进入/bin/bashdocker build -f 文件路径 -t 镜像名:[tag] 生成路径
docker build -f mycentos -t mycentos:1.0 .

运行测试

  • 默认的工作目录已经改变

  • vim 指令已经安装

可以通过 docker history 容器ID 的方式来查看镜像构建步骤


18. 数据共享

前面有说到,容器数据卷可以作为容器间的数据共享。

  • 创建一个docker01容器

  • 使用 volumes-from 与docker01容器建立数据共享

--volumes-from # 与其它容器建立数据共享关系
  • 测试在docker01中添加一个文件,docker02中是否会更新

docker01创建的内容同步到了docker02

同理docker02创建的数据也可以同步到docker01

**思考:**当docker01被删除之后,docker02中的数据会丢失吗?

答案是不会,当还有一个容器使用该数据,共享的数据就不会丢失。

原理图:

与Java中的引用类型赋值相似,所以当docker01被删除了,不影响docker02

结论:

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止,一旦持久化到本地,本地的数据是不会删除的。

Docker 快速入门学习相关推荐

  1. Docker快速入门学习笔记-持续更新中

    Docker安装 #1.卸载旧的版本 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker ...

  2. Docker快速入门

    Docker快速入门 ​ 学习资料: [狂神说Java]Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili 文章目录 Docker快速入门 1.Docker概述 1.1 Docker 为 ...

  3. Docker 快速入门(一文上手 Docker)

    通过本篇文章,就可以达到在 Window 或 Linux 上手 Docker(有点长,可以根据目录选择你需要的内容看) 文章图片没有带过来,涉及的图片较多,就不一一挪了,大家可以直接看我 GitCha ...

  4. Docker快速入门总结

    目录 Docker快速入门总结 1.Docker概述 2.虚拟化技术和容器化技术 3.Docker的基本组成 4.Docker的安装 5.Docker的卸载 6.配置阿里云镜像加速 7.Docker容 ...

  5. Docker快速入门实践-纯干货文章

    Docker快速入门实践-老男孩高级架构师课程内容,如果细看还能发现讲解视频呦!小伙伴们赶紧猛戳吧! 老男孩高级架构师内部学员实践文档分享! Docker快速入门实践-纯干货文章 老男孩教育2016启 ...

  6. docker快速入门_Docker标签快速入门

    docker快速入门 by Shubheksha 通过Shubheksha Docker标签快速入门 (A quick introduction to Docker tags) If you've w ...

  7. Java快速入门学习笔记9 | Java语言中的方法

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  8. Java快速入门学习笔记8 | Java语言中的数组

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  9. Java快速入门学习笔记7 | Java语言中的类与对象

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

最新文章

  1. (转)access和SQL语句的区别
  2. 集团化后的挚文还有很多“新故事”可以讲
  3. CDH Kerberos 认证下Kafka 消费方式
  4. matlab from有什么用,Matlab函数使用'fromworkspace'将向量传递给simulink
  5. Spark入门-了解Spark核心概念
  6. 【Python3】【爬虫】meizituSpider
  7. maven项目jdk版本配置及常见错误Error:java: 无效的目标发行版: 8解决
  8. 优化程序性能(CSAPP)
  9. 使用draw.io更改形状编辑图表的方法
  10. (转载) flex builder
  11. 服务器系统做双备份,云服务器如何做双机热备份
  12. datatables分页,排序,ajax请求等参数设置
  13. visio 新建个人模板
  14. 如果你看见这个舞女是顺时针转,说明你用的是右脑;耶鲁大学耗时5年的研究成果。左脑?右脑?
  15. 同步和异步有什么区别,分别在什么场景下使用
  16. 车载媒体服务器停止运行,智能电视提示应用停止运行 三种方法亲测有效
  17. linux 如何查找命令的路径
  18. 注册会计师考试计划和安排
  19. Myeclipse2017破解成功但激活失败
  20. 坦克世界服务器系统不更新失败怎么办,win7系统下坦克世界自动更新失败如何解决...

热门文章

  1. 汉诺塔 问题 VIII
  2. 微信公众号注册免费教程
  3. NOIP2018提高组省一冲奖班模测训练(一)
  4. JVM 重点知识点总结
  5. 警告: Failed to register object [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/Qia
  6. canvas教程大纲
  7. 高仿知乎android客户端,仿知乎分享界面
  8. ajax post请求导致的跨域和浏览器兼容性问题
  9. 微信可以显示你的足迹了,快试试
  10. java石头剪刀布思路_石头剪刀布Java实现