Docker

本文详细介绍了Docker的安装、常用命令,如启动和停止Docker,管理镜像和容器,以及数据卷的使用。还提到了Docker镜像加速器,如阿里云镜像源,和Dockerfile与DockerCompose在应用部署中的作用。此外,讨论了Docker的四种网络模式,强调了用户自定义网络与默认bridge网络的区别。
摘要由CSDN通过智能技术生成

一、入门&简介

  • Docker可以让开发者打包他们的应用以及依赖包到一个轻量、可移植的容器中,然后发布到任何可流行的Linux机器上
  • 容器时完全使用沙箱机制,项目隔离(Docker里有多个容器,每个容器之间相互隔离,互不影响)。
  • 容器性能开销极低。
  • 从17.03后分为CE(Community)社区版和EE(Enterprise)企业版。
  • 总结:Docker是一种容器技术,用于解决跨环境软件迁移问题

(一)安装

  1. 配置阿里云yum源,详情可看:配置yum源
  2. 更新yum包为最新yum update
  3. 配置阿里云的Docker yum源&安装所需软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. 查看yum安装包中Docker的版本yum list docker-ce --showduplicates
  2. 安装Docker(自动选择最新版)yum install docker-ce -y
  3. 验证是否安装成功docker -v
  4. 启动Docker
systemctl enable docker
systemctl start docker

(二)Docker架构

在这里插入图片描述

(三)Docker镜像加速器

因为Docker的官方镜像在国外,所以拉取镜像很慢,这时就需要一个国内的镜像源来代替。
阿里云镜像加速教程

补充:阿里云不能用了,其他通过github的镜像加速

# 写入镜像配置
sudo tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
        "https://docker.m.daocloud.io",
        "https://dockerproxy.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://docker.nju.edu.cn"
    ]
}
EOF
# 重启docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker

二、Docker命令

(一)daemon命令(开启关闭Docker等)

  1. 启动dockersystemctl start docker,查看docker状态、重启等命令类似(使用systemctl)。
  2. 清理docker数据docker system prune,用于清理没有使用的数据,包括镜像数据,已经停止的容器。
  3. 查看某个容器日志docker logs 容器ID/容器名
    -f:显示实时log(和Linux的tail -f作用类似)
    --tail 20:查看日志最后20行
    eg:docker logs -f -t -n=5 容器名,-f实时跟踪,-t显示时间戳,-n=5显示最后5行

(二)image命令

  1. 查看本地镜像docker images
    在这里插入图片描述

  2. 搜索远程镜像docker search redis
    在这里插入图片描述

  3. 拉取远程镜像
    不指定版本号,默认lates:docker pull redis
    指定版本号:docker pull redis:3.2
    查看有哪些版本:进入docker hub官网>>搜索镜像名>>点进去可以查看该镜像都有哪些版本。
    视频教程

  4. 删除本地镜像
    通过IMAGE ID删除:docker rmi image的ID
    通过镜像名删除:docker rmi redis(如果有多个版本,可以指定删除版本docker rmi redis:5.0
    一次性删除所有镜像:
    在这里插入图片描述

(三)container命令(重点)

视频讲解

  1. 查看容器docker ps
    A. 不加参数:查看正在运行的容器
    B. -a查看所有容器(包括running的、exited的)

  2. 创建容器
    A.
    docker run -it --name=redisTest redis:5.0交互式容器,exit退出后容器关闭)
    -i:保持容器运行,exit后容器自动关闭
    -t:为容器分配一个伪终端,通常与-i连用
    -name:指定容器name
    redis:5.0:该容器的镜像及版本
    B.
    docker run -id --name=redisTest redis:5.0 守护式容器,退出后容器不会关闭)
    -d:后台运行创建容器(命令完成后不会自动进入容器,需要命令进入,当使用exit退出容器时并不会关闭容器的运行)

  3. 进入容器docker exec -it 容器名 /bin/bash

  4. 启动容器docker start 容器名

  5. 停止容器docker stop 容器名

  6. 删除容器docker rm 容器ID/容器名(running的容器无法删除)
    删除所有容器:在这里插入图片描述

  7. 查看容器详细信息docker inspect 容器名

  8. 开启容器自启动
    docker update --restart=always 容器名

  9. 关闭容器自启动
    docker update --restart=no 容器名

  10. 案例分析:
    创建容器时,我将容器内的目录挂载到了宿主机名为es-plugins的目录下,现在如何找到这个es-plugins在哪个具体的路径下?
    A. 先查询容器都挂载了哪些数据卷,docker inspect es
    在这里插入图片描述
    B. 查看某文件具体在宿主机的哪个路径,docker volume inspect es-plugins
    在这里插入图片描述

