Docker 笔记

目录

初始入门

镜像命名规范

常用dockers命令

Linux系统自定义运行命令

进入并编写自定义命令配置

使用 别名 alias 自定义命令

注意重载我们的配置,使其生效

数据卷

提示

入门应用例子

匿名卷

-v 容器数据卷挂载

应用例子

第一步:创建对应的本地挂载目录

第二步:将配置文件以及初始化sql脚本放到我们对应的挂载目录中

第三步:创建并运行指定挂载docker命令

自定义镜像

创建 Dockerfile

构建镜像

例子

docker网络

自定义docker网络

使用示例:


初始入门

例子:docker 安装Mysql

docker run -d \
    --name mysql \
    -p 3306:3306 \
    -e TZ=Asia/Shanghai \
    -e MYSQL_ROOT_PASSWORD=123456
    mysql
  • docker run :  创建并运行一个容器
  • -d : 是让容器在后台运行
  • --name ___ :  给容器起别名,必须唯一,方便区分不同容器
  • -p (外部系统端口):(容器暴露端口)   :  设置外部系统与容器端口之间的映射
  • -e KEY=VALUE:是设置环境变量
  • 最后结尾非关键字字符串 mysql :指定运行的镜像名字

镜像命名规范

镜像名称一般分两部分组成 :  [repository] :  [tag]。例如:mysql:5.7

  • 其中repository就是镜像名
  • tag是镜像的版本

在没有指定tag时,默认是latest,代表最新版本的镜像。

常用dockers命令

docker ps : 查看当前运行的 docker 容器

docker ps - a: 查看所有的 docker 容器

docker ps -q:查看所有正在运行的 docker 容器ID

docker stop [容器名称或者容器ID]:停止对应的容器

docker stop $(docker ps -q):停止所有正在运行的容器 ID

docker start [容器名称或者容器ID]:启动对应的容器

docker logs [容器名称或者容器ID]:查看当前容器的运行日志

docker logs [容器名称或者容器ID] - f :查看并跟踪当前容器的运行日志

docker exec -it [容器名称或者容器ID] bash:进入对应的docker容器

  • -it                 表示 交互的意思
  • bash            表示 使用 bash 命令进行交互

docker exec -it [容器名称或者容器ID] [进入容器后执行的命令]:进入对应的docker容器并执行相应的命令

  • 例如:docker exec -it mysql mysql -uroot -p:进入mysql命名的容器,并执行mysql -uroot -p命令

docker rm [容器名称或者容器ID]:删除对应的容器

docker rm [容器名称或者容器ID] -f:强制删除容器

docker inspect [容器名称或者容器ID]:查看容器详情

Linux系统自定义运行命令

在Linux系统中,自定义运行命令可以通过多种方式实现。

在这里我简单的介绍一个简易的自定义命令。

进入并编写自定义命令配置

vim ~/.bashrc

成功进入自定义命令配置,我们可以发现平时曾用到的常用命令 ls,实际上也是内部系统自定义的一个命令。

使用 别名 alias 自定义命令

在底部加上 自己的自定义的命令

保存并退出     :wq

注意重载我们的配置,使其生效

执行重载我们配置的命令

source ~/.bashrc

测试我们自定义命令是否成功

dis

结果执行命令成功,说明我们自定义的命令生效了。

数据卷

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

数据卷命令语法:docker volume  [数据卷相关命令]

  • create:创建数据卷
  • ls: 查看所有数据卷
  • rm:删除指定数据卷
  • inspect [挂载数据卷的别名] :查看某个数据卷的详情
  • prune:清除数据卷
  • --help:docker volume 命令的帮助文档

提示

  • 在执行docker run命令时,使用参数   -v [数据卷]:[容器内目录]    可以完成数据卷挂载
  • 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
  • 注意!!!数据挂载只能在创建容器时进行挂载,如果容器已经创建了,无法再进行挂载

入门应用例子

