课堂目标

  1. 理解docker和VM的区别
  2. docker的组成
  3. docker各类命令
  4. 完成docker镜像
  5. 容器编排(可选)

一、什么是docker

容器化部署的一个软件

https://www.docker.com/

https://www.docker.com/get-started/

image-20250815142521391

加速你的应用

  • 构建
  • 分享
  • 运行

image-20250815144422399

1、Docker 就是一个大轮船

2、上面的集装箱,代表的就是容器,容器里面装的就是你的应用(jar、redis、mysql、nginx...)

3、应用可以做成一个一个的镜像,大家可以共享

二、为什么要用Docker

image-20250815143605699

  • 如何解决这个问题?(重复,繁琐)
当我们开发一个项目的时候,需要用一些中间件,比如nginx、 mysql、MQ、ES...;

需要在服务器linux上,安装这些中间件,搜索baidu、AI,一步一步照着做,结果搞半天?

上线的时候,需要部署生成服务器,又要搞一遍,还要写详细的写部署文档交给客户。(客户懵逼。。。)

重复+繁琐

有没有一种类似软件包的形式,简便安装? 

把需要部署的软件打包,包括环境、中间件等,直接部署即可。

三、Docker 的组成

  • Docker 主机:安装了Docker程序的主机叫宿主机,会在后台运行一个叫Daemon的程序,准备服务(docker程序)

  • Docker 客户端:一系列的操作指令 docker pull 、docker ps ...(可以操作docker Daemon程序)

  • Docker的应用市场:提供各种镜像images, eg.jdk、nginx、mysql ...(docker pull 去下载)。类似我们的app应用商店。

    image-20250815154853953

理解:

  • Images(镜像):具体的软件
  • Containers(容器):软件安装的地方

四、Docker 和VM的区别

通过比较,更加深入理解容器Containers

image-20250815160315220

特点

  • 容器是更加轻量级的VM(没有了庞大的操作系统)
  • 仅仅共享系统内核
  • 有自己独立文件系统和的进程等
  • 容器之间各自独立没有影响

优点:

  • 轻量
  • 跨平台
  • 隔离
  • 快速部署
  • 高密度

五、Docker 安装

https://www.docker.com/

1、升级系统

yum update

2、安装依赖包

yum install -y yum-utils device-mapper-persistent-data lvm2

yum-utils工具包 用于 yum-config-manager 工具管理软件源(repositories)
device-mapper-persistent-data  管理设备映射的持久性数据
lvm2 老版本 centos兼容性保证

3、添加aliyun docker软件包源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

先不执行(sudo wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo)

4、添加软件包源到本地缓存

yum makecache fast  

快速构建(刷新) yum 的软件包元数据缓存

rpm --import https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
rpm是软件管理命令 ,--import 验证与导入密钥验证软件包的数字签名、防止篡改(否则有可能被拒绝安装)

5、安装docker

yum -y install docker-ce

6、开机启动

systemctl enable docker

关闭开机启动(可选)

systemctl disable docker

7、重启启动

systemctl restart docker

备注如果无法安装就之下下面的命令[新的阿里云(暂时不执行)]

#添加Docker软件包源
sudo wget -O /etc/yum.repos.d/docker-ce.repo http://mirrors.cloud.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's|https://mirrors.aliyun.com|http://mirrors.cloud.aliyuncs.com|g' /etc/yum.repos.d/docker-ce.repo
#安装Docker社区版本,容器运行时containerd.io,以及Docker构建和Compose插件
sudo yum -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
#启动Docker
sudo systemctl start docker
#设置Docker守护进程在系统启动时自动启动
sudo systemctl enable docker

8、镜像配置

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://ro1qhnfy.mirror.aliyuncs.com"]
}
EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

如果是腾讯云服务器有下面的地址

https://mirror.ccs.tencentyun.com

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
EOF

如果上面的镜像可以,下面的就可以不用了(暂时不再添加其他的镜像,先试试)

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://ro1qhnfy.mirror.aliyuncs.com",
    "https://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
    ]
}
EOF

