课堂目标
- 理解docker和VM的区别
- docker的组成
- docker各类命令
- 完成docker镜像
- 容器编排(可选)
一、什么是docker
容器化部署的一个软件
https://www.docker.com/
https://www.docker.com/get-started/

加速你的应用
- 构建
- 分享
- 运行

1、Docker 就是一个大轮船
2、上面的集装箱,代表的就是容器,容器里面装的就是你的应用(jar、redis、mysql、nginx...)
3、应用可以做成一个一个的镜像,大家可以共享
二、为什么要用Docker

- 如何解决这个问题?(重复,繁琐)
当我们开发一个项目的时候,需要用一些中间件,比如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应用商店。

理解:
- Images(镜像):具体的软件
- Containers(容器):软件安装的地方
四、Docker 和VM的区别
通过比较,更加深入理解容器Containers

特点
- 容器是更加轻量级的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

| 常见指令 | 作用 |
|---|---|
| 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目录下了

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
启动后截图如下

18-3阶内容-2.1.1-docker
https://xiaochenblog.icu/archives/18-3jie-nei-rong-2.1.1-docker
评论