Docker устанавливает Mysql и Redis, а также создает и развертывает образы приложений.

Docker

Чтобы облегчить локальный тестовый проект, облегчить открытие новой среды и облегчить развертывание, я планирую использовать Docker для локальной установки Mysql и Redis.

Создайте проект Springboot, напишите Dockerfile, упакуйте и соберите образ.

Просто используйте docker-compose, чтобы запустить службу.

Кратко опишите docker-compose и K8S.

окрестности

Система: макинтош

Двигатель докера: 19.03.8

Mysql: 5.7, каталог монтирования диска: /Users/yclxiao/Program/volume/mysql

Redis: 5.0.8, каталог монтирования диска: /Users/yclxiao/Program/volume/redis

Установите Mysql-5.7

  1. Потяните официальное зеркало

    docker pull mysql:5.7
    
  2. Посмотреть библиотеку изображений

    docker images
    
  3. Создайте каталог, в котором смонтирован mysql

    mkdir -p /Users/yclxiao/Program/volume/mysql/data /Users/yclxiao/Program/volume/mysql/conf /Users/yclxiao/Program/volume/mysql/logs 
    
  4. Создать cnf-файл

    cd /Users/yclxiao/Program/volume/mysql/conf
    touch my.cnf
    
  5. Создайте контейнер, сопоставьте данные, журналы и файлы конфигурации с этой машиной.

    docker run -p 3306:3306 --name mysql -v /Users/yclxiao/Program/volume/mysql/conf:/etc/mysql/conf.d -v /Users/yclxiao/Program/volume/mysql/logs:/logs -v /Users/yclxiao/Program/volume/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=rootpwd -d mysql:5.7
    

    -d: запустить контейнер в фоновом режиме

    -p: сопоставить порт контейнера с локальным портом

    -v: смонтировать каталог хоста в каталог контейнера

    -e: установить параметры

  6. запустить контейнер

    docker start mysql
    

    В чем разница между docker run xxx и docker start xxx?

    1. запуск докера:

      Он используется только при первом запуске, поместите образ в контейнер, а затем снова запустите контейнер, просто используйте запуск докера.

      docker run эквивалентен выполнению двух команд:

      • docker create: поместить образ в контейнер
      • docker start: запустить контейнер и стать работающим контейнером
    2. запуск докера:

      запустить существующий контейнер

    image-20200317162346126
  7. Используйте Navicat и другие инструменты, чтобы проверить, можно ли его подключить

    Имя пользователя: корень

    Пароль: rootpwd

Установите Redis-5.0.8

  1. Создайте новый каталог, связанный с Redis, в каталоге монтирования хоста.

    /Users/yclxiao/Program/volume/redis/conf

    /Users/yclxiao/Program/volume/redis/data

  2. В разделе /Users/yclxiao/Program/volume/redis/conf

    touch redis.conf
    
  3. Потяните официальное зеркало, посмотрите на зеркало

    docker pull redis:5.0.8
    docker images
    
  4. запустить контейнер,redis:5.0.8имя изображения

    docker run -d --name redis -p 6379:6379 -v /Users/yclxiao/Program/volume/redis/conf/redis.conf:/redis.conf -v /Users/yclxiao/Program/volume/redis/data:/data redis:5.0.8 redis-server --appendonly yes
    

    -d: позволить контейнеру работать в фоновом режиме

    -p: передняя часть — это открытый порт, а задняя — служебный порт внутри контейнера.

    -v: смонтировать каталог хоста в каталог /data контейнера, используйте:

    --name: псевдоним для этого контейнера

    --appendonly: включить сохранение данных

    redis-server --appendonly yes: выполнить команду запуска redis-server в контейнере и запустить постоянную конфигурацию redis.

  5. Просмотр запущенных контейнеров

    docker ps
    

    image-20200317172236278

  6. Тест подключения инструмента RDM ОК

Общие команды докера

docker search #Поиск образов в репозитории реестра

docker pull #загрузить образ из репозитория в локальный

docker images #Список всех изображений

docker tag #Создать псевдоним для изображения

docker rmi имя образа #удалить образ

docker rmi $(docker images -q) #удалить все изображения

docker push #Отправить образ в репозиторий реестра

docker build -t .#Сборка продолжается,: .существенный

docker create #Создать контейнер, но не запускать его

docker run #Создать и запустить контейнер

docker start # Запустить контейнер в остановленном состоянии

docker ps -aq # Список всех идентификаторов контейнеров

docker ps # список запущенных контейнеров

docker ps -a #Просмотреть все процессы

docker stop идентификатор контейнера # остановить контейнер

docker rm container id #удалить контейнер

docker stop $(docker ps -aq) #остановить все контейнеры

docker rm $(docker ps -aq) #удалить все контейнеры

docker kill #Отправить сигнал контейнеру, по умолчанию SIGKILL

docker exec #Войдите в контейнер для выполнения команды

docker inspect #Углубитесь внутрь контейнера, чтобы получить всю информацию о контейнере

Написать Dockerfile

