[TOC]

Docker的简单使用

Docker 是什么

​ Docker 是一个应用打包、分发、部署的工具。你也可以把它理解为一个轻量的虚拟机,它只虚拟你软件需要的运行环境,多余的一点都不要,而普通虚拟机则是一个完整而庞大的系统,包含各种不管你要不要的软件。

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

Docker的基本组成

镜像(image)

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

容器(container)

Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。
启动,停止,删除,基本命令!
目前就可以把这个容器理解为就是一个简易的linux系统

仓库(repository)

仓库就是存放镜像的地方!
仓库分为公有仓库和私有仓库!
Docker Hub(默认是国外的)阿里云.…都有容器服务器(配置镜像加速!)

安装Docker

docker要求系统内核是3.10以上,可以使用uname -r命令来查看系统内核发行版本号。

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
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 使用阿里云镜像

安装容器之前,更新yum软件包索引。

yum makecache fast

4.安装容器相关的。docker-ce(社区版)docker-ee(企业版)

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

5.启动docker

systemctl start docker

6.使用docker version查看是否安装成功

docker version

卸载docker

1.卸载依赖

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

2.删除资源

rm -rf /var/lib/docker
rm -rf /var/lib/containerd

配置docker镜像加速

  1. sudo mkdir -p /etc/docker

  2. sudo tee /etc/docker/daemon.json <<-‘EOF’
    {
    “registry-mirrors”: [“https://docker.mirrors.ustc.edu.cn"]
    }
    EOF

    //中国科学技术大学镜像

  3. sudo systemctl daemon-reload

  4. sudo systemctl restart docker

Docker的常用命令

docker 命令 –help # 帮助命令

#查看所有本地的主机上的镜像
dokcer images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 10 months ago 13.3kB

解释

REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小

命令参数可选项

-a, –all # 显示所有镜像 (docker images -a)
-q, –quiet # 仅显示镜像id (docker images -q)

搜索镜像

docker search 镜像名

下载镜像

docker pull 镜像名[:版本号]

可以指定版本,不指定默认下载最新版,docker下载是分层下载,可以实现层级复用

删除镜像

docker rmi -f 镜像id # 删除指定的镜像

docker rmi -f 镜像id 镜像id 镜像id # 删除多个镜像(空格分隔)

docker rmi -f $(docker images -aq) # 删除全部的镜像

新建容器并启动

docker run [可选参数] image

-d 后台启动

常见的坑:docker容器使用后台运行,就必须要有要一个前台进程,docker发现没有应用,就会自动停止。

比如:nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了

–name 指定容器名字

-it 使用交互方式运行:进入容器内查看内容

exit 关闭容器并从容器中退出

ctrl+P+Q 不关闭容器退出容器

-p 指定容器的端口(小写p)

-P 随机指定端口(大写p)

进入正在运行的容器

docker exec -it 容器id /bin/bash

退出容器

exit # 容器直接停止,并退出

ctrl+p+q 容器不停止退出

列出当前正在运行的容器

docker ps

-a # 列出当前正在运行的容器+历史运行过的容器

-q # 只显示容器的编号

-n=? # 显示最近创建的容器(可以指定显示几条,比如-n=1)

删除容器

docker rm 容器id # 不能删除正在运行的容器

docker rm -f 容器id # 强制删除,包括正在运行的容器

docker rm -f $(docker ps -aq) #删除所有容器

docker rm -f -q|xargs docker rm #删除所有容器

启动和停止容器

docker start 容器id #启动容器

docker restart 容器id # 重启容器

docker stop 容器id # 停止当前正在运行的容器

docker kill 容器id # 强制停止当前容器

从容器内拷贝文件到主机上

docker cp 容器id:容器内路径 目的主机的路径

查看镜像的元数据

docker inspect 容器id

docker安装nginx(docker简单使用)

docker pull nginx 下载nginx镜像

docker run -d –name=”nginx-1” -p 3344:80 nginx 启动nginx

# -d 后台运行

# –name=”nginx01” 给容器命名

# -p 宿主机端口:容器内部端口

测试访问 : 访问宿主机公网ip:宿主机端口

出现以下页面即为成功!

失败可能的原因,云服务器未暴露3344端口(以我容器端口号为例)。

Docker镜像

镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!
如何得到镜像:

  • 从远程仓库下载
  • 朋友拷贝给你
  • 自己制作一个镜像DockerFile
UnionFS(联合文件系统)

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

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

Docker镜像加载原型

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS。

bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs(root file system),在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。
rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。

镜像分层

所有的Docker 镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层!

容器数据卷

使用
1
2
#直接使用命令来挂载:-v
docker run -it -v 主机目录:容器内目录 镜像名 /bin/bash

好处:我们以后修改只需要在本地修改即可,容器内会自动同步!

匿名和具名挂载
1
2
3
4
5
6
7
8
9
10
11
# 如何确定是具名挂载,还是匿名挂载,还是指定路径挂载
-v 容器内的路径 # 匿名挂载:我们在-v挂载目录时,只写了容器内的路径,没有写容器外的路径。
-v 卷名:容器内的路径 # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载
# 通过 -v 容器内的路径:ro rw 改变读写权限
ro read only # 只读
rw read write # 可读可写

docker volume create es-plugins #创建一个数据卷
docker volume inspect es-plugins #查看具名挂在的路径
docker logs -f es #查看日志

DockerFile

介绍:

dockerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
1、编写一个dockerfile文件
2、docker build 构建成为一个镜像
3、docker run运行镜像
4、docker push发布镜像(DockerHub、阿里云镜像仓库!)

注意:

1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序执行
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!

DockerFile命令
1
2
3
4
5
6
7
8
9
10
11
12
FROM        # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的:姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令。触发指令。
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!

CMD和ENTRYPOINT的区别

1
2
CMD            # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令

使用Docker搭建ES

拉镜像

1
docker pull elasticsearch:7.14.0

创建容器并运行

1
2
3
4
5
6
7
8
9
docker run -d --name es -p 9200:9200 -p 9300:9300 -v /usr/local/docker/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /usr/local/docker/es/plugins:/usr/share/elasticsearch/plugins \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
elasticsearch:7.14.0

#使用该语句
docker run -d --name es -p 9200:9200 -p 9300:9300 -v /usr/local/docker/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v es-data:/usr/share/elasticsearch/data \
-v es-plugins:/usr/share/elasticsearch/plugins -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.14.0

配置允许跨域

1
2
3
4
5
6
7
8
9
10
11
12
# 进入es容器内部
docker exec -it es bash

# 修改es的配置文件
vi /usr/share/elasticsearch/config/elasticsearch.yml

# 原有配置
cluster.name: "docker-cluster"
network.host: 0.0.0.0
# 添加配置
http.cors.enabled: true
http.cors.allow-origin: "*"

下载分词器

1
2
3
4
5
6
7
8
9
10
11
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.14.0/elasticsearch-analysis-ik-7.14.0.zip
#与es版本需要对应
选择合适的版本:https://github.com/medcl/elasticsearch-analysis-ik/releases
# 解压到ik目录下
unzip elasticsearch-analysis-ik-7.14.0.zip -d ./ik/
# 将ik文件夹cp到es容器中
docker cp ./ik/ es:/usr/share/elasticsearch/plugins/
# 重启es
docker restart es
# 校验es
curl localhost:9200

存储数据挂载未配置,分词未测试

1
2
docker cp 容器名称或id:容器内文件地址 本机地址
#不知道为什么复制文件到本机变成了文件夹

ik分词器包含两种模式:

  • ik_smart:最少切分
  • ik_max_word:最细切分