三、Docker数据卷

(一)概念&作用

在这里插入图片描述
两个容器之间通信:

  • 两个容器启动时都挂载同一个目录,这样读取目录文件即可实现通信。
  • 通过数据卷容器实现。

(二)配置数据卷

在这里插入图片描述
挂载多个目录:
在这里插入图片描述

(三)配置数据卷容器

在这里插入图片描述
配置数据卷命令:
在这里插入图片描述

(五)数据卷相关命令

  1. 查看宿主机都有哪些数据卷
    docker volume ls
  2. 查看某个数据卷的详细信息
    docker volume inspect es

四、Docker应用部署

常见步骤:

  • 搜索镜像
  • 拉取镜像
  • 创建容器
    在这里插入图片描述

(一)MySQL部署


Docker安装MySQL 8.0并挂载数据及配置文件
高版本Mysql使用Navicat连接错误解决

(二)Nginx部署

Docker 安装 Nginx 容器 (完整详细版)

(三)Nacos部署

注意::Nacos好像需要Mysql的支持,先run Mysql再装nacos(其中mysql高版本连接会出错,解决办法见上面)

(四)FTP部署

  1. pull镜像
    docker pull fauria/vsftpd
  2. 创建容器
docker run -d -p 2121:21 -p 2020:20 -p 21100-21110:21100-21110 \
-v /home/dispatch/ftp/root:/home/vsftpd/ftp \
-e FTP_USER=ftp \
-e FTP_PASS=admin@123.com \
 -e PASV_ADDRESS=192.168.32.50 \
-e PASV_MIN_PORT=21100 \
-e PASV_MAX_PORT=21110 \
--name vsftpd \
--restart=always fauria/vsftpd

2121:21将Docker的21端口暴露到宿主机的2121端口上,2020:20端口同理。
用户名ftp,密码admin@123.com
PASV_ADDRESS为宿主机IP。
-v挂载时,右边docker挂载目录格式如下/home/vsftpd/${设置的ftp的账户名},这里我的FTP_USER=ftp,所以路径是/home/vsftpd/ftp

参考文章

五、Dockerfile

(一)Docker镜像原理

在这里插入图片描述
视频讲解

(二)容器转为镜像

在这里插入图片描述
因为内容不会跟随镜像,所有更常用的是dockerfile的形式。

(三)dockerfile概念及作用

在这里插入图片描述
视频讲解

(四)使用dockerfile部署springboot项目

视频讲解

(五)示例

FROM java:8
ARG runEnvArg
ARG nacosUrlArg
ARG registerIpArg
ENV runEnvEnv $runEnvArg
ENV nacosUrlEnv $nacosUrlArg
ENV registerIpEnv $registerIpArg
VOLUME 	/tmp
COPY hisi-pex-db-operation-1.0.0.jar hisi-pex-db-operation-1.0.0.jar
RUN bash -c "touch /hisi-pex-db-operation-1.0.0.jar"
EXPOSE 9250
ENTRYPOINT ["java","-jar","-DregisterIp=${registerIpEnv}","-DrunEnv=${runEnvEnv}","-DnacosUrl=${nacosUrlEnv}","hisi-pex-db-operation-1.0.0.jar"]

FROM

  • 指定基础镜像,当前应用是基于JAVA的应用,所以FROM java:8,相当于将java作为基础镜像,在该镜像上做个性化镜像。

COPE

  • 从上下文目录中复制文件或者目录到容器里指定路径。
  • 上下文目录,默认上下文路径就是 Dockerfile 所在的位置。
  • 上述例子表示,将Dockerfile所在位置的jar包复制到容器中(默认容器根目录)。

六、Docker Compose

DockerCompose和Dockerfile区别
Dockerfile 记录单个镜像的构建过程, docker-compse.yml 记录一个项目(project, 一般是多个镜像)的构建过程。

你说有些教程用了 dockerfile+docker-compose, 是因为 docker-compose.yml 本身没有镜像构建的信息,如果镜像是从 docker registry 拉取下来的,那么 Dockerfile 就不需要;如果镜像是需要 build 的,那就需要提供 Dockerfile。

docker-compose配合Dockerfile使用
服务编排简介:
在这里插入图片描述
Docker Compose就是一个实现了服务编排的工具:
在这里插入图片描述

Docker Compose安装使用:

  1. 下载docker-compose,将v2.2.2替换为你想要的版本。
    curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

