Docker 是一个开源的应用容器引擎,使用容器化技术,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 操作系统的机器上。实质上,容器内的应用还是直接运行在宿主机上,各个容器之间相互隔离。

Docker 是内核级别的虚拟化,可以在一个物理机上可以运行很多的容器实例。

Docker 安装

官网:https://www.docker.com/

官方文档:https://docs.docker.com/

安装

  1. yum 包更新到最新

    yum update
    

    注:若 Linux 虚拟机未配置网络,则可以通过查看另一篇博客配置网络:在 VM 虚拟机中 Linux 动态网络配置_ZOOM_Jie -CSDN博客。

  2. 安装需要的软件包,yum-util 提供 yum-config-manager 功能,另外两个是 devicemapper 驱动依赖

    yum install -y yum-utils device-mapper-persistent-data lvm2
    
  3. 设置 yum 源为阿里云

    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  4. 安装 Docker 社区版

    yum -y install docker-ce
    
  5. 查看 Docker 版本号

    docker -v
    

设置 USTC 镜像

  1. 编辑 /etc/docker/daemon.json 文件

    mkdir -p /etc/docker
    vim /etc/docker/daemon.json
    

    注:通过 yum 安装 vim:yum -y install vim*

  2. daemon.json 文件中输入以下内容:

    {"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
    }
    

启动 Docker

  1. 启动 docker

    systemctl start docker
    
  2. 停止 docker

    systemctl stop docker
    
  3. 查看 docker 状态

    systemctl status docker
    
  4. 查看 docker 具体信息

    docker info
    
  5. 查看 docker 帮助文档

    docker --help
    
  6. 设置开机自动启动 docker

    systemctl enable docker
    

Docker 常用命令

镜像命令

  1. 查看镜像

    docker images
    
  2. 搜索镜像

    docker search centos
    
  3. 拉取镜像

    docker pull 镜像名称(repository):版本(tag)
    

    注:拉取镜像不加版本 (:7) 即默认拉取最后一个版本。

  4. 删除镜像

    按镜像 ID 删除镜像

    docker rmi ImageID
    

    删除所有镜像

    docker rmi docker images -q
    

容器命令

  1. 启动容器

    docker start [容器名/id]
    
  2. 停止容器

    docker stop [容器名/id]
    
  3. 查看正在运行的容器

    docker ps
    
  4. 删除容器

    docker rm [容器名/id]
    
  5. 查看所有容器

    docker ps -a
    
  6. 查看最后一次运行的容器

    docker ps -l
    
  7. 查看停止的容器

    docker ps -f status=exited
    
  8. 查看停止的容器

    docker ps -f status=exited
    
  9. 创建容器

    docker run
    

    -i:表示运行容器。
    -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
    --name:为创建的容器命名(唯一)。
    -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个 -v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
    -d:在 run 后面加上 -d 参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加 -i,-t 两个参数,创建后就会自动进去容器)。
    -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个 -p 做多个端口映射。

    • 交互式方式创建容器

      docker run -it --name=容器名 [镜像名称]:[版本] /bin/bash
      

      这时我们通过 ps 命令查看,发现可以看到启动的容器,状态为启动状态

    • 守护式方式创建容器(后台运行)

      docker run -di --name=容器名 [镜像名称]:[版本]
      

      进入命令行

      docker exec -it [容器名/id] /bin/bash
      
  10. 退出当前容器

    exit
    
  11. 拷贝主机文件到容器

    docker cp [文件] [容器名/id]:[目录]
    
  12. 拷贝容器文件到主机

    docker cp [容器名/id]:[文件路径] [copy文件重命名]
    
  13. 容器目录挂载(映射)

    docker run -di -v [主机目录]:[容器目录] --name=容器名 [镜像名称]:[版本]
    
  14. 查看容器详细信息

    docker inspect [容器名/id]
    

    过滤信息

    docker inspect --format='{{.[字段].[key]}}' [容器名/id]
    

Docker 应用部署

