安装Linux虚拟机

在虚拟机上去安装docker

参考文档:

https://b11et3un53m.feishu.cn/wiki/FJAnwOhpIihMkLkOKQocdWZ7nUc

“绿色免安装版”

镜像:

当我们利用Docker安装应用时, Docker会自动搜索并下载应用镜像(image) 。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。

镜像忽略操作系统,一个镜像多个系统兼容

镜像只需要下载一次,可以创建多个实例

容器:

Docker会在运行镜像时创建一个隔离环境,称为容器(container)。

独立网络内存文件系统

镜像仓库:

镜像仓库:存储和管理镜像的平台, Docker官方维护了一个公共仓库: Docker Hub。

公共仓库访问地址https://hub.docker.com/_/nginx

这个图还是有些问题哈,通过同一个镜像创建出来的应用是被放在不同的容器中单独隔离的,而不是图中的在同一个容器中。

docker run创建运行一个容器
# -d表示 detached mode分离模式,即后台运行
docker run: 创建并运行一个容器,-d 是让容器在后台运行
docker run -d \
--name mysql \
-р 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql

逐行参数解析:

--name mysql :给容器起个名字,必须唯一

docker run :创建并运行一个容器

-d是让容器在后台运行

-p 3306:3306 :设置端口映射(第一个是宿主机端口,第二个是容器内端口)

-e KEY=VALUE :是设置环境变量(根据该镜像的官方文档做不同的配置)

mysql:指定运行的镜像的名字

端口映射:

因为没法访问mysql容器内部 只能做端口映射

容器内端口不需要改动,取决于进程,比如mysql的端口就是3306

镜像名规范:
  • 镜像名称一般分两部分组成: [repository]:[tag]。
    • repository---镜像名
    • tag---镜像的版本
  • 在没有指定tag时,默认是latest,代表最新版本的镜像

docker pull 拉取镜像

docker images查看本地镜像列表

docker rmi删除镜像

docker build通过声明docker file自定义打包docker镜像

docker save本地镜像保存压缩文件

docker load压缩文件加载本地镜像列表

docker push推送镜像镜像仓库

docker run运行docker镜像注意运行一次镜像就会创建一个容器执行一次就好了

# 暴露指定的服务端口
docker run -d -p 8080:8080 -e HOST=0.0.0.0 your-image

# 启动临时容器(添加 --rm 自动清理)
# 不添加退出后会停止变成exit状态,自动清除条件​​:仅当手动执行删除或系统级清理时
docker run -it --rm alpine sh

# 重新进入已停止的容器
# -a ​​附加到容器的标准输出/错误流​​,实时显示容器启动时的日志和输出
# -i ​​以交互模式运行​​,允许您通过终端与容器内的进程交互(如输入命令)
docker start -ai

docker stop停止容器内进程容器还在

docker stop <旧容器> && docker rm <旧容器>

docker start重新启动容器内进程

docker ps查看正在容器运行状态看不见

  • docker ps --format "table {{.ID}}\t{{.Image}}{t{{.Ports}}\t{{.Status}}\t{{.Names}}"选择输出

docker ps -a查看所有本地容器包括容器

docker rm删除容器

  • 运行容器不了
    • 删除方法docker stop 然后rm
    • 删除方法 docker rm mysql -f 添加f参数强制删除

docker logs查看容器运行日志

  • docker logs -f实时查看容器运行日志一直卡在当前命令有人操作时候就会继续输出日志使用 ctrl + C停止用于调试

docker exec进入容器内部

  • -it 可交互终端
  • bash指定交互工具bash
docker exec -it nginx sh
列出所有Docker镜像,并通过grep筛选出包含'xxx-frontend'的镜像
docker images | grep xxx-frontend

流程图


curl -v http://localhost:8080

举例拉取nginx镜像本地

# 从官网上拉取镜像到名称,后面不跟版本号默认拉取latest
docker pull nginx
# 查看本地镜像列表
docker images

补充不理解命令可以通过help命令查看

docker save --help

Linux ll命令的作用是 以详细列表形式显示当前目录下的文件和子目录信息 。

ll

针对容器信息过多情况也可以加格式化方式访问,格式会更加清爽

docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
命令别名:

通过修改系统文件简化docker命令输入

docker权限:

临时会话权限
# 检查当前会话是否加载了 docker 组
id -nG
# 或
groups

# 查看当前用户组
groups | grep docker

# 如果未显示 docker 组,重新添加
sudo usermod -aG docker $USER

# 立即激活当前用户对 docker用户组的组成员权限  
# 强制刷新当前会话的组权限,使 docker组权限立即可用
newgrp docker
  • newgrp仅对当前 Shell 会话有效, 新开的终端仍需重新登录或再次执行 newgrp 。
  • 执行后会启动一个子 Shell(可通过 exit返回原 Shell),原环境变量可能被重置。

建议:

  • 长期解决方案仍是 退出并重新登录 。
  • 脚本中建议使用 sg docker "command"替代。
长期权限:

将用户加入 docker组

# 添加当前用户到 docker 组
sudo usermod -aG docker $USER

# 验证是否添加成功
grep docker /etc/group
如何退出/登录服务器
# 1. 关闭当前终端或输入
exit

# 2. 重新登录服务器
ssh tenfeifang@your-server-ip

数据卷挂载宿主机容器目录双向映射

数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。

创建数据就会当前宿主机创建对应真实目录也就是容器当前宿主映射

好处因为镜像一个最小单位只包括当前镜像运行配置我们需要镜像其他操作为了引入其他操作配置需要数据卷挂载

声明数据每个数据卷宿主机一个目录进行一一对应

卷是逻辑的,虚拟的,但是对应的目录是真实的

这样之后就会双向绑定双向映射一个地方修改另一个地方也会一起修改

  • 在执行docker run命令时,使用-v数据卷:容器内目录 可以完成数据卷挂载
  • 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
# 数据卷目录随便写,只要在宿主机上不和别的目录冲突就行
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx

# 查看映射的html数据卷的详细信息
docker valume inspect html

本地目录挂载

# 查看当前容器详情
docker inspect <容器名称>

数据挂载docker自动生成宿主挂载位置我们可以自定义挂载位置挂载名称

针对类似mysql这种自带数据卷容器我们最好数据卷进行本地自定义目录挂载防止mysql版本升级导致每次生成匿名数据卷mysql存储数据的数据防止数据过多不好迁移所以自己生成数据卷名字不一样导致数据丢失版本升级导致mysql重新生成匿名数据卷

  • 在执行docker run命令时,使用 -v 本地目录:容器内目录 可以完成本地目录挂载
  • 本地目录必须以"/"或"./"开头,如果直接以名称开头,会被识别为数据卷而非本地目录
    • -v mysql : /var/lib/mysql 会被识别为一个数据卷叫mysql
    • -v./mysql : /var/lib/mysd会被识别为当前目录下的mysql目录

注意因为数据卷映射宿主机所以一旦我们完成改造无论多少myslq都是同步我们宿主机目录数据一直

原因

  • 宿主机目录一直容器存储位置一直不变就能一直映射
  • 之前一直生成匿名存储卷因为没有真正我们自定义本地目录挂载导致mysql检测不到当前容器目录挂载就会自动生成匿名数据卷
  • 当然我们可以自己存储挂载挂载volume目录下也是生成匿名数据卷

总之创建容器时候如果指定数据卷就会生成匿名数据卷就会导致随机

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