Docker基础入门

Docker核心概念
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器(Container):容器是镜像的运行实例,像一个独立的小房间,里面装着一个应用和它的依赖环境。
镜像(Image):镜像是容器的模板,包含应用代码、依赖和配置,像一个“只读的安装包”。
Dockerfile:一个文本文件,包含构建镜像的指令(如基础镜像、依赖安装、文件复制等)。

示例:

FROM ubuntu:22.04         # 基础镜像
COPY . /app               # 复制文件到容器
RUN apt-get update && \   # 安装依赖
    apt-get install -y python3
CMD ["python3", "/app/main.py"]  # 容器启动命令

仓库(Registry):仓库是存储和共享镜像的平台,类似于“应用商店”。
常见命令

命令 说明
docker pull 拉取镜像
docker push 推送镜像到DockerRegistry
docker images 查看本地镜像
docker rmi 删除本地镜像
docker run 创建并运行容器(不能重复创建)
docker stop 停止指定容器
docker start 启动指定容器
docker restart 重新启动容器
docker rm 删除指定容器
docker ps 查看容器
docker logs 查看容器运行日志
docker exec 进入容器
docker save 保存镜像到本地压缩文件
docker load 加载本地压缩文件到镜像
docker inspect 查看容器详细信息
image
以Nginx为例给大家演示上述命令
# 第1步,去DockerHub查看nginx镜像仓库及相关信息​
# 第2步,拉取Nginx镜像​
docker pull nginx​
# 第3步,查看镜像​
docker images​
# 结果如下:​
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE​
nginx        latest    605c77e624dd   16 months ago   141MB​
mysql        latest    3218b38490ce   17 months ago   516MB​
​
# 第4步,创建并允许Nginx容器​
docker run -d --name nginx -p 80:80 nginx​
# 第5步,查看运行中容器​
docker ps​
# 也可以加格式化方式访问,格式会更加清爽​
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"​
# 第6步,访问网页,地址:http://虚拟机地址​
# 第7步,停止容器​
docker stop nginx​
# 第8步,查看所有容器​
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"​
# 第9步,再次启动nginx容器​
docker start nginx​
# 第10步,再次查看容器​
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"​
# 第11步,查看容器详细信息​
docker inspect nginx​
# 第12步,进入容器,查看容器内目录​
# 发现无法删除,因为容器运行中,强制删除容器​
docker rm -f nginx

数据卷
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。
以Nginx为例,我们知道Nginx中有两个关键的目录:​
html:放置一些静态资源​
conf:放置配置文件​
如果我们要让Nginx代理我们的静态资源,最好是放到html目录;如果我们要修改Nginx的配置,最好是找到conf下的nginx.conf文件。​
但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。如图:
image
在上图中:​
我们创建了两个数据卷:conf、html​
Nginx容器内部的conf目录和html目录分别与两个数据卷关联。​
而数据卷conf和html分别指向了宿主机的/var/lib/docker/volumes/conf/_data目录和/var/lib/docker/volumes/html/_data目录​
这样以来,容器内的conf和html目录就 与宿主机的conf和html目录关联起来,我们称为挂载。此时,我们操作宿主机的/var/lib/docker/volumes/html/_data就是在操作容器内的/usr/share/nginx/html/_data目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。​
Dockerfile
由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。​
而这种记录镜像结构的文件就称为Dockerfile,其对应的语法可以参考官方文档:​https://docs.docker.com/engine/reference/builder/
image
以后我们会有很多很多java项目需要打包为镜像,他们都需要Linux系统环境、JDK环境这两层,只有上面的3层不同(因为jar包不同)。如果每次制作java镜像都重复制作前两层镜像,是不是很麻烦。​所以,就有人提供了基础的系统加JDK环境,我们在此基础上制作java镜像,就可以省去JDK的配置了:

# 基础镜像​
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"]

构建镜像的命令:docker build -t 镜像名 Dockerfile目录
网络
定义:Docker 网络是容器间通信和对外服务的桥梁,理解其机制能帮助你高效管理容器互联、暴露服务及保障安全。比如像Web服务需要访问Redis数据库。可以创建个自定义的网络,将两者都加入一个网络中,从而实现多容器通信。
⚠注意:容器本身的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果写死的话,以后这个虚拟IP有可能会发生改变。

命令 说明
docker network create 创建一个网络
docker network ls 查看所有网络
docker network rm 删除指定网络
docker network prune 清除未使用的网络
docker network connect 使指定容器连接加入某网络
docker network disconnect 使指定容器连接离开某网络
docker network inspect 查看网络详细信息
posted @ 2025-07-30 09:50  crack_you  阅读(28)  评论(0)    收藏  举报