
学习笔记:Docker
Docker
Docker的概述
什么是Docker
docker是一个用Go语言实现的开源项目,可以让我们方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到docker container(容器),这样你的程序可以在任何环境都会有一致的表现
docker可以屏蔽环境差异,只要你的程序打包到了docker中,那么无论运行在什么环境下程序的行为都是一致的,不会再有“在我的环境上可以运行”,真正实现“一旦创建,到处运行”
- Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
- Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容
器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。 - Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版
本管理、复制、分享、修改,就像管理普通的代码一样。
Docker的用途
docker中有这样几个概念:
- dockerfile 构建进行的文本文件,对镜像进行操作
- image docker镜像,相当于安装包
- container docker 容器,相当于运行的程序
- 仓库(Repository):类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方
实际上你可以简单的把image(镜像)理解为可执行程序(程序安装包),container(容器)就是运行起来的进程(运行起来的任务)。
那么写程序需要源代码,那么“写”image就需要dockerfile,dockerfile就是image的源代码,docker就是”编译器”docker进行“编译”。
Docker 的主要用途,目前有三大类。
(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
Docker与Linux的区别
Docker基本组成
docker执行原理
通过客户端输入相应的命令,控制服务器端运行的过程
实际上docker使用了常见的CS架构,也就是client(客户端)-server(服务器)模式,docker client(客户端)负责处理用户输入的各种命令,比如docker build、docker run,真正工作的其实是server(服务器),也就是docker demon(docker守护进程),值得注意的是,docker client和docker demon可以运行在同一台机器上
docker工作流程
通过docker最基础的核心命令,操作守护进程,进而控制整个docker的运行
docker build
编译dockerfile
当我们写完dockerfile交给docker“编译”时使用docker build这个命令,那么client在接收到请求后转发给docker daemon,接着docker daemon根据dockerfile创建出“可执行程序”的image(镜像)
docker run
将镜像加载进内存,将镜像执行成容器
有了“可执行程序”image后就可以运行程序了,接下来使用命令docker run,docker daemon接收到该命令后找到具体的image,然后加载到内存开始执行,image执行起来就是所谓的container(容器)
docker build和docker run是两个最核心的命令,会用这两个命令基本上docker就可以用起来了
docker pull
向仓库请求下载镜像文件
用户通过docker client(客户端)发送命令,docker daemon(守护线程)接收到命令后向docker registry(仓库)发送image下载请求,下载后存放在本地,这样我们就可以使用image
这里的仓库有公开仓库和本地仓库
- 公开仓库:docker Hub
- 本地仓库:本地下载好的镜像仓库
docker的底层实现
docker基于Linux内核提供这样几项功能实现的:
- NameSpace
我们知道Linux中的PID、IPC、网络等资源是全局的,而NameSpace机制是一种资源隔离方案,在该机制下这些资源就不再是全局的了,而是属于某个特定的NameSpace,各个NameSpace下的资源互不干扰,这就使得每个NameSpace看上去就像一个独立的操作系统一样,但是只有NameSpace是不够。 - Control groups
虽然有了NameSpace技术可以实现资源隔离,但进程还是可以不受控的访问系统资源,比如CPU、内存、磁盘、网络等,为了控制容器中进程对资源的访问,Docker采用control groups技术(也就是cgroup),有了cgroup就可以控制容器中进程对系统资源的消耗了,比如你可以限制某个容器使用内存的上限、可以在哪些CPU上运行等等。
有了这两项技术,容器看起来就真的像是独立的操作系统了。
Docker的安装
Win安装Docker
省略
Mac安装Docker
省略
Linux安装Docker
Linux安装Docker以CentOS为例
切除旧环境
旧版本的docker环境或者版本。如果安装了这些,则卸载它们以及相关的依赖关系。docker和docker-engine
1 | yum remove docker \ |
安装Docker
在新主机上首次安装 Docker Engine 之前,您需要设置 Docker 存储库。之后,您可以从存储库安装和更新 Docker。
设置存储库(设置仓库)
安装yum-utils包(提供yum-config-manager 实用程序)。
1 | sudo yum install -y yum-utils |
设置仓储
设置稳定存储库
1 | sudo yum-config-manager \ |
安装 Docker 引擎
安装最新版本的 Docker Engine 和 containerd
1 | sudo yum install -y docker-ce docker-ce-cli containerd.io |
Docker 已安装但未启动。该docker组被创建,但没有用户添加到组
启动 Docker
无论何时何地,重新登录或重新使用docker时,都要启动Docker
1 | sudo systemctl start docker |
测试Docker
通过运行hello-world 映像验证 Docker Engine 是否已正确安装
1 | sudo docker run hello-world |
Docker 运行程序是统一使用:
1 | docker run 运行的程序名 |
有sudo 和 无sudo区别
- Docker 引擎已安装并正在运行。您需要使用
sudo来运行 Docker 命令(启用超级用户权限)。 - 不使用sudo :继续Linux postinstall以允许非特权用户运行 Docker 命令和其他可选配置步骤(非root用户,管理Docker)。
非root用户管理Docker
其他用户操作Docker进程只能使用sudo
Docker 守护进程绑定到 Unix 套接字而不是 TCP 端口。默认情况下,Unix 套接字归用户所有root,其他用户只能使用sudo. Docker 守护进程始终以root用户身份运行。
不使用sudo,直接创建组名docker的用户
如果您不想在docker命令前加上sudo,请创建一个名为的 Unix 组docker并向其中添加用户。当 Docker 守护进程启动时,它会创建一个可由docker组成员访问的 Unix 套接字。
要创建docker组并添加您的用户:
创建
docker组。1
sudo groupadd docker
将您的用户添加到
docker组中。1
sudo usermod -aG docker $USER
3.注销并重新登录,以便重新评估您的组成员身份,测试docker组用户是否添加成功
1 | newgrp docker |
配置Docker默认开机启动
大多数当前的 Linux 发行版(RHEL、CentOS、Fedora、Debian、Ubuntu 16.04 及更高版本)用于systemd管理系统启动时启动的服务(非默认开机启动)。在 Debian 和 Ubuntu 上,Docker 服务默认配置为在启动时启动(开机自启动)。
要设置开机启动,需要在引导时为其他发行版自动启动 Docker 和 Containerd,请使用以下命令
1 | sudo systemctl enable docker.service |
禁用开机启动
要禁用开机行为,请disable改用
1 | sudo systemctl disable docker.service |
删除Docker
卸载 Docker Engine、CLI 和 Containerd 包:
1
sudo yum remove docker-ce docker-ce-cli containerd.io
主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有镜像、容器和卷:
1
2sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
您必须手动删除任何已编辑的配置文件。
镜像加速
阿里云镜像加速
docker默认镜像在国外,国内使用很慢这里直接换成阿里云镜像
1 | sudo mkdir -p /etc/docker # 创建一个陌路 |
Docker常用命令
帮助命令
1 | docker version #显示命令信息 |
帮助文档:查看所有命令:https://docs.docker.com/reference
镜像命令
镜像命令(images)
所有进行命令都可以查询Docker官网 查看
镜像命令帮助文档:https://docs.docker.com/engine/reference/commandline/images/
查询镜像
docker images 查看所有本地的主机镜像
1 | [root@localhost docker]# docker images |
搜索镜像
docker search 搜索镜像
例如搜索mysql
1 | [root@localhost ~]# docker search mysql |
下载镜像
Docker pull 下载镜像
如下载mysql
1 | 下载镜像 Docker pull 镜像名[:tag ] 可选版本 |
查看下载后的版本
删除镜像
docker rmi 删除镜像
1 | [root@localhost ~]# docker rmi -f 镜像ID #删除指定的镜像镜像镜像 |
使用镜像
构建镜像的两种方法
- 使用docker commit将容器打包成一个镜像
- 编写Dockerfile文件之后使用docker build编译命令构造新的镜像
现在我们并不推荐使用Docker commit 命令 构建新的镜像, 而是使用灵活的更强大的Dockerfine来构建Docker镜像,
因为使用Docker commit 命令 构建新的镜像。
- 麻烦,不安全,
- 要新建一个容器,将容器修改,然后才是提交成新的镜像
docker commit
docker commit将容器打包成一个镜像
docker commit 主要是将一个容器创建成为一个镜像
使用场景:有一个容器已经搭建好了环境,部署好了代码和其他软件,可以正常运行测试环境了,为了以后可以直接使用这个容器,就需要用docker commit将这个容器创建成为镜像(容器打包成镜像环境,方便其他地方直接使用),以后直接使用这个镜像就好了
1 | 新建一个容器 |
Dockerfile
构建一个DockerFile实例
构建步骤:
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run运行镜像
- docker push 发布镜像(DockerHub、阿里云镜像仓库 私有/共有)
Dockerfile相当于对镜像操作的脚本
镜像的定制实际上就是定制每一层所 添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚 本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
编写Dockerfile
1 | 使用Dockerfile文件 |
被FROM 选择的是基础镜像,然后经过build命令编译Dockerfile的是新镜像,新镜像以基础镜像为基础镜像构建。
编译Dockerfile文件构建新的镜像
通过build命令,编译Dockerfile文件构建新的镜像
1 | 执行Dockerfile文件格式 |
Dockerfile常用命令
1 | FROM # 基础镜像 比如centos |
容器命令
镜像是源码实体,容器只是镜像的实例化
通过在Docker 下载一个centos 演示我们有了镜像才可以创建容器
在docker 安装一个centos
1 | docker pull centos |
新建容器并启动
通过镜像生成相应容器
/bin/bash是一个用户终端窗口
1 | docker run [可选参数] 镜像名 |
查看正在运行的容器
查看正在运行的docker容器
1 | docker ps 命令 #查看正在运行的容器 |
退出容器
1 | exit #直接容器停止并退出 |
删除容器
大白话理解:镜像是源码实体,容器只是镜像的实例化,就可以理解容器就相当于app一样
1 | docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm-f |
启动和停止容器
1 | docker start 容器id #启动容器 |
其他常用的容器命令
后台启动容器
1 | 命令docker run -d 镜像名 |
查看日志
1 | 显示日志 |
查看容器中的进程信息
1 | 命令docker top 容器id |
查看镜像的元数据
1 | 命令 |
进入容器命令
1 | 我们通常容器都是使用后台运行的方式运行,需要进入容器,修改一些配置 |
从容器内拷贝文件到主机上
1 | docker cp 容器id:容器路径 目的的主机路径 |
镜像与容器小结
小结:最常用镜像和容器命令
1 | attach Attach to a running container #当前shell下attach连接指定运行镜像 |
常见应用部署
安装nginx
搜索镜像
建议去DockerHub搜索相应的版本和帮助文档
1 | [root@localhost home]# docker search nginx |
下载镜像
下载镜像,使用pull命令
1 | 下载nginx镜像 |
测试运行
1 | [root@localhost ~]# docker run -d --name nginx01 -p3344:80 nginx |
访问测试页面
1 | [root@localhost ~]# curl localhost:3344 |
测试页面
1 |
|
端口暴露
了解端口暴露问题:就是通过映射方式,外部访问端口与内部端口连接,在不影响内部端口的情况下,从而达到操作内部端口作用
进入nginx容器
进入nginx改动配置文件
1 | 进入nginx容器 |
nginx的相关概念
正向代理代理的对象时客户端
反向代理代理的对象时服务端。
代理:我们常说的代理就是正向代理,它隐藏了真实请求的客户端,客户端请求的服务都被代理服务器代替来请求,服务器端并不知道真实的客户端。
反向代理:反向代理隐藏了真正的服务端,当我们请求http://www.baidu.com时,百度可能有成千上万台服务器,**具体哪一台正在为我们服务,我们无需知道**,我们只需要知道反向代理服务器就可以了。
安装tomact
认证进入容器命令
安装tomcat方法
方法1:
官方安装方法
1 | 官方使用 |
方法二:
最常用的tomcat安装方法
1 | 正确使用方法 |
进入容器
1 | 进入容器 |
部署ES+Kibanan
安装ES
1 | ES的缺点 |
查看CPU 状态
1 | 启动就卡住了,使用docker stats 查看cpu 状态 |
增加内存限制
1 | 赶紧关闭,内存限制,修改配置文件 -e 环境配置修改 |
- 感谢你赐予我前进的力量










