目录

1.docker介绍

2.安装docker(本机默认使用的centos)

2.1卸载docker

2.2配置Docker的yum库

1)安装yum工具

2)配置Docker的yum源(更新为阿里云源)

2.3安装Docker

2.4配置docker镜像加速

2.5.安装mysql(其实验证镜像能否成功拉取)

3.Docker命令解读

1)查看镜像docker images

2)拉取镜像 docker pull

3)镜像删除docker rmi

3.2容器

1)运行容器docker run

2)停止容器docker stop

3)强停容器docker kill

4)查看运行容器docker ps

5)删除容器docker rm

6)启动容器docker start

7)重启容器docker restart

8)查看容器状态docker stats

9)查看容器日志docker logs

10)查看容器进程信息docker top

11)进入容器docker exec/attach

12)起别名

3.3保存镜像

1)镜像保存docker save

2)镜像加载docker load

4 Docker存储

1)数据卷挂载

2)本地目录挂载

3).Dockerfile​编辑​编辑

5.docker网络


1.docker介绍

我们利用docker安装应用时,docker会自动搜索并下载应用镜像(image).镜像不仅包含应用本身,还包含应用运行所需要的环境,配置,系统函数库。docker会在运行镜像时创建一个隔离环境,称为容器

1).容器(Container)

  • 容器是镜像创建的运行实例,它是一个轻量级的、可执行的独立软件包,包含了运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。
  • 容器化技术使得软件可以在几乎任何地方以相同的方式运行,解决了“在我的机器上可以运行”的问题。

2).镜像(Image):

  • 镜像是构建容器的模板,它是一个只读的模板,用于创建Docker容器。
  • 镜像通常是通过一个Dockerfile定义的,Dockerfile包含了构建镜像所需的指令

3).仓库(Registry)

  • Docker仓库用于存储和分发Docker镜像
  • 公共的Docker Hub是最大的Docker镜像仓库,用户可以在那里找到、分享和运行高质量的Docker镜像。

主要特点:

  • 可移植性:Docker容器可以在任何支持Docker的操作系统上运行,应用部署和迁移变得非常简单。
  • 隔离性容器之间是相互隔离的,一个容器的崩溃不会影响其他容器。
  • 轻量级:容器不需要像虚拟机那样启动一个完整的操作系统,因此它们可以快速启动,并且占用更少的系统资源。
  • 安全性:容器运行在自己的隔离环境中,并且可以限制对系统资源的访问,从而提供了额外的安全层。

工作流程:

  1. 编写Dockerfile:定义应用的依赖、环境变量、配置等。
  2. 构建镜像:通过Dockerfile构建应用镜像。
  3. 运行容器:从镜像启动一个或多个容器实例。
  4. 管理容器:启动、停止、监控和删除容器。
  5. 共享镜像:将构建好的镜像推送到Docker仓库,以便在其他机器上使用
  1. 编写 Dockerfile

    • 做什么:创建一个名为 Dockerfile 的文本文件。它包含了一系列指令,告诉 Docker 如何一步步地构建你的应用镜像。

    • 示例指令

      • FROM python:3.9-slim:指定基础镜像。

      • COPY . /app:将本地代码复制到镜像内的 /app 目录。

      • RUN pip install -r requirements.txt:在镜像内执行命令安装依赖。

      • CMD ["python", "app.py"]:指定容器启动时默认运行的命令。

  2. 构建镜像

    • 做什么:执行 docker build -t my-app . 命令。

    • 过程:Docker 守护进程会读取 Dockerfile,逐步执行其中的指令,并为每一步创建一个新的镜像层,最终生成一个可命名的镜像(如 my-app:latest)。

  3. (可选) 推送至镜像仓库

    • 做什么:执行 docker push my-registry.com/my-app:latest 命令。

    • 目的:将本地构建好的镜像上传到像 Docker Hub、Google Container Registry 或私有仓库这样的镜像仓库中,以便在其他地方拉取和使用。

  4. 拉取镜像

    • 做什么:在需要运行该应用的其他机器上,执行 docker pull my-registry.com/my-app:latest 命令。

    • 目的:从镜像仓库下载指定的镜像到本地。

  5. 运行容器

    • 做什么:执行 docker run -d -p 8080:80 --name my-running-app my-app 命令。

    • 过程:Docker 守护进程根据指定的镜像创建一个可写的容器层,并按照配置(如端口映射、环境变量等)启动容器内的进程。

