Docker基础学习笔记
Docker是什么

- 是一个开源的应用容器引擎,基于go语言开发并遵循apache2.0协议开源
- 是在Linux容器里运行应用的开源工具
- 是一种轻量级的 “虚拟机”
- Docker的容器技术,可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器
- 市场占有率最高
Docker与虚拟机的区别
| Docker | 虚拟机 | |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 计算能力损耗 | 几乎无 | 损耗 50%左右 |
| 性能 | 接近原生 | 弱于 |
| 系统支持量(单机) | 上千个 | 几十个 |
| 隔离性 | 通过namespace实现资源隔离,通过cgroup实现限制资源的最大使用量 | 完全隔离,每个虚拟机都有独立的硬件 |
| 内核 | 所有容器共享宿主机的内核 | 每个虚拟机都有独立的操作系统和内核 |
Docker核心
镜像
- 是创建容器的基础
- 是一个只读的模板文件,里面包含运行容器中的应用程序所需要的所有资料(比如应用程序执行文件、配置文件、动态库文件、依赖包、系统文件和目录等)
容器
- 是用镜像运行的实例
- 容器可以被创建、启动、停止、删除,每个容器之间默认是相互隔离的
仓库
- 是用来集中保存镜像的地方
- 有公有仓库和私钥仓库之分
可用Docker镜像源推荐
Docker镜像源1:
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.imgdb.de",
"https://docker-0.unsee.tech",
"https://docker.hlmirror.com",
"https://cjie.eu.org"
]
}
EOF
Docker镜像源2:
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://proxy.1panel.live",
"https://docker.1ms.run",
"https://hub.geekery.cn",
"https://docker.m.daocloud.io",
"https://docker.rainbond.cc",
"https://docker.1panel.live"
]
}
EOF
一、Docker命令
1、帮助命令
docker version # 显示docker的详细信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker --help # docker帮助命令
2、镜像操作命令
2.1、搜索
docker search 关键字
#例如:
docker search nginx
2.2、下载
docker pull 仓库名称[:标签(版本)]
# 如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签。
docker pull nginx
2.3、查看
# 镜像下载后存放在 /var/lib/docker 。
# Docker 相关的本地资源存放在 /var/lib/docker/ 目录下,其中 containers 目录存放容器信息,image 目录存放镜像信息,overlay2 目录下存放具体的镜像底层文件。
#查看下载的镜像文件信息
cat /var/lib/docker/image/overlay2/repositories.json
#查看下载到本地的所有镜像
docker images
docker images -q # 只查询显示镜像ID
-q 只显示镜像ID
2.4、查看镜像详细信息
docker inspect 镜像ID
# 例如:
docker inspect 6c1a5edb7b09
2.5、复制镜像并且修改名称
docker tag 名称:[标签/版本] 新名称:[新标签/版本]
# 例如:
docker tag nginx:latest nginx:1.27.5
2.6、删除
docker rmi 仓库名称:标签
或者
docker rmi 镜像ID
docker rmi -f $(docker images -aq) #删除所有镜像
-f 强制删除
-aq 显示所有的镜像ID
3、容器操作命令
3.1、运行
docker run 镜像ID/名称
docker run -d -p 80:80 --name nginx1 a830707172e8
-d 后台运行
-p 端口映射。宿主机端口:容器端口
–name 自定义名称
-i 使用交互方式运行容器,通常与t同时使用
-t 为容器重新分配一个伪输入终端。也即启动交互式容器
-P 随机指定端口
-v 给容器挂载存储卷
3.2、查看
docker ps # 查看运行中的容器
docker ps -a # 查看所有的容器,包括停止的容器
docker inspect 容器ID/名称 # 查看容器的详细信息
-a 查看所有的容器,包括停止的容器
3.3、停止
docker stop 容器ID/名称
docker stop cd9309639124
3.4、启动
docker start 容器ID/名称
docker start cd9309639124
3.5、重启
docker restart 容器ID/名称
docker restart cd9309639124
3.6、状态
docker stats 容器ID/名称
docker stats cd9309639124
3.7、日志
docker logs 容器ID/名称
docker logs cd9309639124
3.8、进入
docker exec -it 容器ID/名称 /bin/bash
docker exec -it cd9309639124 /bin/bash
-i 使用交互方式运行容器,通常与t同时使用
-t 为容器重新分配一个伪输入终端。也即启动交互式容器
3.9、删除
docker rm 容器ID/名称
docker rm cd9309639124
docker rm -f cd9309639124 # -f强制删除
4、镜像分享
4.1、提交
将编辑好的容器提交为一个镜像。
docker commit 容器ID/名称
#将编辑好的容器提交为一个镜像。
docker commit cd9309639124 mynginx:1.0
4.2、保存
将镜像保存为一个tar包。
docker save 容器ID/名称
# 将镜像保存为一个tar包
docker save -o mynginx.tar cd9309639124
4.3、加载
docker load
docker load -i mynginx.tar
-i 指定输入文件的路径
4.4、登录
docker login
#输入账号密码
#阿里云
docker login --username=****** crpi-xit86n73o16tvmz6.cn-chengdu.personal.cr.aliyuncs.com
4.5、命名
docker tag 名称:[标签/版本] 新名称:[新标签/版本]
# 例如:
docker tag nginx:latest nginx:1.27.5
#阿里云
docker tag [ImageId] crpi-xit86n73o16tvmz6.cn-chengdu.personal.cr.aliyuncs.com/zxlimage/nginx:[镜像版本号]
4.6、推送
docker push 镜像ID
#阿里云
docker push crpi-xit86n73o16tvmz6.cn-chengdu.personal.cr.aliyuncs.com/zxlimage/nginx:[镜像版本号]
二、Docker存储
1、目录挂载
docker run -d -p 80:80 -v /app/nghtml:/usr/share/nginx/html --name app01 nginx
# -v /宿主机路径:/容器路径
目录挂载:-v /app/nghtml:/usr/share/nginx/html
2、卷映射
docker run -d -p 80:80 -v ngconf:/etc/nginx --name app01 nginx
# -v 卷名:/容器路径
卷映射 -v ngconf:/etc/nginx
docker中卷默认存放路径: /var/lib/docker/volumes/volume-name
列出所有的卷
docker volume ls
手动增加卷
docker volume create 卷名
查看卷的详情
docker volume inspect 卷名
三、Docker网络
1、默认网络
docker为每个容器分配了唯一ip,使用容器ip+容器端口可以互相访问。
查看容器ip
docker inspect 容器名