使用 nginx 挂载,修改 nginx中的 index.html,并添加一些文件,映射到docker容器中。

通过官方文档可以得知 nginx容器中 index.html 的路径在

/usr/share/nginx/html

创建 nginx 容器 并挂载 index_html

docker run -d --name nginx -p 8081:80 -v index_html:/usr/share/nginx/html nginx

通过 数据卷命令 ls 查看是否成功挂载我们的 index_html

docker volume ls

最后显示结果:

出现了我们的挂载卷的别名说明挂载成功。

通过 数据卷命令 inspect 查看我们挂载的数据卷详细情况

docker volume inspect index_html

最后运行结果

[
    {
        "CreatedAt": "2024-10-20T00:22:53+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/index_html/_data",
        "Name": "index_html",
        "Options": null,
        "Scope": "local"
    }
]
  • CreatedAt:这个字段表示卷被创建的时间。

  • Driver:这个字段表示用于创建和管理这个卷的驱动程序。在这个例子中,驱动程序是 "local",这是 Docker 默认的卷驱动程序,用于本地文件系统。

  • Labels:这个字段包含了与卷关联的键值对标签。在这个例子中,Labelsnull,表示没有设置任何标签。

  • Mountpoint:这个字段提供了卷在宿主机上的挂载点路径。在这个例子中,卷被挂载在 /var/lib/docker/volumes/index_html/_data

  • Name:这个字段表示卷的名称。在这个例子中,卷的名称是 "index_html"。

  • Options:这个字段包含了创建卷时指定的额外选项。在这个例子中,Optionsnull,表示没有指定任何额外选项。

  • Scope:这个字段表示卷的作用域。"local" 表示这个卷仅在创建它的 Docker 守护进程上可用。

运行成功,查看到我们挂载卷的详细结果,通过 Mountpoint 我们可以得知在宿主机中映射到docker容器中的文件路径。

我们运行以下命令去查看我们映射文件是否存在

cd /var/lib/docker/volumes/index_html/_data && ll

运行结果:

说明我们映射成功,通过查看index.html发现文件内容与我们的nginx默认的index文件内容是一致的。

通过修改index文件,我们可以发现

通过映射发生了变化。

同时我们添加的文件也可以成功映射添加上去访问成功。

匿名卷

在Docker中,匿名卷是一种特殊类型的卷,它在运行容器时自动创建,并且没有与之关联的命名卷。

正如我们初始入门中使用 docker run 中并没有指定挂载卷,我们创建的容器会根据容器内容所需要指定挂载卷时,自动创建并分配映射指定容器需求的卷。

我们可以通过 docker inspect [容器名称或者容器ID] 进行查看详细的信息

例如,我们运行以下命令查看mysql容器详情

docker inspect mysql
  • NetworkSettings:关于网络设置,我们可以看到宿主机之前的端口映射

  • Mounts:关于挂载卷的设置,我们可以看到映射的卷名特别长,这就是创建容器时自动生成匿名映射卷

-v 容器数据卷挂载

在运行Docker容器时,可以使用-v参数 来挂载一个卷。

语法:docker run -d -v [宿主机目录]:[容器内目录]  [容器名称或者容器ID]

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

应用例子

根据官方镜像文档说明,总结并按照一下要求完成下面任务

  1. 挂载/home/angindem/mysql/data到容器内的/var/lib/mysql目录
  2. 挂载/home/angindem/mysql/init到容器内的/docker-entrypoint-initdb.d目录
  3. 挂载/home/angindem/mysql/conf到容器内的/etc/mysql/conf.d目录

在这里我们根据内容要求对应 -v 操作就可以了,下面是该任务的答案

第一步:创建对应的本地挂载目录
cd /home/angindem && mkdir mysql && cd mysql && mkdir data conf init
第二步:将配置文件以及初始化sql脚本放到我们对应的挂载目录中

配置 angindem.cnf 文件命令:

echo -e "[client]\ndefault_character_set=utf8mb4\n\n[mysql]\ndefault_character_set=utf8mb4\n\n[mysqld]\nbind-address = 0.0.0.0\ncharacter_set_server=utf8mb4\ncollation_server=utf8mb4_unicode_ci\ninit_connect='SET NAMES utf8mb4'" > angindem.cnf

初始化的 sql 脚本,根据自己的具体情况来放置到 init 目录中,这里我放置我自己的。

第三步:创建并运行指定挂载docker命令
docker run -d  --name mysql3  -p 3318:3306   -e TZ=Asia/Shanghai  -e MYSQL_ROOT_PASSWORD=123456 -v /home/angindem/mysql/data:/var/lib/mysql -v /home/angindem/mysql/init:/docker-entrypoint-initdb.d -v /home/angindem/mysql/conf:/etc/mysql/conf.d  mysql

运行创建成功后,我们查看data目录可以发现,docker容器成功映射,并且初始化脚本blog也存在

cd /home/angindem/mysql/data && ls

自定义镜像

Docker 自定义镜像是容器化应用的关键。通过本文,你应该大概的了解了如何创建、构建、运行和分享 Docker 镜像。

在这里自定义镜像不仅可以帮助你在不同环境之间轻松迁移应用,还可以确保应用的一致性和可重复性。

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

根据构建 Java 镜像,我们可以了解到 关于 docker 的三种结构。

docker的三种结构:

  • 入口(Entrypoint):镜像运行入口,一般是程序启动的脚本和参数
  • 层(Layer):添加安装包、依赖、配置等,每次操作都形成新的一层。
  • 基础镜像(Baselmage):应用依赖的系统函数库、环境、配置、文件等

创建 Dockerfile

创建自定义镜像的第一步是编写 Dockerfile。Dockerfile 是一个包含用于构建镜像的指令的文本文件。其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下:

指令说明示例
FROM指定基础镜像

FROM ubuntu:20.04

ENV设置环境变量,可在后面指令使用ENV key value
COPY拷贝本地文件到镜像的指定目录COPY ./jre11.tar.gz /tmp
RUN执行Linux的shell命令,一般是安装过程的命令RUN tar-zxvf /tmp/jre11.tar.gz && EXPORTS path=/tmp/jre11:$path
EXPOSE指定容器运行时监听的端口,是给镜像使用者看的EXPOSE 8080
ENTRYPOINT镜像中应用的启动命令,容器运行时调用ENTRYPOINT java-jar xx.jar

更新详细语法说明,参考官网文档:Dockerfile reference | Docker Docs

我们可以基于Ubuntu基础镜像,利用Dockerfile描述镜像结构

#指定基础镜像
FROM ubuntu:20.04

#配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local

#拷贝jdk和java项目的包
CoPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar

#安装JDK
RUN cd $JAVA_DIR\&& tar -xf ./jdk8.tar.gz&& mv ./jdk1.8.0_144 ./java8

# 配置环境变量
ENV JAVA HOME=$JAVA DIR/java8
ENV PATH=SPATH:SJAVA HOME/bin

#入口,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"]

构建镜像

当编写好了Dockerfile,可以利用下面命令来构建镜像:

docker build -t myImages:1.0 .
  • -t:是给镜像起名
  • 格式依然是 repository:tag  的格式,不指定tag时,默认为 latest
  • ( . ) :是指定Dockerfile所在目录,如果就在当前目录则指定为 "./"

例子

这里引用我们之前 Java文件上传删除相关模块(上传到物理存储)-优快云博客 文件上传模块案例。

Dockerfile文件

# 基础镜像
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 angindem.jar /app.jar
# 入口                                                                                                                                                                      
ENTRYPOINT ["java", "-jar", "/app.jar"]

构建命令

docker build -t angindem .

效果:

无报错情况。查看镜像发现自定义镜像构建成功。

运行容器。

docker run -d --name angindem -p 9898:9898 -v ./images:/images angindem

测试访问。

部署成功!!!!

docker网络