如果在线下载很慢,可以访问github挂代理下载
uname - s获取当前操作系统名称 uname -m获取当前操作系统架构

  1. 如果是使用curl在线下载,忽略第3、4步。
  2. 检查下载的文件名是否为docker-compose,不是请用mv改名。
  3. 将下载的 Docker Compose 安装文件移动到 /usr/local/bin/ 目录下,这样它就可以在系统的 PATH 中被找到。
    mv docker-compose /usr/local/bin/
  4. 授予 Docker Compose 二进制文件执行权限。
    chmod +x /usr/local/bin/docker-compose
  5. 验证安装是否成功。
    docker-compose --version

七、Docker Network

(一)四种网络模式

Docker四种网络模式
bridge详解

docker 安装好之后默认会创建三个虚拟网卡,可以使用 docker network ls 命令来查看,三个虚拟网卡和 VMware 的类似。默认三个虚拟网卡的IP 地址会随着容器的启动停止而变动。

 b@ubuntu20:~$ docker network ls
 NETWORK ID          NAME                DRIVER              SCOPE
 68633255abb2        bridge              bridge              local
 adea9d9ae839        host                host                local
 517ed92475cc        none                null                local
  • bridge 是默认的网卡,网络驱动是 bridge 模式,类似于 Vmware 的 NAT 模式,如果容器启动时不指定网卡,则会默认连接到这块网卡上。如果需要访问容器内部的端口需要设置端口映射。并且默认的bridge网卡内部,各个容器之间不能通过容器名来访问(理由下面讲)。
  • host 是直接使用主机的网络,网络驱动是 host 模式,类似于 Vmware 的桥接模式,可能会和主机的端口存在冲突,不需要设置端口映射即可连接到容器端口。
  • none 禁止所有联网,没有网络驱动,一般情况下用不到。

着重看一下自定义网络

  1. 创建的自定义网络,默认是bridge模式。
  2. 如果在创建容器时没有使用-p设置端口映射,那么外部是访问不到docker内创建的容器的,但是同一个网络内的各个容器是可以互相访问的,并且可以通过容器名进行通信
  3. 同一个自定义网络下,容器内部使用localhost127.0.0.1代表的是该容器的回环地址(也就是这个容器本身),而不是代表的宿主机。

默认网络和自定义网络区别
说到这里可能有人会问了,那默认的网卡的网卡驱动也是 bridge 模式的,用户自定义的网络也是 bridge 模式,不就是换了一个名字吗,为什么默认的网卡不可以使用别名进行 IP 地址解析呢?
官方解释的默认bridge网卡和自定义bridge网卡的区别:

User-defined bridges provide automatic DNS resolution between containers.
Containers on the default bridge network can only access each other by IP addresses, unless you use the --link option, which is considered legacy. On a user-defined bridge network, containers can resolve each other by name or alias.

简单来说就是:用户自定义的网卡可以在容器之间提供自动的 DNS 解析,缺省的桥接网络上的容器只能通过 IP 地址互相访问,除非使用 --link 参数。在用户自定义的网卡上,容器直接可以通过名称或者别名相互解析。

参考链接

(二)Network命令

docker network connect参考文章1
docker network详解

  1. 查看当前网络列表docker network list
  2. 查看网络列表里某个网络详细信息docker network inspect bridge
[root@localhost ~]# docker network --help

Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

Run 'docker network COMMAND --help' for more information on a command.
  • connect:连接一个容器到指定网络
  • create:创建一个container模式的网络
  • disconnect:将某个容器从指定网络移除
  • inspect:查看某个网络详细信息
  • ls:查看当前网络列表(list的缩写)
  • prune:删除所有未使用的网络
  • rm:删除某个网络

示例如下:

  1. 将mysql容器连接到bridge网络
    docker network connect bridge mysql
    连接时给容器一个指定的ip
    docker network connect --ip 192.168.32.100 bridge mysql
    注意: connect是为容器新增一张指定网络的网卡,而不是将本有的网络移动为其他网络。
    (当使用run创建一个容器时,不指定就默认是bridge网络,这时使用connect容器就会新增一张网卡连接到指定网络,但是该容器还在bridge网络中)
  2. 创建一个网络
    docker network create mynetwork
  3. 将mysql容器从bridge网络移除
    docker network disconnnect bridge mysql
  4. 查看bridge网络详细信息
    docker network inspect bridge
  5. 删除自建的mynetwork网络
    docker network rm mynetwork
  6. 测试容器之间网络是否互通
    使用docker exec -it redis /bin/bash进入容器后,使用ping nginx测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值