1. Docker 的入门应用

1.1 docker 的第一个程序

  1. [root@yongz ~]# docker run hello-world
  2. Unable to find image 'hello-world:latest' locally
  3. latest: Pulling from library/hello-world
  4. b8dfde127a29: Pull complete
  5. Digest: sha256:61bd3cb6014296e214ff4c6407a5a7e7092dfa8eefdbbec539e133e97f63e09f
  6. Status: Downloaded newer image for hello-world:latest
  7. Hello from Docker!

2. Docker 常用命令

2.1 辅助命令

# 1. 安装完成辅助命令 
- docker version     ----------------- 查看 docker 的信息 
-    docker info       ----------------- 查看更详细的信息 
- docker --help      ----------------- 帮助命令

2.2 镜像命令

# 1. 查看本机中所有镜像
-    docker images    ----------------- 列出本地所有镜像
                        -a:列出所有镜像(包含中间映象层)
                          -q:只显示 images id

# 2. 搜索镜像
-    docker search [options] 镜像名 -------------- 去 dcokerhub 上查询当前镜像
                        -f 指定值:列出指定值的镜像
                          --no-trunc:显示完整的镜像信息

# 3. 从仓库下载镜像
-    docker pull 镜像名[:TAG | @DIGEST] ----------- 下载镜像

# 4. 删除镜像
-    docker  rmi 镜像名 -------------- 删除镜像
                        -f:强制删除
-    docker rmi $(docker images -aq)

2.3 容器命令

# 1. 运行容器
-    docker run 镜像名 ---------------- 镜像名新建并启动容器
                        --name:为容器命令
                          -d:守护进程(在后台启动容器)
                        -p:主机端口号:容器端口号 (指定端口号启动)
                          -P:随机端口启动

 # 2. 查看运行的容器
-    docker ps ------------------- 列出所有正在运行的容器
                        -a:正在运行的和历史运行过的容器
                          -q:显示 container id

# 3. 停止 | 关闭 | 重启容器
-    docker start | restart | stop | kill 容器名字或者容器id ---------- 开启/重启/正常停止/立即停止

# 4. 删除容器
-    docker rm -f 容器 id 和容器名
-    docker rm -f $(docker ps -qa) --------------------------- 删除所有容器

# 5. 查看容器内进程
-    docker top 容器 id 或者容器名 --------------- 查看容器内的进程

# 6. 查看容器内部细节
-    docker inspect 容器 id ----------------- 查看容器内部细节

# 7. 查看容器的运行日志
-    docker logs [OPTIONS] 容器 id 或者容器名 -------------------- 查看容器日志
                        -t:加入时间戳
                          -f:打印最新的日志
                        --tail number:显示最后多少条

# 8. 进入容器内部
-    docker exec [options] 容器 id 容器内命令 -------------------- 进入容器执行命令
                        -i:以交互模式运行容器,通常与 -t 一起使用
                          -t:分配一个伪终端
                        -it:以交互模式进入容器,但需要在最后添加 /bin/bash,不然无交互对象
# 9. 容器和宿主机之间赋值文件
-    docker cp 文件 | 目录 容器 id:容器路径 --------------- 将宿主机文件复制到容器内部
-    docker cp 容器 id:容器内部资源路径 宿主机目录路径 ---------- 将容器内部文件赋值到宿主机

# 10. 数据卷(Volume)实现与宿主机共享目录
-    docker run -v 宿主机的路径 | 任意别名:/容器内部路径 镜像名
                注意:
                      1. 如果是宿主机路径必须是绝对路径,宿主机目录会覆盖容器内目录内容
                    2. 如果是别名则会在docker运行容器时自动在宿主机中创建一个目录,并将容器目录文件复制到宿主机中

# 11. 打包镜像
-    docker save 镜像名 -o 名称.tar

# 12. 载入镜像
-    docker load -i 名称.tar

# 13. 容器打包成新的镜像
-    docker commit -m='描述' -a='作者'  (容器id或者名称)打包的镜像名称:标签

3. Docker 镜像原理

3.1 镜像是什么 ?

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

    3.2 为什么一个镜像会那么大 ?

    2. Docker 基础 - 图1
    镜像就是花卷

  • UnionFS(联合文件系统)

    • Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。这种文件系统特性:就是一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录 。

      3.3 Docker 镜像原理

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

  • rootfs(root file system),在bootfs之上,包含的就是典型的linux系统中的/dev,/proc,/bin,/etc等标准的目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu/CentOS等等。
  • 我们平时安装进虚拟机的centos都有1到几个GB,为什么docker这里才200MB?对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令,工具,和程序库就可以了,因为底层直接使用Host的Kernal,自己只需要提供rootfs就行了。由此可见不同的linux发行版,他们的bootfs是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs。

2. Docker 基础 - 图2

