【Docker】入门到精通(常用命令解读)

一、准备工作

1.配置Docker的yum库

首先要安装一个yum工具

yum install -y yum-utils

安装成功后,执行命令,配置Docker的yum源:

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

2.安装Docker

执行命令,安装Docker

yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

3.启动和校验

# 启动Docker
systemctl start docker

# 停止Docker
systemctl stop docker

# 重启
systemctl restart docker

# 设置开机自启
systemctl enable docker

# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps

4.配置镜像加速

4.1注册阿里云账号

首先访问阿里云网站: https://www.aliyun.com/ 注册一个账号。

4.2开通镜像服务

在首页的产品中,找到阿里云的容器镜像服务

在这里插入图片描述

点击后进入控制台:

在这里插入图片描述

首次可能需要选择立刻开通,然后进入控制台。

4.3.配置镜像加速

找到镜像工具下的镜像加速器

在这里插入图片描述
页面向下滚动,即可找到配置的文档说明:
在这里插入图片描述
具体命令如下:

# 创建目录
mkdir -p /etc/docker

# 复制内容,注意把其中的镜像加速地址改成你自己的
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF

# 重新加载配置
systemctl daemon-reload

# 重启Docker
systemctl restart docker

二、准备工作

1.常见的命令介绍

命令说明文档地址
docker pull拉取镜像docker pull
docker push推送镜像到DockerRegistrydocker push
docker images查看本地镜像docker images
docker rmi删除本地镜像docker rmi
docker run创建并运行容器(不能重复创建)docker run
docker stop停止指定容器docker stop
docker start启动指定容器docker start
docker restart重新启动容器docker restart
docker rm删除指定容器docs.docker.com
docker ps查看容器docker ps
docker logs查看容器运行日志docker logs
docker exec进入容器docker exec
docker save保存镜像到本地压缩文件docker save
docker load加载本地压缩文件到镜像docker load
docker inspect查看容器详细信息docker inspect

用一副图来表示这些命令的关系:
在这里插入图片描述
补充:

默认情况下,每次重启虚拟机我们都需要手动启动Docker和Docker中的容器。通过命令可以实现开机自启:

# Docker开机自启
systemctl enable docker

# Docker容器开机自启
docker update --restart=always [容器名/容器id]

2.演示

以Nginx为例给大家演示上述命令:DockerHub网址:https://hub-stage.docker.com/search

第1步,去DockerHub查看nginx镜像仓库及相关信息

在这里插入图片描述

第2步,拉取Nginx镜像
docker pull nginx

在这里插入图片描述

第3步,查看镜像
docker images

在这里插入图片描述

# 第4步,创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx

在这里插入图片描述

命令说明:

  • d : 表示容器后台运行
  • --name :容器名,可以任意,不可重复
  • -p :端口映射,前面80表示宿主机的端口,后面80表示容器的端口,容器是隔离环境,即容器内不做端口映射是无法访问到的,上述映射关系即所有请求到宿主机80端口的请求会转发到容器的80端口
    nginx : 前面加载的镜像名
第5步,查看运行中容器
docker ps

在这里插入图片描述

# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
第6步,停止容器
docker stop nginx
第7步,再次启动nginx容器
docker start nginx
第8步,查看容器详细信息
docker inspect nginx
第9步,进入容器,查看容器内目录
docker exec -it nginx bash

在这里插入图片描述

第10步,删除容器
docker rm nginx
发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx

3.命令别名

给常用Docker命令起别名,方便我们访问:

# 修改/root/.bashrc文件
vi /root/.bashrc
内容如下:
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

然后,执行命令使别名生效

source /root/.bashrc

现在,就可以使用快捷命令查看镜像和容器了:
在这里插入图片描述

三、数据卷

数据卷(volume)是一个虚拟目录,是容器内目录宿主机****目录之间映射的桥梁。类似与宿主机与容器端口映射

以Nginx为例,我们知道Nginx中有两个关键的目录:

  • html:放置一些静态资源
  • conf:放置配置文件

如果我们要让Nginx代理我们的静态资源,最好是放到html目录;如果我们要修改Nginx的配置,最好是找到conf下的nginx.conf文件。

但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。如图:

在这里插入图片描述

在上图中:

  • 我们创建了两个数据卷:confhtml
  • Nginx容器内部的conf目录和html目录分别与两个数据卷关联。
  • 而数据卷conf和html分别指向了宿主机的/var/lib/docker/volumes/conf/_data目录和/var/lib/docker/volumes/html/_data目录

