Docker基本使用(持续更新中)

docker介绍

docker是一个开源的应用容器引擎,常见的容器引擎例如:docker、podman、containerd等,但是docker应用还是相对比较多。

1 常用命令

1.1保存镜像到本地

命令如下:

docker save -o nginx.tar nginx:latest

举例

结果:在当前目录下多了一个nginx.tar的包

1.2加载本地镜像 

命令如下:

docker load -i nginx.tar 

举例:

查看当前镜像是没有nginx的

加载本地镜像

结果:查看镜像就会发现多了一个nginx

1.3 查看某个镜像日志 

命令如下:

docker logs -f 容器名

注意:加上-f是实时查看日志输出,不加的话是输出当前时刻前的日志。 

1.4 进入容器内部

命令如下:

docker exec -it 容器名  bash

举例:

1.5 Linux命令设置别名 

步骤一:打开别名文件,准备编辑

vi ~/.bashrc

步骤二:添加命名的别名 

步骤三:让别名生效

source ~/.bashrc 

步骤四:测试

 1.6 数据卷

1.6.1数据卷介绍与常见命令

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

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

  • html:放置一些静态资源

  • conf:放置配置文件

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

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

在上图中:

  • 我们创建了两个数据卷:confhtml

  • Nginx容器内部的conf目录和html目录分别与两个数据卷关联。

  • 而数据卷conf和html分别指向了宿主机的/var/lib/docker/volumes/conf/_data目录和/var/lib/docker/volumes/html/_data目录

这样以来,容器内的confhtml目录就 与宿主机的confhtml目录关联起来,我们称为挂载。此时,我们操作宿主机的/var/lib/docker/volumes/html/_data就是在操作容器内的/usr/share/nginx/html/_data目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。

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

1.6.2 查看容器的挂在情况

命名:

docker inspect 容器名

1.6.3挂载本地目录或文件 

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

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

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

举例:

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

2 自定义镜像

2.1 dockerfile

 举例:

 

举例

步骤一:创建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 docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

步骤二:将项目拷贝到与Dockerfile同一目录下(当然也并不是必须这样做)

步骤三:构建镜像

docker build -t demo:1.0 .

注意:后面的.不要忘记加了,这个点代码Dockerfile所在位置。

步骤四:运行镜像

docker run -d -p 8080:8080 --name demo demo:1.0

 3 容器网路互联

所有说docker内的容器是可以通过网桥相互访问的。但是容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,连接会失败。所以,我们必须借助于docker的网络功能来解决这个问题,

 

使用步骤:

步骤一:创建网络 

docker network create heima

步骤二:可以在创建容器的时候将容器直接加入网络

docker run -d -p 8080:8080 --name demo --network heima  demo:1.0

查看容器网络详情:

docker inspect demo

4 DockerCompose

大家可以看到,我们部署一个简单的java项目,其中包含3个容器:

  • MySQL

  • Nginx

  • Java项目

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

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

如果用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"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - hm-net
  hmall:
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: hmall
    ports:
      - "8080:8080"
    networks:
      - hm-net
    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:
      - hmall
    networks:
      - hm-net
networks:
  hm-net:
    name: hmall

猜你喜欢

转载自blog.csdn.net/m0_75165868/article/details/142268483