Docker学习

本文围绕Docker展开,介绍了其配置、镜像加速器设置和部署方法。解读了常用命令,如创建并运行容器、设置端口映射等。阐述了数据卷挂载,解决容器与宿主机目录关联问题。还提及自制镜像,包括自定义镜像和构建jdk镜像,最后说明了网络容器互联的方法。

1、配置Docker

2、配置Docker镜像加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://zlcqqwo7.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

3、Docker部署

docker原理:下载免安装的文件有可执行文件(镜像只有一个,下载了就不会下了)

docker对环境没要求类似java虚拟机(宝塔原来get)

docker内的容器之前相互隔离,容器内可以是同一端口,但一旦出了容器到达宿主机,那么就不能共享端口

4、命令解读

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

docker run 创建并允许

-d是让容器后台运行

--name mysql:给容器起名

-p 3306:3306:设置端口映射(宿主端口:容器端口)

-e KEY=VALUE:是设置环境变量

mysql:指定运行的镜像名(镜像名:版本号)

5、常见命令

pull        镜像仓库拉取
image镜像查看
rmi        镜像删除
build自己构建镜像
save保存到本地压缩
load压缩文件加载到他的镜像
push把镜像推上镜像仓库,后同时用pull从镜像仓库拉出
run运行并创建进程
stop停止容器中的进程(容器依然在,下次运行不用重复启动)
start启动已经停止的进程
ps查询容器状态
rm删除镜像
logs打印相关日志
exec进入容器(修改之类)

命令的别名 root/.bashrc

alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'

修改完后还没完,要写sourse ~/.bashrc    让该文件生效


6、Docker基础-数据卷挂载(容器内目录和宿主机目录的桥梁)

docker只具备了容器运行必备的东西(数据卷解决这个)

创建数据卷html文件夹(用docker命令创建)之后帮助你在宿主机创建对应真实的目录

/var/lib/docker/volumes/html/_data

创建数据卷conf文件夹(用docker命令创建)之后帮助你在宿主机创建对应真实的目录

/var/lib/docker/volumes/conf/_data   间接产生了关联

之后docker会让两者产生双向绑定 宿主机有高级编辑器操作方便。

docker volume --help 会产生以下指令帮助提示。

命令

说明

文档地址

docker volume create

创建数据卷

docker volume create

docker volume ls

查看所有数据卷

docs.docker.com

docker volume rm

删除指定数据卷

docs.docker.com

docker volume inspect

查看某个数据卷的详情

docs.docker.com

docker volume prune

清除数据卷

docker volume prune

