Docker基础

Docker基础

Docker常见命令

Docker最常见的命令就是操作镜像、容器的命令,详见官方文档: https://docs.docker.com/

案列:查看DockerHub,拉取Nginx镜像,创建并运行Nginx容器

拉取镜像

docker pull nginx

查看镜像

docker images

保存镜像为tar包

docker save -o nginx.tar nginx:latest

  • -o 指定输出地址

删除镜像

docker rmi nginx:latest

加载镜像tar包

docker load -i nginx.tar

  • -i 要加载的tar包
  • -q 不打印信息

创建容器

docker run -d --name nginx -p 80:80 nginx

  • -d 后台运行
  • --name 容器名称
  • -p 端口映射
  • nginx 镜像名称

查看容器

docker ps

  • -a 查询所有容器,包含未启动的。不加-a只显示启动的容器

启动容器

docker start nginx

关闭容器

docker stop nginx

查看容器日志

docker logs -f nginx

  • -f 跟踪日志输出

进入容器

docker exec -it nginx bash

  • -it 开启一个交互模式的终端

删除容器

docker rm nginx
必须要停止容器运行才能删除

命令别名

用于给很长的命令起个别名方便使用

  • 修改bashrc文件
vim ~/.bashrc

  • 修改完之后需要source一下,让文件生效
source ~/.bashrc
  • 结果

数据卷挂载

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

以nginx为例,我们知道nginx中有两个关键的目录:

  • html:放置一些静态资源
  • conf:放置配置文件

如果我们要让nginx代理我们的静态资源,最好是放到html目录;如果我们要修改nginx的配置,最好是找到conf下的nginx.conf文件。

但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。如图:

  • 我们创建了两个数据卷: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代理了。

/var/lib/docker/volumes 这个目录就是默认的存放所有容器数据卷的目录,其下再根据数据卷名称创建新目录,格式为/数据卷名/_data。

为什么不让容器目录直接指向宿主机目录呢?

  • 因为直接指向宿主机目录就与宿主机强耦合了,如果切换了环境,宿主机目录就可能发生改变了。由于容器一旦创建,目录挂载就无法修改,这样容器就无法正常工作了。

  • 但是容器指向数据卷,一个逻辑名称,而数据卷再指向宿主机目录,就不存在强耦合。如果宿主机目录发生改变,只要改变数据卷与宿主机目录之间的映射关系即可。

不过,我们通过由于数据卷目录比较深,不好寻找,通常我们也允许让容器直接与宿主机目录挂载而不使用数据卷

数据卷命令

命令 说明 地址
docker volume create 创建数据卷 docker volume create
docker volume ls 查看所有数据卷 docker volume ls
docker volume rm 删除指定数据卷 docker volume rm
docker volume inspect 查看某个数据卷的详情 docker volume inspect
docker volume prune 清除数据卷 docker volume prune

注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。
注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。
注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。

创建容器并指定数据卷

# 创建容器并指定数据卷,注意通过 -v 参数来指定数据卷,数据卷名称:容器内目录
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx

查看数据卷

docker volume ls

查看数据卷详情

# html:数据卷名称
docker volume inspect html

本地目录挂载

数据卷挂载 的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载。挂载语法与数据卷类似:

# 挂载本地目录
-v 本地目录:容器内目录
# 挂载本地文件
-v 本地文件:容器内文件

注意:本地目录或文件必须以 / 或 ./开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。

Dockerfile语法

由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。而这种记录镜像结构的文件就称为Dockerfile,其对应的语法可以参考官方文档:https://docs.docker.com/engine/reference/builder/

指令 说明 示例
FROM 指定基础镜像 FROM centos:7
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

测试

  1. 创建DockerFile文件,下载好jdk镜像,设置时区,准备一个SpringBoot项目启动jar包。

    # 基础镜像
    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"]
    
  2. 执行命令,构建镜像

    # 进入你DockerFile文件目录下构建
    docker build -t docker-demo:1.0 .
    
    • docker build : 就是构建一个docker镜像
    • -t docker-demo:1.0 :-t参数是指定镜像的名称(repository和tag)
    • . : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录
  3. 创建容器并运行

    # 查看镜像
    docker images
    # 创建容器
    docker run -d --name 容器名称 -p 8080:8080 镜像名称:版本号
    

网络

容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,连接会失败。所以,我们必须借助于docker的网络功能来解决这个问题,官方文档:https://docs.docker.com/engine/reference/commandline/network/

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

测试

  1. 创建一个网络

    # 创建网络
    docker network create 网络名称
    # 查看
    docker network ls
    
  2. 将容器添加到网络

    # 第一种方法:已创建好的容器直接加入
    docker network connect 网络名称 容器名称
    # 第二种方法:生成容器时指定网络
    docker run -d --name 容器名称 -p 8080:8080 --network 网络名称 docker-demo
    
  3. 测试

    # 随便进入哪个容器,然后ping别的容器
    docker exec -it 容器名称 bash
    # ping
    ping 容器名称
    

DockerCompose

复杂的项目中会有各种各样的其它中间件,需要部署的东西远不止3个。如果还像之前那样手动的逐一部署,就太麻烦了。而Docker Compose就可以帮助我们实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。https://docs.docker.com/compose/compose-file/compose-file-v3/

docker-compose文件中可以定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于service就是在定义某个应用的运行时参数,因此与docker run参数非常相似。

# 用docker run部署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 \
  --network hmall
  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/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
    networks:
      - new
networks:
  new:
    name: test

docker run和docker compose对比

docker run 参数 docker compose 指令 说明
--name container_name 容器名称
-p ports 端口映射
-e environment 环境变量
-v volumes 数据卷配置
--network networks 网络

docker compose语法

docker compose [OPTIONS] [COMMAND]

docker compose参数介绍

OPTIONS和COMMAND都是可选参数

类型 参数或指令 说明
Options -f 指定compose文件的路径和名称
-p 指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念
Commands up 创建并启动所有service容器
down 停止并移除所有容器、网络
ps 列出所有启动的容器
logs 查看指定容器的日志
stop 停止容器
start 启动容器
restart 重启容器
top 查看运行的进程
exec 在指定的运行中容器中执行命令
posted @ 2023-11-02 14:00  橙香五花肉  阅读(9)  评论(0编辑  收藏  举报