Dockerfile является основой для создания образов Docker, а также важной функцией, которая отличает Docker от других контейнеров.Именно с Dockerfile возможны автоматизация и переносимость Docker.

  • FROM, создайте новый образ из базового образа

    FROM openjdk:8-jdk-alpine
    
  • MAINTAINER, информация о сопровождающем

    MAINTAINER yclxiao <yclxiao@163.com>
    
  • ENV, установить переменные среды

    ENV TESTVAR 123
    
  • RUN, запустить команду оболочки

    RUN xxxxxx
    
  • ДОБАВИТЬ, скопировать внешние файлы на зеркало, src может быть URL

    ADD  xxxxx  /data/xxxxxx
    
  • WORKDIR /path/to/workdir, установить рабочий каталог

    WORKDIR /var/www
    
  • ПОЛЬЗОВАТЕЛЬ, установите идентификатор пользователя

    USER nginx
    
  • VOLUME, установить том, установить том монтирования

    VOLUME ['/data']
    
  • EXPOSE, какие порты открыты

    EXPOSE 8080 8081
    
  • ENTRYPOINT ["исполняемый","парам1","парам2"] выполнить команду

    ENTRYPOINT ["/usr/sbin/nginx"]
    
  • CMD ["param1","param2"]

    CMD ["start"]
    

    Команда, которая выполняется, когда docker создает и запускает контейнер, если установлен ENTRYPOINT, в качестве параметра будет использоваться CMD

Пример: использование Dockerfile для создания образа Java-приложения

FROM openjdk:8-jdk-alpine
ENV TZ=Asia/Shanghai
#如果直接docker build命令打包镜像(非maven插件的形式),则需要加上这段变量
#ENV JAR_FILE=target/blog-dbpool-main-0.0.1-SNAPSHOT.jar
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
VOLUME /tmp
#pom.xml中dockerfile插件定义的参数
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

Соберите Java-проект

Создайте проект Springboot с Dockerfile, настройте подключаемый модуль Docker в pom, создайте образ и отправьте образ, а затем запустите контейнер.

  1. Подготовка проекта:

    Адрес готового проекта

  2. Настройте плагин dockerfile-maven-plugin.Официально рекомендуется использовать плагин dockerfile-maven-plugin, но не рекомендуется использовать плагин docker-maven-plugin:

    Обратитесь к этой статье:Spotify официально рекомендует плагин Maven для создания образов Docker

    Локальная настройка maven в папке .m2 должна иметьservers, иначе конфигурация не вступит в силу

    <servers>
      <server>
        <id>docker.io</id>
        <username>yclxiao</username>
        <password>xxxxxx</password>
      </server>
    </servers>
    
  3. Соберите образ и запушите репозиторий:

    • Непосредственно в каталоге dockerfile выполните команду docker:

      docker build -t yclxiao/blog-dbpool-main:0.0.1-SNAPSHOT .  
      docker push yclxiao/blog-dbpool-main:0.0.1-SNAPSHOT
      
    • Использование плагина maven:

      mvn clean package dockerfile:build
      mvn clean package dockerfile:push
      
  4. Выполните docker-образы, вы можете увидеть этот образ на локальном складе.

    Проверьте репозиторий dockerHub https://hub.docker.com/, вы можете увидеть это изображение

  5. Создайте контейнер запуска:

    docker run -p 8080:8080 yclxiao/blog-dbpool-main:0.0.1-SNAPSHOT [-d]

  6. После того, как локальный докер запустит mysql, нажмите OK:http://localhost:8080/swagger-ui.html

Развертывание с помощью Docker-Compose

Когда контейнеров становится больше, необходим инструмент для управления контейнерами, поэтому по мере необходимости появляется docker-compose. кластеры контейнеров., вы можете использовать файл yml для настройки всех сервисов, которые нужны вашему приложению. Затем с помощью команды создайте и запустите все службы из файла конфигурации yml.

Две важные концепции:

Служба: Контейнер приложения может включать в себя несколько экземпляров контейнера, на которых работает один и тот же образ.

Проект (проект): законченная бизнес-единица, состоящая из набора связанных контейнеров приложений.docker-compose.ymlопределяется в файле.

  • В том же каталоге Dockerfile напишите docker-compose.yml, например:
version: '3.7'

#  定义服务
services:
  # 指定服务名称,例如spring-boot服务
  app-server:
    build:
      context: . # 配置需要构建Dockerfile的路径 相对于docker-compose.yml
      dockerfile: Dockerfile
    # 指定服务运行的端口
    ports:
      - "8080:8080" # 将本机8080端口映射到容器8080端口
    restart: always
    # 需要依赖的服务 率先构建
    depends_on:
      - db
      - redis
      #environment: # 设置环境变量
      #SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/airTicket?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
      #SPRING_DATASOURCE_USERNAME: root
      #SPRING_DATASOURCE_PASSWORD: 123456
      #SPRING_REDIS.HOST: redis
  db:
    # 指定服务使用的镜像
    image: mysql:5.7
    # 指定容器名称
    container_name: mysql5.7
    ports:
      - "3306:3306"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpwd
    volumes:
      - /Users/yclxiao/Program/volume/mysql/conf:/etc/mysql/conf.d
      - /Users/yclxiao/Program/volume/mysql/logs:/logs
      - /Users/yclxiao/Program/volume/mysql/data:/var/lib/mysql
  redis:
    image: redis:5.0.8
    # 指定容器名称
    container_name: redis5.0.8
    volumes:
      - /Users/yclxiao/Program/volume/redis/conf/redis.conf:/redis.conf
      - /Users/yclxiao/Program/volume/redis/data:/data
    command: ["redis-server", "--protected-mode", "no", "--appendonly", "yes"]
    hostname:
      redis
    ports:
      - "6379:6379"

  • Затем выполните команду, контейнер, созданный локально загруженным образом, не будет загружен и создан заново:
docker-compose build   #根据docker-compose.yam构建完整镜像
docker-compose up      #直接运行所有服务
docker-compose up -d   #后台运行所有服务
docker-compose stop    #停止所有容器
docker-compose ps      #列出所有容器信息

Разница между Docker-Compose и K8S

Docker — это ядро ​​и основа технологии контейнеров. Docker Compose — это инструмент оркестрации контейнеров с одним хостом (инструмент управления контейнерами) на основе Docker. .

Оригинальная ссылка