2.安装docker(本机默认使用的centos)

2.1卸载docker

yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine \
    docker-selinux

2.2配置Docker的yum库

Docker的yum源是一个软件仓库,它允许用户通过yum包管理器在基于Red Hat的Linux发行版(如CentOS、Fedora)上轻松地安装、更新和卸载Docker及其相关组件。Yum(Yellowdog Updater, Modified)是一个用于RPM-based Linux系统的自动化更新和软件包安装的工具。

1)安装yum工具
yum install -y yum-utils

如果报错显示   Cannot find a valid baseurl for repo: base/7/x86_64

1)备份原有的repo文件(可选,有备无患)

sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

2)下载阿里云的repo配置文件

sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

或者

sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

3)刷新YUM元数据缓存
更新完repo文件后,需要清空并重建YUM的元数据缓存,以便让它认识新的仓库配置:

sudo yum clean all
sudo yum makecache

4)使用阿里云源安装yum-utils

sudo yum --disablerepo=\* --enablerepo=aliyun install -y yum-utils

2)配置Docker的yum源(更新为阿里云源)
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

更新yum,建立缓存

sudo yum makecache fast

2.3安装Docker

安装命令

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

一些启动和校验命令

#查看Docker版本
docker -v

# 启动Docker
systemctl start docker

#列出运行在本地Docker主机上的所有镜像
docker images

# 停止Docker
systemctl stop docker

# 重启
systemctl restart docker

# 设置开机自启
systemctl enable docker

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

当未启动时,查看镜像(docker images)结果为:

启动Docker后的查看镜像结果:

2.4配置docker镜像加速

之前安装Docker时,配置的阿里加速镜像现在停用失效,导致网络无法访问
PS:听网友说是阿里加速镜像已停用

如果镜像有问题的话,会报错:

docker: Error response from daemon: Get “https://registry-1.docker.io/v2/”: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).

解决方式:

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

# 复制内容
tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
        "http://hub-mirror.c.163.com",
        "https://mirrors.tuna.tsinghua.edu.cn",
        "http://mirrors.sohu.com",
        "https://ustc-edu-cn.mirror.aliyuncs.com",
        "https://ccr.ccs.tencentyun.com",
        "https://docker.m.daocloud.io",
        "https://docker.awsl9527.cn"
    ]
}
EOF

# 重新加载配置
systemctl daemon-reload

# 重启Docker
systemctl restart docker

2.5.安装mysql(其实验证镜像能否成功拉取)

docker run -d  \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql

Docker会按以下顺序执行:
1. 在本地查找 mysql:latest 镜像。
2. 如果没找到,自动从Docker Hub拉取
3. 创建一个名为mysql的容器。
4. 在后台启动这个容器。

3.Docker命令解读

image是镜像的名字,tag是镜像版本,container是容器

1)查看镜像docker images
  • 语法: docker images [option]

option说明:

-a,all:    展示所有镜像
-q,quite:  只展示镜像ID
2)拉取镜像 docker pull
  • 语法: docker pull image[:tag]
#拉取镜像
docker pull nginx

#拉取指定版本镜像
docker pull nginx:1.26.0
3)镜像删除docker rmi
  • 语法: docker rmi [option] image:tag
#注意要是完整标签: 
docker rmi nginx:latest

#推荐使用其唯一镜像ID 删除:  
docker rmi 3f8a4339aadd