{
  "registry-mirrors": [
    "https://ro1qhnfy.mirror.aliyuncs.com",
    "https://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}

六、Docker命令

1、下载镜像(查看镜像)

搜索和查看镜像的版本 https://hub.docker.com/

检索镜像 docker search
下载镜像
docker pull 镜像名称
docker pull nginx:1.28-alpine //如果无法下载就去掉版本号
docker pull nginx

下载完以后可以看一下是否下载成功

查看下载的镜像,好比查看本地下载的软件包
docker images
删除镜像  rmi 是 remove image 缩写
docker rmi

2、启动容器

-p 代表的是端口的映射

备注:拉起的时候,注意别名 --name 要放在 拉起的镜像名的前面

安装与运行 docker run -p 80:80 --name nginx-dw nginx

ps代表是查看有哪些容器正在运行

docker ps

代表的是查看所有的容器(包括运行的和没有运行)

docker ps -a
停止 docker stop nginx
启动
docker start nginx 
状态 docker stats

看docker容器里面应用的日志

日志 docker logs

执行容器的端口和别名

后台启动 docker run -d --name aliasnginx
端口映射 docker run -d  --name aliasnginx -p 80:80 nginx
进入 docker exec
-it代表的是进入容器后需要有一个交互界面
/bin/bash代表的是可以自行的shell命令方式

docker exec -it xxx /bin/bash

删除容器 docker rm
删除镜像 docker rmi

3、保存容器

保存容器的目的是方便,在不同的服务器上复制和部署

提交创建容器: docker commit
docker commit -m "new nginx update index" mynginx mynginx:v0.1
保存 : docker save
docker save -o 保存的文件名 保存哪一个镜像
docker save -o mynginx.tar mynginx:v0.1
加载: docker load
docker load -i mynginx.tar

4、容器挂载

把容器内部的文件映射到宿主机上,方便修改

ro代表的是容器对宿主机文件只有读的权限 readonly

docker run -d --name nginx01 -p 80:80 -v /data/app/html:/usr/share/nginx/html:ro nginx

/usr/share/nginx/html

挂在nginx的配置,也可以用多个-v

docker run -d --name proxy \
  -v /data/app/html:/usr/share/nginx/html \
  -v /data/app/conf.d:/etc/nginx/conf.d \
  -p 80:80 nginx

5、文件拷贝

从宿主机拷贝文件到容器

# 格式:docker cp <宿主机文件路径> <容器ID或名称>:<容器内目标路径>
docker cp ./new-nginx.conf nginx-container:/etc/nginx/nginx.conf

# 示例:拷贝本地修改的配置文件到容器
docker cp ./app.properties spring-app:/app/config/

docker cp
从容器拷贝文件到宿主机

# 格式:docker cp <容器ID或名称>:<容器内文件路径> <宿主机目标路径>
docker cp nginx-container:/etc/nginx/nginx.conf /tmp/nginx.conf

# 示例:拷贝指定容器的配置文件到本地当前目录
docker cp 7a38a1e0b3f4:/usr/local/tomcat/conf/server.xml ./server.xml

6、镜像制作

Docker build -f DockerFile -t javaapp .
build代表创建镜像
-f代表根据哪一个描述文件进行创建
-t 代表你的images 标签
docker tag 容器名称  tar:v1.0 

备注:镜像获取的三种方式

1、仓库下载 docker pull

2、自己打包分享 docker save 保存程一个*.tar docker load

3、自己构建

七、Docker实操中学习

  • 下载一个nginx镜像

    下载镜像

    docker pull 
    
  • 部署一个nginx容器

  • 访问nginx的默认页面

  • 修改nginx里的index文件,再次访问测试效果 ok

    echo 'www.woniu.com' > ./index.html

  • 打包成一个自己的镜像

    docker commit -m "new nginx update index" mynginx mynginx:v0.1

    docker save -o mynginx.tar mynginx:v1.0

  • 分发给朋友,让朋友部署

    docker load -i mynginx.tar

  • 容器文件映射到宿主机,测试效果

    docker run -d -p 80:80 -v /data/app/html:/usr/share/nginx/html --name nginx01 nginx

  • 复制文件到容器

  • 制作镜像

下载镜像-->启动容器-->修改页面-->保存镜像

八、如何制作基本镜像

1、docker

2、podman

image-20250821170056328

常见指令 作用
FROM 指定镜像基础环境
RUN 运行自定义命令
CMD 容器启动命令或参数
EXPOSE 指定暴露端口
ENV 环境变量
LABEL 自定义标签
ADD 添加文件到镜像
COPY 复制文件到镜像
VOLUME 数据卷
USER 指定用户和用户组
ENTRYPOINT 容器固定启动命令
WORKDIRARG 指定默认工作目录
ARG 指定构建参数

1、编写DockerFile

说明:在创建镜像时,会根据DockerFile去执行对应的命令

FROM openjdk:17
COPY demo3-0.0.1-SNAPSHOT.jar /
LABEL author=daiwei
EXPOSE 9090
ENTRYPOINT ["java","-jar","demo3-0.0.1-SNAPSHOT.jar"]

说明: openjdk:17是docker的简写,完成形式是:

docker.io/library/openjdk:17

2、创建镜像

build创建一个名字为 javaapp的镜像,

-f 使用的是DockerFile这个文件的命令和参数内容

-t 就是tag

.必须要,代表容器的当前目录

Docker build -f 描述文件 -t 创建的名称
Docker build -f DockerFile -t javaapp .

3、启动

docker run -d -p 宿主机端口:容器端口 --name 容器名称 别名
docker run -d -p 8080:9091 --name myjavaapp myjavaapp

4、打tag

docker tar 镜像名称 镜像标签
docker tag nginx nginx:v8.8

九、DockerCompose

容器编排

docker-compose.yaml
Docker安装(docker-compose 只需要复制文件到/usr/local/bin目录下,给777权限即可) 最新版的已经包含了docker-compose不需要再单独安装
version: '2.1'
services:
  nginx:
    image: nginx
    container_name: proxy
    volumes:
      - /data/nginx/conf.d:/etc/nginx/conf.d
      - /data/nginx/ca:/etc/nginx/ca
      - /data/nginx/logs:/var/log/nginx
      - /data/nginx/html:/usr/share/nginx/html
      - /etc/localtime:/etc/localtime
    ports:
      - "80:80"
      - "443:443"
    restart: always
    mem_limit: 256M
  

  

/data/nginx/conf.d创建一个default.conf配置,内容如下:

listen 80 代表监听的端口

server_name 服务名称

location / 代表 ip地址访问的默认.html文件的目录

下面root的根目录是/usr/share/nginx/html,但实际上已经被映射出来了,到宿主机的/data/nginx/html目录下了

image-20251210121457548

server {
    listen 80;   
    server_name localhost;
  
    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
    }
  
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

启动指令

docker-compose up -d
docker-compose stop xxx  #新版的,没有- ,直接是 docker compose
docker compose up -d

启动后截图如下