docker,docker-compose使用记录

本文详细介绍了Docker的基础命令,包括安装镜像、创建容器、构建自定义镜像等。接着讲解了docker-compose的安装与yaml文件的制作,用于一键启动多个关联服务。此外,还涵盖了elasticsearch和minio的Docker安装过程及遇到的问题与解决办法。
摘要由CSDN通过智能技术生成


docker使用记录:

一、基础命令

  1. 测试docker是否安装成功:docker pull hello-world
    并运行:docker run hello-world

  2. 联网搜索镜像,例如:docker search java

  3. 下载镜像:docker pull java

  4. 自己构建image:
    4.1 需要写Dockerfile,例如:

    # 基于centos7的docker
     FROM centos:7 
    # ADD命令的压缩文件会自动解压
    ADD myserver-0.0.1-SNAPSHOT.tar.gz  /opt/    
    ADD jdk-8u291-linux-x64.tar.gz /usr/local 
        
    # 添加环境变量
    ENV JAVA_HOME=/usr/local/jdk1.8.0_291 
    ENV JRE_HOME=${JAVA_HOME}/jre
    ENV CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
    ENV JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
    ENV PATH=$PATH:${JAVA_PATH}
    ENV JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8
    EXPOSE 8080 # 暴露端口
    CMD /opt/myserver-0.0.1-SNAPSHOT/bin/start.sh  # CMD会执行命令,容器启动时执行
    

    4.2 在Dockerfile所在目录,执行:docker build -t 镜像名 .
    4.3 如果build成功,执行docker images -a 查看当前设备上所有的镜像;可以执行命令:docker run -p 8900:8900 -d 镜像名 ,启生成一个容器,并运行,若容器中没有后台进程在运行,则容器状态会由Up转为Exited,例如上述的hello-world运行后立马转为Exited;-p是将容器中的端口与宿主机的端口进行映射, -d是后台运行。
    执行docker ps -a 可以查看所有的容器
    在这里插入图片描述

    4.4 每执行一次run都会生成一个container,如果生成的container是运行状态(Up状态)的话,则可以进入容器中:docker exec -it 容器id /bin/bash ;
    其中查询容器id:docker ps -a ,如果不加-a则表示只查询正在运行状态的容器
    4.5 退出容器: exit

  5. 将宿主机中的文件复制到容器中:docker cp 宿主机文件 容器id:容器内部路径

  6. 将容器中的文件复制到宿主机中:docker cp 容器id:容器内部文件 宿主机文件

  7. 容器启动:docker start 容器id, 容器停止:docker stop 容器id

  8. 删除容器:docker rm 容器id 可以同时删除多个容器,多个id之间使用空格连接

  9. 删除镜像:docker rmi 镜像名

  10. docker服务启动:systemctl start docker

  11. 镜像导出导入:docker save 镜像名 > 文件名.tar, docker load < 文件名.tar , 只会导出制作build后生成的镜像,如果在后续启动了一个容器,并且在容器内部新增的操作都不会被导出。

  12. 容器导出导入:docker export 容器id > 文件名.tar, docker import 文件名.tar 镜像名 ,会导出当前容器中的状态。

二、docker-compose 的使用

1. 安装

进入GitHub,找到docker-compose的某一个版本,例如:https://github.com/docker/compose/releases/tag/v2.20.2
在这里插入图片描述
根据自己设备系统的版本,找到对应的包,例如:docker-compose-linux-x86_64,下载完成后放到设备上的/usr/local/bin/目录下,并重命名为docker-compose,安装完成。执行docker-compose --version可以看当前安装的版本号。

2.制作docker-compose.yaml文件

主要目的是通过脚本,将多个容器一次全部启动。
此处需要启动redis、MySQL、自己的springboot服务
制作过程:由于之前未使用过docker,首先是一个镜像一个镜像的配置

  1. 自己的springboot服务
    首先服务需要java环境,可以直接通过docker pull java:8 获取java的镜像,再将容器进行启动,发现在镜像中缺少很多基础Linux命令,例如vi, ps ,netstat等等,且本地网络中无法直接通过网络安装对应的命令,所以改为使用基于centos:7的镜像,根据自己的需求build一个镜像,前面给的Dockerfile内容就是使用到的Dockerfile;如果后续需要在别的设备上使用该镜像,可以将镜像进行导出, 由于没有在容器中进行修改文件,此处直接使用docker save , 使用时则使用docker load导入。可以将一些配置文件进行挂载,后续在启动容器之前,直接可以直接修改宿主机的文件就可以,例如连接的mysql配置等等。
  2. redis
    由于redis我没有做任何配置,直接进行docker pull redis 拉取镜像,可以根据自己版本需求进行获取
  3. Mysql
    也是直接拉取镜像,可以根据自己版本需求进行获取。

在设备上将所有的镜像导入后,可以开始制作docker-compose.yaml文件,文件中用到的镜像如果宿主机中不存在的话,则会自动拉取,若设备不能联网,先将镜像准备好。
docker-compose启动方法:
在docker-compose.yaml文件所在路径执行docker-compose up -d, -d表示后台执行
最终的docker-compose.yaml文件内容:

version: "3.7"
services:
  redis:
    image: "redis:latest"
    # 给容器一个name
    container_name: myredis
    ports:
      #TCP 端口映射
      - 6379:6379
    command: /usr/local/bin/redis-server &

  mysql:
    image: "mysql:5.7.36"
    container_name: my-mysql
    ports:
      - 3306:3306
    # 启动后需要进行一个初始化的sql
    command:
      --init-file /opt/mysql/init.sql
    environment:
    # 设置root账号的密码
      MYSQL_ROOT_PASSWORD: topsec
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
    # 挂载文件:将使用到的初始化sql脚本,挂载到容器中
    volumes:
      - "./sql/init.sql:/opt/mysql/init.sql"
  nginx:
    image: "ngin-ubuntu:latest"
    container_name: my-nginx
    ports:
      - 80:80
      - 443:443
	# 挂载自己的nginx启动配置,nginx镜像是直接通过docker pull nginx进行获取的,nginx的默认启动配置为/etc/nginx/nginx.conf,所以此处将自己的配置文件挂载在对应的路径,进行覆盖
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
     # comman命令类与是Dockerfile中CMD命令,如果此处进行了设置,则Dockerfile中的CMD命令不会执行,此处设置的是将nginx启动
    command: /bin/bash -c "nginx -g 'daemon off;'"
  elasticsearch:
    image: "elasticsearch:7.11.2"
    container_name: my-es
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      - "ES_JAVA_OPTS=-Xms256m -Xmx256m"
      - "discovery.type=single-node"
  myserver:
    image: "myserver-centos:latest"
    container_name: my-file
    ports:
      - 8900:8900
      - 9000:9000
    # 由于myserver中需要使用到上述的redis和mysql服务,此处设置一个先后顺序
    depends_on:
      - redis
      - mysql
    # 由于需要执行dmidecode命令,但是容器中不能执行,需要依赖宿主机的部分文件,此处将宿主机中的/sbin/dmidecode, /dev/mem挂载到容器中;将服务中的配置文件进行挂载
    volumes:
      - "/sbin/dmidecode:/sbin/dmidecode"
      - "/dev/mem:/dev/mem"
      - "./myserverfile/application.properties:/opt/myserver-0.0.1-SNAPSHOT/conf/config/application.properties"
      - "./myserverfile/application-prod.properties:/opt/myserver-0.0.1-SNAPSHOT/conf/config/application-prod.properties"
      - "./myserverfile/myserver-0.0.1-SNAPSHOT.jar:/opt/myserver-0.0.1-SNAPSHOT/lib/myserver-0.0.1-SNAPSHOT.jar"
    # 给容器中root权限,执行dmidecode命令需要root权限
    privileged: true
    # 设置启动脚本, 由于启动过程中需要使用mysql,若连接不是数据库,则会导致服务启动失败,此处进行一个延时处理,并且最后执行的命令需要维持容器不退出,此处使用tail 日志,并且最后能使用docker logs查看日志;
    command: >
      /bin/bash -c 'sleep 30; /opt/myserver-0.0.1-SNAPSHOT/bin/restart.sh;tail -f /myserver-file/log/web.log '

三、docker安装elasticsearch

  1. docker pull elasticsearch:8.5.0
  2. 启动:docker run -d -p 9203:9200 -p 9303:9300 -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" -v /root/dockers/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:8.5.0 ;使用自己的配置文件/root/dockers/elasticsearch.yml,挂载在容器中
  3. elasticsearch.yml的内容:
cluster.name: "docker-cluster-01"
network.host: 0.0.0.0
# 此处开启xpack,默认为true,查询的资料是为了设置密码,改了密码后,需要使用https访问,将此处改为false,后续使用http访问
xpack.security.enabled: false
# 关闭geoip数据库的更新
ingest.geoip.downloader.enabled: false

xpack.security.enrollment.enabled: true

# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
xpack.security.http.ssl:
  enabled: true
  keystore.path: certs/http.p12

# Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  keystore.path: certs/transport.p12
  truststore.path: certs/transport.p12
# 在默认配置上添加
http.host: 0.0.0.0
transport.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
  1. 安装中的问题:
    在8.5.0版本中默认配置xpack.security.enabled: true; ingest.geoip.downloader.enabled: true, 想在启用容器时使用自己的配置文件,将这两个配置修改为false,但是挂载失败,最后在docker-compose中添加环境变量
 environment:
      - "ES_JAVA_OPTS=-Xms256m -Xmx256m"
      - "discovery.type=single-node"
      - "ingest.geoip.downloader.enabled=false"
      - "xpack.security.enabled=false"

最终在结合springboot使用时,发现版本不兼容,es版本过高,则改为7.11.2版本,发现在7x版本中,默认配置只有
cluster.name: "docker-cluster"
network.host: 0.0.0.0,所以此时配置满足需求,不进行追加额外的配置

四、docker安装mino

  1. docker pull minio/minio,获取到的版本为 RELEASE.2022-01-04T07-41-07Z
  2. 使用docker-compose启动,yml文件内容为(参考:https://www.cnblogs.com/jetsung/p/minio-oss.html):
version: '3.7'

services:
  server:
    image: minio/minio:latest
    command: server --console-address ":9101" /data
    environment:
    # 设置账号密码,对长度有要求: 用户名长度至少3位, 密码长度至少8位
      MINIO_ROOT_USER: 用户名
      MINIO_ROOT_PASSWORD: 密码
  # 为 Console 管理平台登录网址,若不希望通过浏览器登录,可以增加 MINIO_BROWSER: off,禁止浏览器登录;
      MINIO_BROWSER_REDIRECT_URL: http://loaclhost:9101
     # 为文件分享网址。若未设置,则默认为本身的容器 IP,不可正常使用
     MINIO_SERVER_URL: http://loaclhost:9100
    healthcheck:
      test: ["CMD", "curl", "-f", "http://10.26.80.146:9100/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3
    volumes:
      - /files:/data
    ports:
      - "9100:9000"
      - "9101:9101"

由于9000端口已被使用,将minio的启动端口映射为9100。

引用:

https://www.cnblogs.com/jetsung/p/minio-oss.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值