#option说明,-f:全部删除
#$(docker images -aq) 即取得所有镜像ID集合
docker rmi -f $(docker images -aq)

3.2容器

1)运行容器docker run
  • 语法:docker run [option] image[:tag] [command] [arg...]
    --name: 为容器指定一个名称;
    -d: 后台运行容器,并返回容器ID,也即启动守护式容器;
        非后台运行会阻塞控制台
        常见坑:当后台运行容器时,若容器没有提供服务,则会自动停止
    -i,-t,-it:以交互模式运行容器;为容器重新分配一个伪输入终端;二者通常同时使用;
               交互方式运行,进入容器内部查看内容
               exit:停止容器并从退回主机
               ctrl + p + q:不停止容器退出
    
    
    -p: 端口映射,-p标志用于指定端口映射,它允许你将容器内的端口映射到镜像端口,即
        运行Docker的机器上的端口。这是为了让外部网络能够访问在Docker容器内运行的服务
        端口映射可以提高安全性,因为可以只公开必要的端口,而非公开容器内的所有端口。
        映射有以下格式
          -p ip:主机端口:容器端口 
          -p 主机端口:容器端口(常用)
          -p 容器端口
          容器端口
          
    -e:环境变量
          
    -P: 随机端口映射;
    -w: 指定命令执行时,所在的路径
    
    例如:
    docker run -d --name nignx -p 80:80 nginx
    后台运行最新版本nginx ,容器名字定义为nginx,镜像,容器端口都是80

    这里这个端口映射,因为docker是封闭性的,所以我们是没办法直接访问到docker中的镜像端口的,这时候我们就需要访问主机的端口3306,会自动映射到镜像的3306上

  • 不写tag默认最新版本,command和arg为默认配置一般不写
  • ctrl + c 终止运行
2)停止容器docker stop
  • 语法: docker stop [option] container [container]

option说明

-t, --time int:这个选项指定在发送 SIGTERM 信号后等待容器停止的秒数。
容器中的应用程序可以捕获SIGTERM信号并执行清理操作,如保存状态、关闭连接、释放资源等再退出
如果在指定的时间内容器没有停止,那么 Docker 将发送 SIGKILL 信号来强制停止容器。
默认情况下,docker stop 会等待 10 秒。

#container自己停止或20秒后强制停止,不使用-t默认10秒
docker stop -t 20 container

[container]
同时操作多个容器


3)强停容器docker kill
  • 语法: docker stop [option] container
  • 直接发送SIGKILL信号到容器的主进程,这会立即终止容器,不给容器中的进程任何清理和退出的机会。适用于容器无响应或者需要快速停止容器。
4)查看运行容器docker ps
  • 语法:docker ps [option] container

  • 容器id 镜像名 容器默认命令 创建时间 启动状态(up即成功) 占用端口 应用容器名(随机)
  • 容器的操作(container)只能是容器名或容器ID(非镜像名),若可以唯一识别,可以只使用ID前几位数字

option说明


-d:  查看正在运行容器
-a:  查看所有容器(包括已经停止的)
-n=?:展示最近运行的?个容器
-q:  只显示id
5)删除容器docker rm
  • 语法:docker rm [option] container [container]
  • 不能删除运行中的容器,除非option选用-f
  • 同理,删除所有镜像: docker rmi -f $(docker ps -aq)

6)启动容器docker start
  • 语法: docker restart container [container]
  • 启动停止的容器,若已经启动或者已经删除则无效

7)重启容器docker restart
  • 语法: docker restart container [container]
  • 关闭的则启动,启动的则重启
8)查看容器状态docker stats
  • 语法: docker stats container
  • 展示容器占用的cpu内存情况
  • ctrl + c 退出
9)查看容器日志docker logs
  • 语法:docker logs [option] container

option 说明