这样以来,容器内的confhtml目录就 与宿主机的confhtml目录关联起来,我们称为挂载。此时,我们操作宿主机的/var/lib/docker/volumes/html/_data就是在操作容器内的/usr/share/nginx/html/_data目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。

3.1.数据卷命令

命令说明文档地址
docker volume create创建数据卷docker volume create
docker volume ls查看所有数据卷docs.docker.com
docker volume rm删除指定数据卷docs.docker.com
docker volume inspect查看某个数据卷的详情docs.docker.com
docker volume prune清除数据卷docker volume prune

注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建

演示环节:演示一下nginx的html目录挂载:

1.首先查看以下已有的数据集
docker volume ls

容器默认创建的数据卷:

在这里插入图片描述

2.然后创建一个自己的数据卷
docker volume create html
# 查看数据卷
docker volume ls

在这里插入图片描述

3.创建容器并指定数据卷,注意通过 -v 参数来指定数据卷
docker run -d --name qknginx -p 80:80 -v html:/usr/share/nginx/html nginx

在这里插入图片描述
命令说明:

  • -v : 表示数据卷挂载
  • html :之前创建的数据卷
  • /usr/share/nginx/html :qknginx这个容器内的映射路径,容器的所有数据卷映射路径都在宿主机的/var/lib/docker/volumes目录下
 cd /var/lib/docker/volumes/html/_data/

在这里插入图片描述

3.查看数据卷详情
docker volume inspect html

在这里插入图片描述

查看容器详情:

 docker inspect qknginx

可以看到数据卷挂载情况:

在这里插入图片描述

也可以进入到容器里相应的目录下查看:
在这里插入图片描述
可以看到宿主机目录下文件和容器内文件一模一样,可以宿主机内修改文件,查看页面情况。

3.2.挂载本地目录或文件

上述情况演示的是数据卷挂载的一种方式,我们也可以在创建运行容器的时候直接把本地路径与容器路径做映射:

演示,删除并重新创建mysql容器,并完成本地目录挂载:

  • 挂载/root/mysql/data到容器内的/var/lib/mysql目录

  • 挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录(初始化的SQL脚本目录)

  • 挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录(这个是MySQL配置文件目录)

    3.2.1 本地先创建3个目录
    mkdir -p /mysql/data
    mkdir -p /mysql/init
    mkdir -p /mysql/conf
    
    3.2.2 创建容器并挂载数据卷
    1.删除原来的MySQL容器
    docker rm -f mysql
    
    2.进入root目录
    cd ~
    
    3.创建并运行新mysql容器,挂载本地目录
    docker run -d \
      --name mysql \
      -p 3306:3306 \
      -e TZ=Asia/Shanghai \
      -e MYSQL_ROOT_PASSWORD=1234 \
      -v ./mysql/data:/var/lib/mysql \
      -v ./mysql/conf:/etc/mysql/conf.d \
      -v ./mysql/init:/docker-entrypoint-initdb.d \
      mysql
    
    4.查看root目录,可以发现~/mysql/data目录已经自动创建好了
    ll mysql
    
    结果:
    总用量 4
    drwxr-xr-x. 2 root    root   20 5月  19 15:11 conf
    drwxr-xr-x. 7 polkitd root 4096 5月  19 15:11 data
    drwxr-xr-x. 2 root    root   23 5月  19 15:11 init
    

    使用navicat连接工具查看:数据库初始化完成(备注:我在mysql/init和/mysql/config目录下放了自己的一些初始化数据,你也可以放一些自己初始化数据到相应的目录下)

在这里插入图片描述

四、镜像

前面我们一直在使用别人准备好的镜像,那如果我要部署一个Java项目,把它打包为一个镜像该怎么做呢?

举个例子,我们要从0部署一个Java应用,大概流程是这样:

  • 准备一个linux服务(CentOS或者Ubuntu均可)

  • 安装并配置JDK

  • 上传Jar包

  • 运行jar包
    那因此,我们打包镜像也是分成这么几步:

    • 准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可)

    • 安装并配置JDK

    • 拷贝jar包

    • 配置启动脚本

4.1.提前准备好一个基础镜像

在这里插入图片描述

4.2.加载镜像文件

docker load -i jdk.tar

在这里插入图片描述

4.3.制作DockerFile

在这里插入图片描述

# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

4.4.构建镜像

docker build -t qkjdk:202424 .