MySQL

  1. 查询 MySQL 镜像

    docker search mysql
    
  2. 拉取 MySQL 镜像,以 MySQL 5.7 版本为例

    docker pull mysql:5.7
    
  3. 创建 MySQL 容器

    docker run -di --name=[容器名] -p [主机端口]:[容器端口] -e MYSQL_ROOT_PASSWROD=[管理员账户密码] [镜像名称]:[版本]
    
    docker run -di --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
    

    -di:守护方式创建容器

    -p:主机与容器的端口映射

    -e:直接设置容器的用户名密码

  4. 进入 MySQL 容器命令行

    docker exec -it [容器名] /bin/bash
    
    docker exec -it mysql /bin/bash
    
  5. 在 MySQL 容器中进行操作(以下命令皆是在==容器的命令行【root@b2494be91470:/#】==执行)

    1. 登录 MySQL

      mysql -uroot -proot --default-character-set=utf8
      
    2. SQLYog 连接容器中的 MySQL

  6. 到此 MySQL 容器就部署完成了

Nginx

  1. 查询 Nginx 镜像

    docker search nginx
    
  2. 拉取 Nginx 镜像

    docker pull nginx
    
  3. 创建 Nginx 容器

    docker run -di --name=[容器名] -p [主机端口]:[容器端口] [镜像名称]:[版本]
    
    docker run -di --name=nginx -p 80:80 nginx
    

    -di:守护方式创建容器

    -p:主机与容器的端口映射

  4. Windows 浏览器访问 【主机IP地址:80 】

  5. 到此 Nginx 容器就部署完成了

  6. 修改 Nginx 容器的配置文件

    • 将容器中的 nginx 目录复制到主机,改完再复制回去

      docker cp [容器名/id]:[文件路径]
      
      docker cp [文件] [容器名/id]:[目录]
      
    • 将容器目录挂载到主机(需要在创建容器的时候挂载)

      docker run -di --name=容器名 -p [主机端口]:[容器端口] -v [主机目录]:[容器目录]  [镜像名称]:[版本]
      
      docker run -di --name=nginx -p 80:80 -v /usr/local/mydata/conf/:/etc/nginx nginx
      

Redis

  1. 查询 Redis 镜像

    docker search redis
    
  2. 拉取 Redis 镜像

    docker pull redis
    
  3. 创建 Redis 容器

    docker run -di --name=[容器名] -p [主机端口]:[容器端口] [镜像名称]:[版本]
    
    docker run -di --name=redis -p 6379:6379 redis
    

    -di:守护方式创建容器

    -p:主机与容器的端口映射

  4. 使用 Another Redis Desktop Manager 连接 Redis

    1. 输入主机 IP 地址与容器映射的端口号,点击 OK

    2. 成功连接,查看信息

  5. 到此 Redis 容器就部署完成了

  6. 修改 Redis 容器的配置文件

    • 将容器中的 Redis 目录复制到主机,改完再复制回去

      docker cp [容器名/id]:[文件路径]
      
      docker cp [文件] [容器名/id]:[目录]
      
    • 将容器目录挂载到主机(需要在创建容器的时候挂载)

      docker run -di --name=容器名 -p [主机端口]:[容器端口] -v [主机目录]:[容器目录]  [镜像名称]:[版本]
      

RabbitMQ

  1. 查询 RabbitMQ 镜像

    docker search rabbitmq
    
  2. 拉取 RabbitMQ 镜像(以 3.7.12 版本为例)

    docker pull rabbitmq:3.7.12
    
  3. 创建 RabbitMQ 容器

    docker run -di --name=[容器名] -p [主机端口]:[容器端口] [镜像名称]:[版本]
    
    docker run -di --name=rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 15671:15671 -p 15672:15672 rabbitmq:3.7.12
    

    -di:守护方式创建容器

    -p:主机与容器的端口映射

  4. 进入容器,启动 UI 插件

    docker exec -it rabbitmq /bin/bash
    
    rabbitmq-plugins enable rabbitmq_management
    
  5. 浏览器访问【主机IP地址:15672 】

    登录

  6. 到此 RabbitMQ 容器就部署完成了

Elasticsearch

  1. 查询 Elasticsearch 镜像

    docker search elasticsearch
    
  2. 拉取 Elasticsearch 镜像(以 7.5.0 版本为例)

    docker pull elasticsearch:7.5.0
    
  3. 修改虚拟内存大小

    sysctl -w vm.max_map_count=262144
    
  4. 创建 Elasticsearch 容器

    docker run -di --name=elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "cluster.name=elasticsearch" -v /usr/local/mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins elasticsearch:7.5.0
    

    -e "discovery.type=single-node":设置单节点

    -e "cluster.name=elasticsearch":设置集群名

  5. 进入 Elasticsearch 容器,安装 IK 分词器

    docker exec -it elasticsearch /bin/bash
    
    elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.5.0/elasticsearch-analysis-ik-7.5.0.zip
    
  6. 退出 Elasticsearch 容器,重启 Elasticsearch 容器

    exit
    
    docker restart elasticsearch
    
  7. 浏览器访问【主机IP地址:9200】

  8. 到此 Elasticsearch 容器就部署完成了

Zookeeper

  1. 查询 Zookeeper 镜像

    docker search zookeeper
    
  2. 拉取 Zookeeper 镜像(以 3.4.13 版本为例)

    docker pull zookeeper:3.4.13
    
  3. 创建 Zookeeper 容器

    docker run -di --name=zookeeper -p 2181:2181 zookeeper:3.4.13
    
  4. 到此 Zookeeper 容器就部署完成了

迁移与备份

  1. 容器保存为镜像

    docker commit [容器名] [保存的镜像名]
    
  2. 镜像备份

    docker save -o [镜像备份名.tar] [镜像]
    
  3. 镜像恢复与迁移

    docker load -i [镜像备份名.tar]
    

Docker 私有仓库

私有仓库搭建与配置

  1. 拉取私有仓库镜像

    docker pull registry
    
  2. 启动私有仓库容器

    docker run -di --name=registry -p 5000:5000 registry
    

    打开浏览器访问地址:【主机 IP:5000/v2/_catalog】

  3. 修改 daemon.json

    vim /etc/docker/daemon.json
    

    添加以下内容,保存退出

    {"insecure-registries":["主机 IP:5000"]}
    
    {"insecure-registries":["192.168.3.39:5000"]}
    

    此步是用于让 docker 信任私有仓库地址

  4. 重启 Docker 服务

    systemctl restart docker
    
  5. 启动 registry 容器

    docker start registry
    

上传本地镜像

  1. 将本地镜像打包

    docker tag [本地镜像名称]:[版本] [主机 IP:5000]/[镜像名]
    
    docker tag mysql:5.7 192.168.3.39:5000/mysql
    
  2. push 上传镜像到私有仓库

    docker push [镜像名 REPOSITORY]
    
    docker push 192.168.3.39:5000/mysql
    
  3. 浏览器访问地址:【主机 IP:5000/v2/_catalog】

Dockerfile

Dockerfile 是由一系列命令和参数组成的脚本文件。这些命令应用于基础镜像并最终创建一个新的镜像。

常用命令

命令 作用
FROM image_name:tag 定义了使用哪个基础镜像启动构建流程
MAINTAINER usr_name 声明镜像的创建者
ENV key value 设置环境变量
RUN command 是 Dockerfile 的核心部分
ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,则会在复制后自动解压
COPY source_dir/file dest_dir/file 和 ADD 类似,但是不解压压缩文件
WORKDIR path_dir 设置工作目录

制作 JDK1.8 镜像

  1. 首先,在 Linux 中创建一个 jdk8 目录,用来存放我们的 JDK 文件

    mkdir -p /usr/local/jdk8
    
  2. 将 JDK8 的 *.tar.gz 包通过 XFTP 上传到 /usr/local/jdk8 目录下

  3. /usr/local/jdk8 目录下,创建并编辑 Dockerfile 文件(也就是 JDK 包和 Dockerfile 需要在同一目录下)

    vim Dockerfile
    

    添加以下内容:

    FROM centos:7
    WORKDIR /usr
    RUN mkdir /usr/local/java
    ADD jdk-8u311-linux-x64.tar.gz /usr/local/java
    ENV JAVA_HOME /usr/local/java/jdk1.8.0_311
    ENV PATH $JAVA_HOME/bin:$PATH
    
    • FROM centos:7:指定基础镜像为 Centos7
    • WORKDIR /usr:工作目录
    • RUN mkdir /usr/local/java:创建目录
    • ADD jdk-8u311-linux-x64.tar.gz /usr/local/java:将 jdk8 包拷贝并解压到 /usr/local/java 目录
    • ENV JAVA_HOME【ENV PATH】:配置环境变量
  4. 构建镜像

    docker build -t='jdk1.8' .
    

    . 表示当前目录,不能丢

  5. 等待 Docerfile 里的命令执行完成,构建成功

DockerMaven 插件进行微服务部署

DockerMaven 插件 Github 地址:https://github.com/spotify/docker-maven-plugin#specify-build-info-in-the-pom

微服务部署

手动部署:首先基于源码打包生成jar包(或war包),将jar包(或war包)上传至虚拟机并拷贝至JDK容器

通过使用 Maven 插件实现自动部署,对于数量众多的微服务,手动部署非常麻烦且容易出错,所以建议使用自动部署。

步骤

总体步骤:

  • DockerMaven 先将项目打成 Jar 包
  • 再将 Jar 包打包成 Image 镜像
  • 之后将镜像上传到私有仓库
  • 最后我们直接去 Doker 里面通过镜像创建容器去运行访问就可以了

修改主机配置

  1. 修改主机的 docker.service 文件,使其可以远程访问

    vim /lib/systemd/system/docker.service
    

    打开 docker.service 文件,将

    ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
    

    修改为:

    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
    
  2. 重启服务

    systemctl daemon-reload
    
  3. 重新启动 Docker

    systemctl restart docker
    
  4. 启动私人仓库

    docker start registry
    

修改防火墙规则

  1. 修改防火墙暴露 2375 端口(开放端口很重要,困了好久)

    firewall-cmd --zone=public --add-port=2375/tcp --permanent #开放2375/tcp端口
    
  2. 更新防火墙,使防火墙设置生效

    firewall-cmd --reload
    
  3. 查看防火墙开放端口

    firewall-cmd --zone=public --list-ports
    

IDEA 插件配置

  1. 在 pom.xml 中添加 plugin 配置

    <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.1.0</version><executions><execution><id>build-image</id><phase>package</phase>   <!--绑定 maven package 命令--><goals><goal>build</goal></goals></execution></executions><configuration><!--打包后的镜像名称--><imageName>${project.artifactId}:${project.version}</imageName><!--doker 远程地址--><dockerHost>http://192.168.3.39:2375</dockerHost><!--基于基础镜像构建--><baseImage>jdk1.8</baseImage><!--运行 jar 包的命令--><entryPoint>["java","-jar","-Dspring.profiles.active=dev","/${project.build.finalName}.jar"]</entryPoint><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration></plugin></plugins>
    </build>
    
  2. 执行 Maven 的 package 命令

  1. 等待打包完成

  2. 在宿主机上查看镜像

    docker images
    

    可以看到我们以项目名命名的镜像,版本为 pom.xml 中的版本

  3. 创建容器 test1,端口映射到 7070

    docker run -di --name=test1 -p 7070:7070 dockertest:0.0.1-SNAPSHOT
    
  4. 浏览器访问【宿主机 IP:端口】即可以正常访问。

Docker 容器技术,让你不再为环境而烦恼相关推荐

  1. 环境变量方式使用 Secret - 每天5分钟玩转 Docker 容器技术(158)

    通过 Volume 使用 Secret,容器必须从文件读取数据,会稍显麻烦,Kubernetes 还支持通过环境变量使用 Secret. Pod 配置文件示例如下: 创建 Pod 并读取 Secret ...

  2. Linux 运维工作中的经典应用ansible(批量管理)Docker容器技术(环境的快速搭建)...

    一 Ansible自动化运维工具 Python 在运维工作中的经典应用ansible(批量管理操作)1.安装ansible(需要bese epel 2种源) wget -O /etc/yum.repo ...

  3. 4、《每天5分钟玩转Docker容器技术》学习--Docker环境搭建

    ------------------------------------重要说明------------------------------------ 本文内容都是参考Cloudman系列进行学习, ...

  4. stack 的优势 - 每天5分钟玩转 Docker 容器技术(113)

    stack 将应用所包含的 service,依赖的 secret.voluem 等资源,以及它们之间的关系定义在一个 YAML 文件中.相比较手工执行命令或是脚本,stack 有明显的优势. YAML ...

  5. 每天5分钟玩转docker容器技术 pdf_stack 的优势 每天5分钟玩转 Docker 容器技术(113)...

    第113篇 stack 的优势 stack 将应用所包含的 service,依赖的 secret.voluem 等资源,以及它们之间的关系定义在一个 YAML 文件中.相比较手工执行命令或是脚本,st ...

  6. docker pull下载很慢_一文了解Docker容器技术的操作

    一文了解Docker容器技术的操作 前言 相信点进这篇文章的Coder,不管是在各大技术论坛上.技术交流群,亦或招聘网上,应该都有见到过Doker容器技术的面孔,随着社会节奏的加快以及迫于生活的压力, ...

  7. Docker容器技术 笔记

    Docker容器技术 Docker是一门平台级别的技术,涉及的范围很广,所以,在开始之前,请确保你完成:Java SpringBoot 篇(推荐完成SpringCloud篇再来)视频教程及之前全部路线 ...

  8. 5、《每天5分钟玩转Docker容器技术》学习--Docker镜像

    ------------------------------------重要说明------------------------------------ 本文内容都是参考Cloudman系列进行学习, ...

  9. 用 Label 控制 Service 的位置 - 每天5分钟玩转 Docker 容器技术(106)

    上一节我们讨论了 Service 部署的两种模式:global mode 和 replicated mode.无论采用 global mode 还是 replicated mode,副本运行在哪些节点 ...

  10. 日志管理之 Docker logs - 每天5分钟玩转 Docker 容器技术(87)

    高效的监控和日志管理对保持生产系统持续稳定地运行以及排查问题至关重要. 在微服务架构中,由于容器的数量众多以及快速变化的特性使得记录日志和监控变得越来越重要.考虑到容器短暂和不固定的生命周期,当我们需 ...

最新文章

  1. [Cake] 1. CI中的Cake
  2. Android架构思考(模块化、多进程)
  3. 致新手——OpenStack云倒底是什么?
  4. 计算机中丢失vcomp140.dll,Vcomp140.dll文件
  5. Linux 安装loadrunner 碰到的问题
  6. 写出记录型信号量中的wait操作代码_操作系统进程的同步与互斥及经典同步与互斥问题...
  7. gc java 单核_JAVA应用性能监控之JVM层GC调优
  8. 利用halcon的深度学习网络进行目标检测
  9. RGB888颜色码与十六位(RGB565)颜色码的转换
  10. python统计pdf字数_使用python统计tex字数(一):最精简版本
  11. 浮沉四十年,国产饮料吹起反攻号角
  12. JS实现拼音搜索汉字(支持首字母匹配)
  13. amr文件怎么转换成mp3格式?
  14. 一站式WPF--依赖属性(DependencyProperty)一
  15. matlab中format使用方法
  16. 怎样恢复sd卡数据?靠这几个方法
  17. java用poi操作excel,2003,2007,2010
  18. 【HTML + CSS】如何引入icon图标
  19. STM32 输入捕获测量脉冲周期/频率
  20. 如何用计算机技术,如何利用计算机技术快速高效建立学籍档案

热门文章

  1. Vscode+phpstudy配置PHP环境,并在服务器中运行。
  2. oracle安装与使用
  3. MATLAB中广义极值分布的分析、测试、个人理解
  4. rdesktop参数
  5. 如何混淆JavaWeb代码
  6. MySQL数据同步到ES集群(MySQL数据库与ElasticSearch全文检索的同步)
  7. (机器学习)随机森林填补缺失值的思路和代码逐行详解
  8. 嵌入式主板助力电力巡检
  9. java 图像合成加相框_合成走进相框人物照片效果的PS教程
  10. 解决linux对D盘(非系统盘)只有只读权限,无法创建文件夹 (linux 重新挂载盘符)