3.4 为什么 Docker 镜像要采用这种分层结果呢 ?

最大的一个好处就是资源共享

  • 比如:有多个镜像都是从相同的base镜像构建而来的,那么宿主机只需在磁盘中保存一份base镜像。同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。Docker镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称为容器层,容器层之下都叫镜像层。

    4. Docker 安装常用服务

    4.1 安装 mysql

    ```

    1. 拉取 mysql 镜像到本地

  • docker pull mysql:tag(tag 不加默认最新版本)

2. 运行 mysql 服务

  • docker run —name mysql -e MYSQL_ROOT_PASSWORD-=root -d mysql:tag
             -- 没有对外暴露端口,无法连接
    
  • docker run —name mysql -e MYSQL_ROOT_PASSWORD-=root -d -p 3306:3306 mysql:tag

3. 进入 mysql 容器

  • docker exec -it 容器名称 | 容器 id /bin/bash

4. 外部查看 mysql 日志

  • docker logs 容器名称 | 容器 id

5. 使用自定义配置参数

  • docker run —name mysql -v /root/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -d mysql:tag

6. 将容器数据位置与宿主机位置挂载保证数据安全

  • docker run —name mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:tag

7. 通过其他客户端访问,如在 windows 系统下使用数据库工具访问

        -- 云服务器记得打开对应端口

8. 将 mysql 数据库备份为 sql 文件

  • docker exec mysql|容器id sh -c ‘exec mysqldump —all-databases -uroot -p”$MYSQL_ROOT_PASSWORD”‘ > /root/all-databases.sql
       -- 导出全部数据
    
  • docker exec mysql sh -c ‘exec mysqldump —databases 库表 -uroot -p”$MYSQL_ROOT_PASSWORD”‘ > /root/all-databases.sql
       -- 导出指定库数据
    
  • docker exec mysql sh -c ‘exec mysqldump —no-data —databases 库表 -uroot -p”$MYSQL_ROOT_PASSWORD”‘ > /root/all-databases.sql
       -- 导出指定库数据不要数据
    

9. 执行 sql 文件到 mysql 中

  • docker exec -i mysql sh -c ‘exec mysql -uroot -p”$MYSQL_ROOT_PASSWORD”‘ < /root/xxx.sql
    <a name="Sx3DA"></a>
    ## 4.2 安装 Redis 服务
    

    1. 在docker hub搜索redis镜像

  • docker search redis

2. 拉取redis镜像到本地

  • docker pull redis

3. 启动redis服务运行容器

  • docker run —name redis -d redis:tag (没有暴露外部端口)
  • docker run —name redis -p 6379:6379 -d redis:tag (暴露外部宿主机端口为6379进行连接)

4. 查看启动日志

  • docker logs -t -f 容器id|容器名称

5. 进入容器内部查看

  • docker exec -it 容器id|名称 bash

6. 加载外部自定义配置启动redis容器

默认情况下redis官方镜像中没有redis.conf配置文件 需要去官网下载指定版本的配置文件

1. wget http://download.redis.io/releases/redis-5.0.8.tar.gz  下载官方安装包
2. 将官方安装包中配置文件进行复制到宿主机指定目录中如 /root/redis/redis.conf文件
3. 修改需要自定义的配置
     bind 0.0.0.0 开启远程权限
     appenonly yes 开启aof持久化
4. 加载配置启动
  • docker run —name redis -v /root/redis:/usr/local/etc/redis -p 6379:6379 -d redis redis-server /usr/local/etc/redis/redis.conf

7. 将数据目录挂在到本地保证数据安全

  • docker run —name redis -v /root/redis/data:/data -v /root/redis/redis.conf:/usr/local/etc/redis/redis.conf -p 6379:6379 -d redis redis-server /usr/local/etc/redis/redis.conf
    <a name="Hvo3U"></a>
    ## 4.3 安装 Nginx
    

    1. 在docker hub搜索nginx

  • docker search nginx

2. 拉取nginx镜像到本地

  • [root@localhost ~]# docker pull nginx Using default tag: latest latest: Pulling from library/nginx afb6ec6fdc1c: Pull complete b90c53a0b692: Pull complete 11fa52a0fdc0: Pull complete Digest: sha256:30dfa439718a17baafefadf16c5e7c9d0a1cde97b4fd84f63b69e13513be7097 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest

3. 启动nginx容器

  • docker run -p 80:80 —name nginx01 -d nginx

4. 进入容器

  • docker exec -it nginx01 /bin/bash

    查找目录: whereis nginx

    配置文件: /etc/nginx/nginx.conf

5. 复制配置文件到宿主机

  • docker cp nginx01(容器id|容器名称):/etc/nginx/nginx.conf 宿主机名录

6. 挂在nginx配置以及html到宿主机外部

  • docker run —name nginx02 -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/html:/usr/share/nginx/html -p 80:80 -d nginx
    <a name="X6Byz"></a>
    ## 4.4 安装 Tomcat
    

    1. 在docker hub搜索tomcat

  • docker search tomcat

2. 下载tomcat镜像

  • docker pull tomcat

3. 运行tomcat镜像

  • docker run -p 8080:8080 -d —name mytomcat tomcat

4. 进入tomcat容器

  • docker exec -it mytomcat /bin/bash # 这时 tomcat 服务没启动

5. 将webapps目录挂载在外部

  • docker run -p 8080:8080 -v /root/webapps:/usr/local/tomcat/webapps -d —name mytomcat tomcat
    <a name="ilrwy"></a>
    ## 4.5 安装 MongoDB 数据库
    

    1. 运行mongDB

  • docker run -d -p 27017:27017 —name mymongo mongo —-无须权限
  • docker logs -f mymongo —查看mongo运行日志

2. 进入mongodb容器

  • docker exec -it mymongo /bin/bash 直接执行mongo命令进行操作

3. 常见具有权限的容器

  • docker run —name mymongo -p 27017:27017 -d mongo —auth

4. 进入容器配置用户名密码

mongo
use admin 选择admin库
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})   //创建用户,此用户创建成功,则后续操作都需要用户认证
exit

5. 将mongoDB中数据目录映射到宿主机中

  • docker run -d -p 27017:27017 -v /root/mongo/data:/data/db —name mymongo mongo ```

    4.6 安装 ElasticSearch

  • 注意

    • 调高 JVM 线程数限制数量

      4.6.0 拉取镜像运行 elasticsearch

      ```

      1.dockerhub 拉取镜像

  • docker pull elasticsearch:6.4.2

    2.查看docker镜像

  • docker images

    3.运行docker镜像

  • docker run -p 9200:9200 -p 9300:9300 elasticsearch:6.4.2 ```

  • 启动出现如下错误