命令说明:

  • docker build : 就是构建一个docker镜像
  • -t qkjdk:202424-t参数是指定镜像的名称(repositorytag
  • . : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录:
    • # 直接指定Dockerfile目录
      docker build -t qkjdk:202424 /home/qk
      

在这里插入图片描述

4.4.查看构建的镜像

docker images

在这里插入图片描述

4.5.然后尝试运行该镜像

docker run -d --name kk -p 8080:8080 qkjdk:202424

在这里插入图片描述

4.6.最后,导出镜像文件

docker export -o testjdk.tar kk

命令说明:

  • docker export: 就是导出docker镜像
  • -o testjdk.tar-o参数tar文件的名称
  • kk : 最后的kk就是容器名称

在这里插入图片描述

可以看出镜像文件已经被导出为testjdk.tar

4.7.重新加载运行导出的镜像

docker import testjdk.tar bsp-as-is:2024jdk

命令说明:

  • docker import: 就是导入docker镜像文件
  • testjdk.tar :镜像文件压缩包文件的名称
  • bsp-as-is:2024jdk : repositorytag
# 1.使用下面的命令创建并运行容器
docker run -itd --name qkjdk bsp-as-is:2024jdk /bin/bash
# 2.查看运行的容器
docker ps
# 结果
CONTAINER ID   IMAGE               COMMAND                  CREATED             STATUS             PORTS                                                  NAMES
ab55427e7d1e   bsp-as-is:2024jdk   "/bin/bash"              8 seconds ago       Up 7 seconds                                                              qkjdk
c60db535f84d   mysql               "docker-entrypoint.s…"   About an hour ago   Up About an hour   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   qkmysql
b2b17b941c44   nginx               "/docker-entrypoint.…"   3 hours ago         Up 3 hours         0.0.0.0:80->80/tcp, :::80->80/tcp                      qknginx
# 3.进入容器
docker exec -it qkjdk bash

在这里插入图片描述

注意:Docker容器运行错误分析

当您在运行Docker容器时出现"docker: Error response from daemon: No command specified"错误时,这意味着您没有在命令中指定容器要运行的命令。每个容器都需要一个命令来执行,否则Docker将无法启动容器。

在这里插入图片描述

解决方法
要解决这个问题,您需要在运行容器时指定要在其中执行的命令。

以下是几个示例:1.运行一个交互式的容器
如果您希望在容器中运行交互式命令行会话,可以使用it选项来启动容器,并在命令中指定要运行的Shell:

docker run -itd --name qkjdk bsp-as-is:2024jdk /bin/bash

这将在容器中启动一个交互式的Bash会话。

五、网路

容器是隔离环境,在创建容器的时候,容器会创建一个默认的网桥:

 docker inspect qkjdk

在这里插入图片描述

同一网段的容器之间可以相互访问,但是不同网段的容器就无法访问,此时就需要自定义一个网桥,同一网桥下的容器之间可以相互访问

网络常见命令有:

命令说明文档地址
docker network create创建一个网络docker network create
docker network ls查看所有网络docs.docker.com
docker network rm删除指定网络docs.docker.com
docker network prune清除未使用的网络docs.docker.com
docker network connect使指定容器连接加入某网络docs.docker.com
docker network disconnect使指定容器连接离开某网络docker network disconnect
docker network inspect查看网络详细信息docker network inspect
5.1.当前宿主机下的所有网桥:

在这里插入图片描述

5.2.创建一个网桥
docker network create qqnet
5.3.为容器分配一个网桥
docker network connect qknet qkjdk

命令说明:

  • docker network connect: 使指定容器连接加入某网络

  • qknet :网桥名称

  • qkjdk : 容器名称

    查看qkjdk容器的详情

    在这里插入图片描述

    5.4.在容器创建的时候就为其分配网桥
    docker run -itd --name qkjdk --network qknet -p 8080:8080 bsp-as-is:2024jdk /bin/bash
    

    命令说明:

    • docker run: 运行容器

    • -itd :后台运行容器,并指定容器的交互命令

    • --network qknet : 容器分配的网桥名称

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

    • bsp-as-is:2024jdk : 镜像的repositorytag

    • /bin/bash : 默认的交互命令

      查看容器详情:

      docker inspect qkjdk
      

      在这里插入图片描述

总结

  • 在自定义网络中,可以给容器起多个别名,默认的别名是容器名本身
  • 在同一个自定义网络中的容器,可以通过别名互相访问
  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值