只需要做挂载就可以自动创建(必须在docker run命令时 使用-v 数据卷:容器内目录 可以完成数据卷的挂载。

Unable to find image 'nginx:latest' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: TLS handshake timeout.

无法下载镜像:超时

转载:docker拉取镜像时报错:docker: Error response from daemon: Get “https://registry-1.docker.io/v2/“: dial tcp:-优快云博客

以上都未能结局我的问题

我的问题是通过宝塔删除容器、并且在目录删除了文件

解决:没有删掉对应的存储卷、存储卷不因容器的删除而删除,而是在下一次创建相同容器是自动挂载,所以要对原有的存储卷进行删除、注意宝塔的是有存储卷

本地目录挂载

mysql容器的数据挂载

需求:查看mysql容器、判断是否有数据卷挂载

           基于宿主机目录实现MySQL数据目录、配置文件、初始化脚本的挂载(查阅官方镜像文档)

mysql是自动创建数据数据卷的(数据迁移问题)

自动创建的卷名字不好(匿名卷)自己挂载,挂载到任意不深的目录

-v 本地目录(原本是镜像名):容器内目录 本地挂载
不要用相对目录(本地目录必须以"/"或者"./"开头)

-v mysql:/var/lib/mysql # 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷 -v ./mysql:/var/lib/mysql # 会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录

  • 挂载/root/mysql/data到容器内的/var/lib/mysql目录

  • 挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录(初始化的SQL脚本目录)

  • 挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录(这个是MySQL配置文件目录)

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  -v ./mysql/data:/var/lib/mysql \
  -v ./mysql/conf:/etc/mysql/conf.d \
  -v ./mysql/init:/docker-entrypoint-initdb.d \
  mysql

6、自制镜像

镜像包含应用、程序运行的系统函数库、运行配置文件的文件包。构建镜像过程其实就是把上述文件打包的过程

镜像是分层的

我们不需要亲自去完成我们只需要指出-入口是什么、中间有那些层docker就会自动创建

Dockerfile

指令

说明

示例

FROM

指定基础镜像

FROM centos:6

ENV

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

ENV key value

COPY

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

COPY ./xx.jar /tmp/app.jar

RUN

执行Linux的shell命令,一般是安装过程的命令

RUN yum install gcc

EXPOSE

指定容器运行时监听的端口,是给镜像使用者看的

EXPOSE 8080

ENTRYPOINT

镜像中应用的启动命令,容器运行时调用

ENTRYPOINT java -jar xx.jar

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 设定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安装JDK
RUN cd $JAVA_DIR \
 && tar -xf ./jdk8.tar.gz \
 && mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 指定项目监听的端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

 已经有人将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 myImage:1.0 .

  • docker build : 就是构建一个docker镜像

  • -t docker-demo:1.0-t参数是指定镜像的名称(repositorytag

  • . : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录:

构建jdk镜像将文件放在root下

docker load -i jdk.tar

# 进入镜像目录
cd /root/demo
# 开始构建
docker build -t docker-demo:1.0 .

7、Docker网络容器互联

docker会自动创建ip地址

如果重新启动Docker ip会便所以要进行自定义网络(锁死)

自定义创建一个网桥 然后网球之间的镜像互相访问,可以通过容器名访问!

命令

说明

文档地址

docker network create

创建一个网络

docker network create

docker network ls

查看所有网络

docs.docker.com

docker network rm

删除指定网络

docs.docker.com

docker network prune

清除未使用的网络

docs.docker.com

docker network connect

使指定容器连接加入某网络

docs.docker.com

docker network disconnect

使指定容器连接离开某网络

docker network disconnect

docker network inspect

查看网络详细信息

docker network inspect

docker run -d --name dd -p 8080:8080  --network heima docker-demo
#创建镜像时自动加入网桥 就不会加入默认网桥

<think>嗯,用户想了解Docker学习路径。首先我得理清楚Docker的基础知识,然后分步骤来规划。可能用户是刚开始接触容器技术,需要从最基础的概念讲起。 首先应该介绍Docker是什么,为什么需要它。然后安装和环境配置,这部分可能需要涵盖不同操作系统的安装步骤,比如Windows、macOS和Linux。接着是基本命令,像镜像和容器的管理,这部分比较实用,用户可能需要实际操作例子。 接下来是Dockerfile和镜像构建,这是关键部分,用户需要学会如何自定义镜像。之后是数据管理和网络配置,这些在实际项目中很重要,比如卷的使用和容器间通信。然后是Docker Compose,处理多容器应用,用户可能会用到这个来部署复杂应用。 高级部分可能需要包括Docker Swarm和Kubernetes的基础,但用户可能暂时不需要太深入,可以简要提一下。最后是安全性和最佳实践,确保用户了解如何安全地使用Docker。 还要考虑用户可能的应用场景,比如开发、测试或者生产环境部署。可能需要推荐一些实践项目,比如搭建Web应用,帮助用户巩固知识。另外,学习资源方面,官方文档和社区资源很重要,可以推荐一些书籍或者在线课程。 需要检查是否有遗漏的部分,比如是否提到监控和日志管理,或者与其他工具集成,比如CI/CD。不过作为学习路径,可能先集中在核心内容,高级话题可以后续扩展。 最后,确保结构清晰,步骤由浅入深,让用户能够循序渐进地学习。避免使用过于专业的术语,保持解释的易懂性。同时,注意使用正确的Markdown格式,特别是数学公式部分,不过在这个问题中可能用不上,但需要遵守系统指令中的格式要求。</think>以下是分阶段Docker学习路径(建议配合实践操作): 一、基础入门阶段(1-2周) 1. 核心概念理解 - 容器与虚拟机的本质区别(资源隔离 vs 硬件虚拟化) - 镜像分层存储原理(联合文件系统) - 容器生命周期管理(创建→运行→停止→销毁) 2. 环境搭建 ```bash # Linux安装示例 curl -fsSL https://get.docker.com | bash -s docker sudo systemctl enable --now docker ``` 3. 基础指令实践 ```bash docker run -d -p 80:80 --name web nginx:alpine # 启动Nginx容器 docker exec -it web sh # 进入容器shell docker logs --tail 50 web # 查看日志 ``` 二、进阶应用阶段(2-4周) 1. Dockerfile编写技巧 ```dockerfile FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"] ``` 2. 数据持久化方案 ```bash docker volume create db-data docker run -d -v db-data:/var/lib/mysql mysql:8.0 ``` 3. 网络配置实践 ```bash docker network create app-net docker run -d --net=app-net --name db redis:6 docker run -d --net=app-net -p 8080:80 webapp ``` 三、生产级部署阶段(1-2个月) 1. Docker Compose编排 ```yaml version: '3.8' services: web: build: . ports: - "5000:5000" depends_on: - redis redis: image: "redis:alpine" ``` 2. 镜像优化策略 - 多阶段构建(减少最终镜像体积) - 安全扫描(使用docker scan) - 镜像签名验证 3. 容器监控方案 ```bash docker stats # 实时资源监控 docker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock dockersamples/visualizer ``` 四、持续学习建议 1. 官方文档精读(https://docs.docker.com) 2. 实验平台练习(推荐Play with Docker) 3. 参与社区项目(Docker GitHub仓库issue区) 4. 云原生技术延伸(Kubernetes、Service Mesh) 重点实践项目建议: 1. 构建完整LNMP环境 2. 实现CI/CD流水线 3. 搭建微服务架构演示系统 4. 容器安全加固实验 避坑指南: - 避免使用latest标签 - 容器内不要存储重要数据 - 生产环境限制容器资源配额 - 定期更新基础镜像版本 学习资源推荐: - 《Docker——容器与容器云(第2版)》 - 极客时间《深入剖析Kubernetes》(前4章) - Docker官方认证课程(DCA) - Katacoda交互式学习平台 建议每天保持1小时实践时间,通过实际项目巩固知识体系。遇到问题时,善用docker inspect命令分析容器状态,多查阅Docker官方文档的CLI参考手册。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值