我们创建docker容器的时候,未指定docker网络设置,默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上,这个虚拟网络名为 docker0 ,使用虚拟网桥分配的IP,当我们重新创建的时候,IP发生变动,我们负责服务docker容器互联相关指定IP的容器就会有可能产生故障。

所以这里我们引用到了 docker自定义网络。

自定义docker网络

加入自定义网络的容器才可以通过容器名互相访问,Docker的网络操作命令如下:

命令说明
docker network create [自定义网络名]创建一个网络
docker network ls查看所有网络
docker network rm [自定义网络名]删除指定网络
docker network prune清楚未使用的网络
docker network connect [自定义网络名] [容器名]使指定容器连接加入某网络
docker network disconnect使指定容器连接离开某网络
docker network inspect查看网络详细信息

使用示例:

创建一个自定义网络 angindemNet

docker network create angindemNet

创建容器同时指定自定义 docker 网络

docker run -d --name angindem -p 9898:9898 -v ./images:/images --network angindemNet angindem

查看创建的容器网桥

docker inspect angindem 

当我们创建容器同时指定自定义网络,创建的容器不会连接默认的网桥网络。

应用实例:

尝试前后端分离部署,还是引用我们之前Java文件上传删除相关模块文件上传模块案例。

后端部署:

docker run -d --name angindemBack -p 9898:9898 -v ./images:/images --network angindemNet angindemback

后端服务启动成功。

前端部署:

这里通过官网https://hub.docker.com/_/nginx,查看nginx容器部署说明可以知道。

$ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
$ docker run --name my-custom-nginx-container -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx

nginx.conf 和 前端html 的挂载目录位置在哪里。

运行一下命令部署我们的前端:

docker run -d --name angindemFront -p 8081:80 -v ./html:/usr/share/nginx/html -v ./nginx.conf:/etc/nginx/nginx.conf nginx

访问部署成功!!!

测试项目运行

前后端分别部署成功!!!

DockerCompose

        Docker Compose通过一个单独的 docker-compose.yml 模板文件 (YAML格式) 来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署

        

docker-compose 编写语法

        通过对比我们创建的容器以及 docker-compose.yml 的语法部署容器可以查找对应的规律。

创建mysql容器语法

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

docker-compose.yml 相对应的语法

version: "3.8"
services:
	mysql:
		image: mysql
		container_name: mysql
		ports:
			- "3306:3306"
		environment:
			TZ: Asia/Shanghai
			MYSQL_ROOT_PASSWORD: 123
		volumes:
			- "./mysql/data:/var/lib/mysql"
			- "./mysql/conf:/etc/mysql/conf.d"
			- "./mysql/init:/docker-entrypoint-initdb.d"
		networks:
			- angindem

按照这样的规律相对应即可根据我们的需求进行设置快速部署项目

version: "3.8"

services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:           # 这里表示容器使用哪一个 docker 容器网络
      - angindem-net
  angindem:
    # build: 这段语法表示 寻找 Dockerfile 文件随后进行创建容器镜像
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: angindem
    ports:
      - "8080:8080"
    networks:
      - angindem-net
    # depends_on:    这段语法表示 依赖于哪一个服务,随后会先创建依赖的服务容器在创建自身服务容器
    depends_on:   
      - mysql
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "18080:18080"
      - "18081:18081"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/usr/share/nginx/html"
    depends_on:
      - angindem
    networks:
      - angindem-net

networks:   
# networks:   这段语法表示 创建 docker 容器网络
  angindem-net:
    name: angindem

 docker-compose 命令

格式:

docker compose [OPTIONS] [COMMAND]
类型参数或指令说明
options-f指定compose文件的路径和名称
-p指定project名称
Commandsup创建并启动所有service容器
down停止并移除所有容器、网络
ps列出所有启动的容器
logs查看指定容器的日志
stop停止容器
start启动容器
restart重启容器
top查看运行的进程
exec在指定的运行中容器中执行命令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值