2、自定义网络
# 创建网络
docker network create mynet
# 查看网络
docker network ls
# 启动容器
docker run -d -p 80:80 --name app1 --network mynet nginx
docker run -d -p 81:80 --name app2 --network mynet nginx
创建自定义网络,容器名就是稳定域名
docker exec -it app1 /bin/bash
curl http://app2:80
四、Docker Compose
Docker Compose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。
Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。
compose.yaml语法:
顶级元素
名字:name
服务:services
网络:networks
卷:volumes
name: myblog
services:
mysql:
container_name: mysql
image: mysql:8.0
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD: 123456
- MYSQL_DATABASE: wordpress
volumes:
- mysqldata:/var/lib/mysql
- /app/myconf:/etc/mysql/conf.d
restart: always
networks:
- mynetwork
wordpress:
image: wordpress
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: 123456
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress:/var/www/html
restart: always
network:
- mynetwork
volumes:
mysqldata:
wordpress:
networks:
mynetwork:
docker compose -f compose.yaml up -d
docker compose up -d # 配置文件中所有应用以后台形式上线
docker compose down # 配置文件中所有应用批量下线
docker compose start x1 x2 x3 # 启动1 2 3应用
docker compose stop x1 x3 # 停止1 3应用
docker compose scale x2=3 # 扩容3个2应用
-f 等价于–file,指定 compose.yaml文件
五、Dockerfile
dockerfile 是一种用于定义和构建 docker 镜像的文本文件。它包含一系列的指令和参数,用于描述镜像的构建过程,包括基础映像、软件包安装、文件拷贝、环境变量设置等。
通过编写 dockerfile,可以将应用程序、环境和依赖项打包成一个独立的容器镜像,使其可以在不同的环境和平台上运行,实现应用程序的可移植性和可扩展性。
1、编写Dockerfile文件
FROM openjdk:17
COPY app.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
| 常见指令 | 作用 |
|---|---|
| FROM | 指定镜像基础环境 |
| RUN | 运行自定义命令 |
| CMD | 容器启动命令或参数 |
| LABEL | 自定义标签 |
| EXPOSE | 指定暴露端口 |
| ENV | 环境变量 |
| ADD | 添加文件到镜像 |
| COPY | 复制文件到镜像 |
| ENTRYPOINT | 容器固定启动命令 |
| VOLUME | 数据卷 |
| USER | 指定用户和用户组 |
| WORKDIR | 指定默认工作目录 |
| ARG | 指定构建参数 |
2、构建镜像
docker build -f Dockerfile -t myjavaapp:1.0 .
-f 等价于–file,指定 dockerfile 文件
-t 等价于–tag,指定输出的镜像文件名:版本号
命令最后一定要加一个
.

浙公网安备 33010602011771号