-tf:展示日志
--tail number:以字符串的形式展示日志,number展示日志条数
-f  一直跟踪这个日志(调试一般会用)
10)查看容器进程信息docker top
  • 语法:docker top container
11)进入容器docker exec/attach
  • 语法:docker exec -it container bashShell
#命令以与控制台(/bin/bash)交互(-it)的形式进入容器nginx(已经取容器名为nginx)
docker exec -it nginx /bin/bash
或者
docker exec -it nginx bash

#exec进入容器并开启新终端并操作,更常用

进入容器后也可以进去mysql

12)起别名

vi ~/.bashrc

source ~/.bashrc

3.3保存镜像

1)镜像保存docker save
  • 语法:docker save [option] image[:tag]
-o:将镜像保存为tar包(名字随便取)
docker save -o mynginx.tar mynginx:vers1.0

2)镜像加载docker load
  • 语法:docker load [option]
-i:指定压缩包路径,自动读取,根据压缩包产生镜像
docker load -i mynginx.tar

这相当于是打包好的镜像

4 Docker存储

挂载类型 语法示例 来源/说明
匿名挂载 -v /容器内路径 只写容器内路径
具名挂载 -v 数据卷名:/容器内路径 给数据卷起名,便于管理
指定路径挂载 -v /本地目录:/容器内路径 指定宿主机具体目录
  • 匿名挂载:你只指定了容器内的路径,没有给数据卷起名,Docker会自动在宿主机/var/lib/docker/volumes/下生成一个随机字符串的目录来关联。因为匿名挂载卷的名字是随机字符串,不便于后续管理和维护。

  • 具名挂载:你为数据卷指定了一个名字(如 juming-nginx),Docker会以这个名字在/var/lib/docker/volumes/下创建目录。通过名字管理卷,推荐使用这种方式

  • 指定路径挂载:你明确指定了宿主机上的一个具体目录路径(如 /home/user/app)和容器内的路径进行关联。

1)数据卷挂载

语法: docker -v 数据卷名:容器目录

  • 不指定本地目录,默认放在/var/lib/docker/volums/xxxx/_data
  • 容器内路径: ro rw 改变读写权限,看到ro说明只能通过本地主机修改文件而非容器内修改

#查看帮助信息
docker volum --help
#创建数据卷
docker volume create
#查看所有数据卷
docker volume ls
#删除指定数据卷
docker volume rm
#查看某个数据卷的详情
docker volume inspect
#清除数据卷
docker volume prune

2)本地目录挂载

语法: docker -v 本地目录:容器目录

docker inspect:查询容器详情

我们先看一下nginx的详细信息(刚挂载过)

我们在看以下mysql的挂载

像数据库就有匿名挂载,因为data数据存储是需要的,那就直接创建数据卷然后随机给一个很长的名字

3).Dockerfile

指令 指定基础镜像 示例
FROM

指定基础镜像

FROM centos:6
ENV

设置环境变量,可在后面指令使用

ENV key value
COPY

拷贝本地文件到镜像的指定目录

COPY ./jrel1.tar.gz /tmp
RUN 执行Linux的shell命令,一般是安装过程的命令 RUN tar-zxvf/tmp/jrell.tar.gz&& EXPORTS path=/tmp/jrell:$path
EXPOSE 指定容器运行时监听的端口,是给镜像使用者看的 EXPOSE 8080
ENTRYPOINT 镜像中应用的启动命令,容器运行时调用 ENTRYPOINT java -jar xx.jar

5.docker网络

ip地址是docker网桥分配的,如果关掉就没了,这是别的容器在启动,就把这个占用了,这时候就可以自定义网络

命令 语法示例
docker network create 创建一个网络
docker network ls 查看所有网络
docker network rm 删除指定网络
docker network prune 清除未使用的网络
docker network connect 使指定容器连接加入某网络
docker network disconnect 使指定容器连接离开某网络
docker network inspect 查看网络详细信息
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