docker使用学习

docker基本命令

1、查看容器

docker ps  -a -- 查看运行中的容器
docker ps  -- 查看所有的容器

2、查询镜像

docker images

3、进入容器

docker exec -it xxxx bash

xxxx为container id或者names

使用Dockerfile构建镜像

首先将需要构建的jar包文件放在Dockerfile同目录。

Dockerfile内容如下:

# 基于哪个镜像
FROM java:8
# 将本地文件夹挂载到当前容器
VOLUME /tmp

# 复制文件到容器
ADD yyblog.jar yy.jar

# 声明需要暴露的端口
EXPOSE 8080

# 配置容器启动命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/yy.jar"]

FROM:
    Docker是基于镜像的部署,幸运的是Docker官方和开发者们为我们维护了许多高质量的Docker镜像,而基于这些镜像我们能做出符合自己需求的镜像。此处的FROM意思为我们即将要创建的镜像的基础镜像的名字,这个名字可以是我们本地已有的镜像,也可以是Docker Hub上的镜像,如果是Docker Hub上的镜像,此时docker daemon会为我们自动下载该镜像。还有一个要注意的点,如果是本地镜像要加上版本(镜像名:版本号),否则默认版本号为latest。

VOLUME:

    Docker的运行相当于是操作系统的一个进程,但是该进程又与普通进程有些许不同,因为该进程内部维护着的是我们的一个微服务的完整结构,而往往项目中需要运行的微服务都有记录日志或者其他写出文件的功能。设想一下这样的情况:我们的微服务现在正在运行,但是访问量突然增大,开发人员又没有关注到这一点,没有进行水平扩展,这时候很有可能这个微服务就down了,而这个微服务一旦down了之后,出现的情况就是整个容器的status就变成了Exited,而此时如果将容器删除,容器中的所有数据卷会跟随容器一起删除,因为这些数据卷是临时的。此处的映射路径为/tmp。这是我们自定义的映射路径,后续要演示记录日志的功能。当然也可以指定其他路径,其效果都是在主机的/var/lib/docker/volumes目录下创建一个临时文件,并链接到容器的链接路径。而为什么链接到容器的/tmp目录呢?因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用/tmp作为工作目录。当然此处的/tmp也可以变成你的日志记录文件夹,这样就可以在本地实时查看日志记录了。

ADD:

    将我们自身的项目yyblog.jar作为yy.jar加入到容器中。

EXPORT:
    该命令用于声明在运行时容器提供服务的端口。注意:这只是一个声明,运行时并不会因为该声明就打开相应的端口。该指令的作用是帮助镜像使用者理解该镜像服务的守护端口;其次是当运行时使用随机映射时(即run命令的-P参数),会自动映射EXPORT的端口。

ENTRYPOINT:
    该命令制定Docker容器启动时执行的命令,可多次设置,但只有最后一条会生效。

    ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/yy.jar"]这条命令中可能部分读者会对   -Djava.security.egd=file:/dev/./urandom   这条命令有疑惑,这是因为linux中和windows中取随机数时的参考策略不同,linux默认的随机数会被取完,导致返回-1.而制定/dev/./urandom这个取随机数的策略时,当随机数取完之后会返回伪随机数,不至于影响业务。

使用docker build命令构建镜像

docker build -t laoyeye/yyblog.jar:1.0 .

格式:docker build -t 仓库名/镜像名(:标签)Dockerfile的相对位置

这里-t主要是指定镜像的标签

启动镜像

docker run -d -p 8080:8080 laoyeye/yyblog.jar:1.0

 docker-compose 构建项目基本环境

docker-compose.yml

version: ‘3.3‘
 
services:
  mysql:
    image: mysql:5.7
    container_name: mysql-docker  # 指定容器名称,如果不设置此参数,则由系统自动生成
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci # 设置utf8字符集
    restart: always
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - /etc/localtime:/etc/localtime:ro     # 设置容器时区与宿主机保持一致
      - ./mysql/data:/var/lib/mysql          # 挂载数据库保存目录到宿主机,防止数据丢失
      - ./mysql/config:/etc/mysql/conf.d     # 挂载数据库配置文件
  redis:
    # 指定镜像
    image: redis:4
    container_name: redis-docker  # 指定容器名称,如果不设置此参数,则由系统自动生成
    command: redis-server --requirepass 123456 --appendonly yes
    restart: always
    ports:
      # 端口映射
      - 6379:6379
    volumes:
      # 目录映射
      - /etc/localtime:/etc/localtime:ro # 设置容器时区与宿主机保持一致
      - ./redis/data:/data
      - ./redis/redis.conf:/etc/redis.conf

更新中ing