2. Docker 基础 - 图3

4.6.1 预先配置

# 1.在centos虚拟机中,修改配置sysctl.conf
    vim /etc/sysctl.conf
# 2.加入如下配置
    vm.max_map_count=262144 
# 3.启用配置
    sysctl -p
    注:这一步是为了防止启动容器时,报出如下错误:
    bootstrap checks failed max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

4.6.2 启动 ES

# 0. 复制容器中data目录到宿主机中
-    docker cp 容器id:/usr/share/share/elasticsearch/data /root/es
# 1. 运行ES容器 指定jvm内存大小并指定ik分词器位置
-    docker run -d --name es -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms128m -Xmx128m" -v /root/es/plugins:/usr/share/elasticsearch/plugins -v /root/es/data:/usr/share/elasticsearch/data elasticsearch:6.4.2

4.6.3 安装 IK 分词器

# 1.下载对应版本的IK分词器
    wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.2/elasticsearch-analysis-ik-6.4.2.zip

# 2.解压到plugins文件夹中
    yum install -y unzip
    unzip -d ik elasticsearch-analysis-ik-6.4.2.zip

# 3.添加自定义扩展词和停用词
    cd plugins/elasticsearch/config
    vim IKAnalyzer.cfg.xml
    <properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 -->
        <entry key="ext_dict">ext_dict.dic</entry>
        <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords">ext_stopwords.dic</entry>
    </properties>

# 4.在ik分词器目录下config目录中创建ext_dict.dic文件   编码一定要为UTF-8才能生效
    vim ext_dict.dic 加入扩展词即可
# 5. 在ik分词器目录下config目录中创建ext_stopword.dic文件 
    vim ext_stopwords.dic 加入停用词即可

# 6.重启容器生效
-    docker restart 容器id
# 7.将此容器提交成为一个新的镜像
-    docker commit -a="xiaochen" -m="es with IKAnalyzer" 容器id xiaochen/elasticsearch:6.4.2

4.6.4 安装 Kibana

# 1. 下载kibana镜像到本地
-    docker pull kibana:6.4.2

# 2. 启动kibana容器
-    docker run -d --name kibana -e ELASTICSEARCH_URL=http://10.15.0.3:9200 -p 5601:5601 kibana:6.4.2

5. Docker 中出现如下错误解决方案

[root@localhost ~]# docker search mysql 或者 docker pull 这些命令无法使用
Error response from daemon: Get https://index.docker.io/v1/search?q=mysql&n=25: x509: certificate has expired or is not yet valid

2. Docker 基础 - 图4

  • 注意
    • 这个错误的原因在于系统的时间和 Docker Hub 时间不一致,需要使系统时间与网络时间同步
      # 1. 安装时间同步 sudo yum -y install ntp ntpdate 
      # 2. 同步时间 sudo ntpdate cn.pool.ntp.org 
      # 3. 查看本机时间 date