docker-compose配置大全

689 阅读13分钟

1.docker-compose安装

# 方式1
#安装 
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.10.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose 
#设置权限
chmod +x /usr/local/bin/docker-compose

# 注意最新下载会有一些提示,并不能运行
# Executing docker instal1 script, conmit: 66474034547a96caa0a25be56051ff8b726alb28
# If you installed the current Docker package using this script and are using itoain to update Docker, woucan safely ionore this messa
# 查了最新版docker对 Rootless安全控制,禁止root去操作docker ,建议使用其他已经下载过的版本运行。

# 方式2
yum -y install epel-release 
yum -y install python-pip
# 升级pip源
cd ~;mkdir .pip;touch .pip/pip.conf
cat >> ./.pip/pip.conf <<'EOF'
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
EOF

#升级最新版
python -m pip install --upgrade pip==20.3.4
# 安装docker-compose
pip install docker-compose==1.26.2

2.docker-compose命令

# 1.必须进入执行.yml 的文件夹
cd /usr/local/src/
# 2.yml 的文件命名必须是docker-compose.yml
mv my.yml docker-compose.yml
# 3.启动一个docker-compose 并且后台运行
docker-compose -f docker-compose.yml up -d
# 查看配置信息
docker-compose config
# 查看所有容器
docker-compose ps
# 查看容器 对应的id
docker-compose ps -q
# 停止所有服务
docker-compose stop
# 停止并删除所有服务 比较彻底
docker-compose down

# 查看日志
docker-compose logs
# 查看进程
docker-compose top
# 查看所有镜像
docker-compose images
# 重启服务
docker-compose restart

3.docker-compose 大全

github地址 github.com/mjsong07/do… image.png

1.说明

  1. data 服务做容器的数据映射,如mysql,mongodb的映射
  2. dist 用于部署前端的网页资源,如html,php等
  3. logs 存放各个容器对应的日志信息
  4. .env配置 关键的数据库账户和参数设置
  5. 不同的yml 对应不同的容器

2.使用

# 创建文件夹
mkdir docker-compose-project
# 创建环境配置, 复制下面的配置
touch .env
vi .env
# 创建需要启动的docker-compose文件, 复制下面对应需要的内容
touch docker-compose-nginx.yml
vi docker-compose-nginx.yml

# 根据不同的配置 启动对应服务

# 启动 nginx 
docker-compose -f docker-compose-nginx.yml  up
# 启动 nginx-node-mongo
docker-compose -f docker-compose-nginx-node-mongo.yml  up
# 启动 nginx-php-mysql
docker-compose -f docker-compose-nginx-php-mysql.yml  up

# 启动docker 图形管理
docker-compose -f docker-compose-portainer.yml  up -d
# 启动私有仓库
docker-compose -f docker-compose-registry.yml  up -d

3.环境变量.env

.env

###########################################################
###################### General Setup ######################
###########################################################

### Docker compose files ##################################

# Select which docker-compose files to include. If using docker-sync append `:docker-compose.sync.yml` at the end
COMPOSE_FILE=docker-compose.yml

# Change the separator from : to ; on Windows
COMPOSE_PATH_SEPARATOR=:

# 私有仓库 地址
COMPOSE_DOCKER_REGISTRY_URL=xxx.xxx.xxx.xxx:5000

# Define the prefix of container names. This is useful if you have multiple projects that use laradock to have separate containers per project.
COMPOSE_PROJECT_NAME=ylzs

### Paths #################################################
# Point to the path of your applications code on your host
APP_DIST_PATH_HOST=./dist

# Point to where the `APP_DIST_PATH_HOST` should be in the container
APP_DIST_PATH_CONTAINER=/var/www

# Choose storage path on your machine. For all storage systems
DATA_PATH_HOST=./data

### Drivers ################################################

# All volumes driver
VOLUMES_DRIVER=local

# All Networks driver
NETWORKS_DRIVER=bridge

### PHP Version ###########################################

# Select a PHP version of the Workspace and PHP-FPM containers (Does not apply to HHVM).
# Accepted values: 5.6 , 7.4 
PHP_VERSION=7.4

### Docker Host IP ########################################

# Enter your Docker Host IP (will be appended to /etc/hosts).   
DOCKER_HOST_IP=

### database  #################################################
# mysql ##########################
# MYSQL_PORT=2010 # 2010 < - 3306 #未使用
# MYSQL_ROOT_USERNAME=root #默认管理员账号 是 root,#未使用
MYSQL_ROOT_PASSWORD=123456
MYSQL_DATABASE=test
MYSQL_USER=admin
MYSQL_PASSWORD=123456

# MYSQL_ROOT_PASSWORD=123456
# MYSQL_DATABASE=test
# MYSQL_USER=root
# MYSQL_PASSWORD=123456

# mongo ##########################
# MONGO_PORT=2020 # 2020 < - 27017  #未使用
MONGO_INITDB_ROOT_USERNAME=admin
MONGO_INITDB_ROOT_PASSWORD=123456
# mongo-express
MONGO_EXPRESS_CONFIG_BASICAUTH_USERNAME=admin
MONGO_EXPRESS_CONFIG_BASICAUTH_PASSWORD=123456

# redis ##########################
# REDIS_PORT=2030 # 2031 < - 6379 #未使用
REDIS_USER=admin
REDIS_PASSWORD=123456

4.启动配置

nginx

docker-compose-nginx.yml

version: '4'
networks:
  front: {}
  backend: {}
# project-name: ylzs
services:
# nginx ################################################
  nginx:
    image: nginx:alpine
    container_name: nginx
    volumes: # 前端静态资源
      - ./dist/html:/usr/share/nginx/html
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/ssl/:/etc/nginx/ssl # 证书
      - ./nginx/common/:/etc/nginx/common # 共用配置
      - ./logs/nginx:/var/log/nginx 
    ports:
      - "8081:8080"
      - "8082:8082"
      - "8083:8083"
      - "8086:8086"
      - "48081:48081"
    privileged: true
    restart: always
    command: nginx -g 'daemon off;'

nginx-php-mysql

docker-compose-nginx-php-mysql.yml

version: '4'
services:
# nginx ################################################
  nginx:
    image: nginx:alpine
    container_name: nginx
    volumes: # 前端静态资源
      - ./dist/html:/usr/share/nginx/html
      - ./dist/php:/var/www #这里是映射php的文件夹
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/ssl/:/etc/nginx/ssl # 证书
      - ./nginx/common/:/etc/nginx/common # 共用配置
      - ./logs/nginx:/var/log/nginx 
    ports:
      - "8081:8080"
      - "8082:8082"
      - "8083:8083"
      - "8086:8086"
      - "48081:48081"
    privileged: true
    restart: always
    command: nginx -g 'daemon off;'
    links:
      - php

# php ################################################
  php: # 如果要使用不同的php版本 请修改 5.6 -> 7.4 dockerfile和 volumes 都要修改
    image: laradock/php-fpm:latest-5.6
    container_name: php
    volumes: # 前端静态资源
      - ./dist/php:/var/www
      # - ./php/php5.6.ini:/usr/local/etc/php/php.ini
      # - ./php/php-fpm.d5.6:/usr/local/etc/php-fpm.d
      # - ./logs/php-fpm:/var/log/php-fpm
    ports:
      - "9000:9000"
    privileged: true

# mysql & phpmyadmin 2010 ################################################
  mysql:
    image: mysql:5.7
    container_name: mysql
    ports:
      - "2010:3306"
    volumes:
      - ./mysql/conf.d:/etc/mysql/conf.d # 启动读取的配置
      - ./data/mysql:/var/lib/mysql #mysql数据库数据保存地方
      - ./logs/mysql:/var/log/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    restart: always
    command: "--character-set-server=utf8 --default-authentication-plugin=mysql_native_password"
    privileged: true
  phpmyadmin:
    image: phpmyadmin:latest
    container_name: phpmyadmin
    ports:
      - "2011:80"
    environment:
      PMA_HOST: mysql # 登录页面 服务器输入mysql,用户名root 密码 123456
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      PMA_ARBITRARY: 1 #连接的服务器个数
    restart: unless-stopped
    depends_on:
      - mysql
  adminer:
    image: adminer
    container_name: adminer
    restart: always
    environment:
      ADMINER_DEFAULT_SERVER: mysql # 登录页面 服务器输入mysql,用户名root 密码 123456
    ports:
      - 2012:8080
 

nginx-php-mysql2 (数据库用本地)

docker-compose-nginx-php-mysql2.yml

version: "3.8"
services:
    hgdev-nginx-svc:
        build: ./dockerfile/nginx-1.19.6
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - ${CODE_PATH}:/data/www
            - ${CONFIG_PATH}/nginx/logs:/var/log/nginx
            - ${CONFIG_PATH}/nginx/conf:/etc/nginx
            - sharephp80:/run/php80
            - sharephp74:/run/php74
        networks:
            app_net:
                ipv4_address: 172.16.30.34
        container_name: "hgdev-nginx"
    hgdev-php74-fpm-svc:
        build: ./dockerfile/php74-fpm
        expose:
            - "9000"
        volumes:
            - ${CODE_PATH}:/data/www
            - sharephp74:/run/php74
            - ./configs/php74/php/php.ini:/usr/local/etc/php/php.ini
        networks:
            app_net:
               ipv4_address: 172.16.30.36
        container_name: "hgdev-php74-fpm"

    hgdev-php80-fpm-svc:
      build: ./dockerfile/php80-fpm
      expose:
        - "9000"
      volumes:
        - ${CODE_PATH}:/data/www
        - sharephp80:/run/php80
      networks:
        app_net:
          ipv4_address: 172.16.30.35
      container_name: "hgdev-php80-fpm"
networks:
  app_net:
    driver: bridge
    ipam:
        config:
            - subnet: 172.16.30.0/16
volumes:
  sharephp80:
  sharephp74:
注意上面的 nginx和php 是通过设定volumes:sharephp80 和 sharephp74 进行通信,如果sharephp74:/run/php74  改用 本地地址可能会有读写问题。

.env

# 项目代码在你电脑的代码存放位置工作空间
CODE_PATH=/Users/jason.yang/Desktop/myworkspace

#配置文件存放的目录,就是当前docker-compose文件所在的目录
CONFIG_PATH=/Users/jason.yang/Desktop/dockerfolder
dockerfile文件夹

dockerfile/nginx-1.19.6/Dockerfile

FROM nginx:1.19.6

LABEL maintainer="dev@hg.com"

RUN apt-get update \
    && apt-get install -y iputils-ping \
    && apt-get install -y vim \
    && apt-get install -y procps \
    && apt-get install -y cron \
    && mkdir -p /run/php80 \
    && echo "" >>/run/php80/php80-fpm.sock \
    && chmod 777 /run/php80/php80-fpm.sock

EXPOSE 80
EXPOSE 443

#CMD ["nginx", "-v"]

dockerfile/php74-fpm/Dockerfile

FROM php:7.4.19-fpm
LABEL maintainer="dev@hg.com"

RUN apt-get update \
    && apt-get install -y iputils-ping \
    && apt-get install -y vim \
    && apt-get install -y procps \
    && apt-get install -y cron \
    && apt-get install -y libpng-dev libfreetype6-dev libjpeg62-turbo-dev \
    && apt-get install -y libzip-dev zip \
    && apt-get install -y git \
    && apt-get install -y libcurl4-openssl-dev pkg-config libssl-dev libmemcached-dev libxml2-dev \
    && apt-get install -y supervisor \
    && apt-get install -y strace \
    && docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd \
    && docker-php-ext-install pdo pdo_mysql \
    && docker-php-ext-install bcmath \
    && docker-php-ext-install zip \
	&& docker-php-ext-install gettext \
	&& docker-php-ext-install pcntl \
	&& docker-php-ext-install soap \
	&& docker-php-ext-install mysqli \
	&& docker-php-ext-install calendar \
	&& docker-php-ext-install dom \
	&& docker-php-ext-install intl \
	&& pecl install yaf-3.1.4 && docker-php-ext-enable yaf \
    && pecl channel-update pecl.php.net

RUN pecl install -o -f redis \
&&  rm -rf /tmp/pear \
&&  docker-php-ext-enable redis

RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"

#install composer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
    && php composer-setup.php --install-dir=/usr/local/bin --filename=composer \
    && php -r "unlink('composer-setup.php');"

RUN git clone https://github.com/xdebug/xdebug.git \
    && cd xdebug \
    && git checkout tags/3.1.6 \
    && phpize \
    && ./configure --enable-xdebug \
    && make \
    && make install

RUN echo "xdebug.remote_enable=1\n" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
         "xdebug.coverage_enable=1\n" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
         "xdebug.idekey=\"PHPSTORM\"\n" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
         "xdebug.remote_port=9001\n" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN docker-php-ext-enable xdebug

RUN pecl install mongodb-1.16.2 \
    && echo "extension=mongodb.so\n" >> /usr/local/etc/php/conf.d/ext-mongodb.ini

RUN pecl install swoole-4.6.0 \
    && echo "extension=swoole.so\n" >> /usr/local/etc/php/conf.d/ext-swoole.ini

RUN pecl install memcached \
	&& echo "extension=memcached.so\n" >> /usr/local/etc/php/conf.d/ext-memcached.ini

ADD zz-docker.conf /opt
RUN mv /opt/zz-docker.conf /usr/local/etc/php-fpm.d

#设置环境变量
#ENV APOLLO_URL="http://conf.hg-test.com"
#ENV APOLLO_TOKEN="68e395d949d609d5ec2f6975a194aaf144903893"
#ENV APOLLO_ENV="DEV"
#ENV APOLLO_SERVER="http://10.128.0.13:8081/"
#ENV APOLLO_CONF_DIR="/opt/apollo-config"

#EXPOSE 9000

#CMD ["php", "-v"]

dockerfile/php80-fpm/Dockerfile

FROM php:8.0-fpm

LABEL maintainer="dev@hg.com"

RUN apt-get update \
    && apt-get install -y iputils-ping \
    && apt-get install -y vim \
    && apt-get install -y procps \
    && apt-get install -y cron \
    && apt-get install -y libpng-dev libfreetype6-dev libjpeg62-turbo-dev \
    && apt-get install -y libzip-dev zip \
    && apt-get install -y git \
    && apt-get install -y libcurl4-openssl-dev pkg-config libssl-dev \
    && apt-get install -y supervisor \
    && apt-get install -y strace \
    && docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd \
    && docker-php-ext-install pdo pdo_mysql \
    && docker-php-ext-install bcmath \
    && docker-php-ext-configure zip \
    && docker-php-ext-install zip \
    && pecl channel-update pecl.php.net

RUN pecl install -o -f redis \
&&  rm -rf /tmp/pear \
&&  docker-php-ext-enable redis

RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"
#install composer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
    && php composer-setup.php --install-dir=/usr/local/bin --filename=composer \
    && php -r "unlink('composer-setup.php');"
	

ADD zz-docker.conf /opt
RUN mv /opt/zz-docker.conf /usr/local/etc/php-fpm.d \
    && mkdir -p /run/php80 \
    && echo "" >>/run/php80/php80-fpm.sock \
    && chmod 777 /run/php80/php80-fpm.sock

#设置环境变量
#ENV APOLLO_URL="http://conf.hg-test.com"
#ENV APOLLO_TOKEN="68e395d949d609d5ec2f6975a194aaf144903893"
#ENV APOLLO_ENV="DEV"
#ENV APOLLO_SERVER="http://10.128.0.13:8081/"
#ENV APOLLO_CONF_DIR="/opt/apollo-config"

#EXPOSE 9000

#CMD ["php", "-v"]


dockerfile/php74-fpm/zz-docker.conf

[global]
daemonize = no

[www]
listen = /run/php74/php7-fpm.sock
listen.mode = 0666

dockerfile/php80-fpm/zz-docker.conf

[global]
daemonize = no

[www]
listen = /run/php80/php80-fpm.sock
;listen = 127.0.0.1:9000
listen.mode = 0666

configs文件夹

configs/nginx/conf/php74.conf

fastcgi_pass   unix:/run/php74/php7-fpm.sock;
fastcgi_index  index.php;
include        fastcgi.conf;
include        fastcgi_params;
fastcgi_param ENV dev;
fastcgi_param RUNTIME dev;

configs/nginx/conf/php80.conf

fastcgi_pass   unix:/run/php80/php80-fpm.sock;
# fastcgi_pass hgdev-php80-fpm:9000;
fastcgi_index  index.php;
include        fastcgi.conf;
include        fastcgi_params;
fastcgi_param ENV dev;
fastcgi_param RUNTIME dev;

注意点
  1. 容器之间可以通过 上面指定容器ip访问,也可以直接使用配置里面的 container_name 访问。
  2. 本地数据访问 可以直接使用
 'db' => [
        'driver' => 'Mysqli', 
        'host' => 'host.docker.internal',
        'dbname' => 'dbname111',
        'username' => 'root',
        'password' => 'xxxx',
        'port' => 3306,
        'charset' => 'utf8',
    ],

nginx-node-mongo

docker-compose-nginx-node-mongo.yml

version: '4'
services:
# nginx ################################################
  nginx:
    image: nginx:alpine
    container_name: nginx
    volumes: # 前端静态资源
      - ./dist/html:/usr/share/nginx/html
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/ssl/:/etc/nginx/ssl # 证书
      - ./nginx/common/:/etc/nginx/common # 共用配置
      - ./logs/nginx:/var/log/nginx 
    ports:
      - "8081:8080"
      - "8082:8082"
      - "8083:8083"
      - "8086:8086"
      - "48081:48081"
    privileged: true
    restart: always
    command: nginx -g 'daemon off;'
    
# node ################################################
  node:
    image: node:14-alpine
    container_name: node
    volumes: # 前端静态资源
      - ./logs/pm2:/root/.pm2/logs
    ports:
      - "3000:3000"
 

# mongo 端口2020 ################################################
  mongo:
    image: mongo:4.1.6 # 注意不能是最新版本 必须指定版本
    container_name: mongo
    ports:
      - 2020:27017
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
      MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}
    volumes:
      - ./data/mongo:/data/db
      - ./data/mongodb_backup:/data/mongodb_backup
      # - /data/mongo:/data/configdb
    privileged: true

  mongo-express:
    image: mongo-express
    container_name: mongo-express
    restart: always
    ports:
      - 2021:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: ${MONGO_INITDB_ROOT_USERNAME}
      ME_CONFIG_MONGODB_ADMINPASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}
      ME_CONFIG_MONGODB_URL: mongodb://${MONGO_INITDB_ROOT_USERNAME}:${MONGO_INITDB_ROOT_PASSWORD}@mongo:27017/
      ME_CONFIG_OPTIONS_EDITORTHEME: default
      ME_CONFIG_BASICAUTH_USERNAME: ${MONGO_EXPRESS_CONFIG_BASICAUTH_USERNAME}
      ME_CONFIG_BASICAUTH_PASSWORD: ${MONGO_EXPRESS_CONFIG_BASICAUTH_PASSWORD}
      # ME_CONFIG_MONGODB_SERVER: 127.0.0.1
    depends_on:
      - mongo
 
  # mongoclient:
  #   image: mongoclient/mongoclient
  #   container_name: mongoclient
  #   environment:
  #     - ROOT_URL=http://localhost
  #     - MONGO_URL=mongodb://${MONGO_INITDB_ROOT_USERNAME}:${MONGO_INITDB_ROOT_PASSWORD}@mongo:27017/
  #     - INSTALL_MONGO=true
  #   volumes:
  #     - ./data/mongoclient:/data/db
  #   ports:
  #     - "2022:3000"
  #   depends_on:
  #     - mongo
 

portainer docker图形管理界面

docker-compose-portainer.yml

version: '4'
services:
# docker ui界面portainer  ################################################
  portainer:
    image: lihaixin/portainer # 第一次启动会需要自己创建账号
    container_name: portainer
    restart: always
    volumes: # 前端静态资源
      - /var/run/docker.sock:/var/run/docker.sock #这里必须强制使用/var/run/docker.sock
    ports:
      - "1001:9000"

registry 私有仓库

docker-compose-registry.yml

version: '4'
services: 
##docker 仓库 端口 5000  ################################################
  registry:
    image: registry:2 
    container_name: registry
    restart: always
    volumes:
      - ./data/registry:/var/lib/registry
    ports:
      - "5000:5000"

  registry-web:
    image: hyper/docker-registry-web # 
    container_name: docker-registry-web
    restart: always
    ports:
      - "5001:8080"
    environment:
      REGISTRY_URL: http://registry:5000/v2
      REGISTRY_NAME: localhost:5000
      REGISTRY_READONLY: false # 设置为false才可以支持删除
    links:
      - registry
    depends_on:
      - registry

nginx 日志分析

docker-compose-goaccess.yml

# goaccess  ################################################
  goaccess2: # 暂时只能一次生成 不能动态生成
    image: allinurl/goaccess:latest
    container_name: goaccess2
    ports:
    - "7890:7890"
    volumes:
      - ./goaccess/data:/srv/data
      - ./logs/nginx:/srv/logs
      - ./dist/html/report:/srv/report
    privileged: true

直接docker 运行,可以实时刷

tail -f  /docker-compose-project/logs/nginx/access.log | docker run -p 7890:7890 --rm -i -e LANG=$LANG allinurl/goaccess -a -o html --log-format COMBINED --real-time-html - > /docker-compose-project/dist/html/report/index.html

操作mongodb 备份 还原


# 1.必须进入执行.yml 的文件夹
cd /docker-compose-project/

# 2.先查询当前 mongo对应的 CONTAINER_ID 容器ID 
docker ps 
#CONTAINER ID   IMAGE         xxx
#3d1ccf9bf4b7   mongo-express   xxxx 

# 3.先查询当前 mongo对应的 CONTAINER_ID 容器ID
docker exec -it 3d1ccf9bf4b7 bash

# 4.登录mnogodb
mongo -u mongoadmin -p mongoadmin

# 导入 导出约定 
宿主电脑备份地址  /docker-compose-project/data/mongodb_backup/databaseName/
容器电脑备份地址 /data/mongodb_backup/databaseName/

# 整个数据库导出
mongodump  -p 27017  -u mongoadmin -p mongoadmin --authenticationDatabase admin -h 127.0.0.1 -d databaseName -o /data/mongodb_backup
# 整个数据库导入
mongorestore  -p 27017  -u mongoadmin -p mongoadmin --authenticationDatabase admin -h 127.0.0.1 -d databaseName /data/mongodb_backup

# 单个集合导出
# 导出 一次只能导出一个集合
mongoexport -p 27017  -u mongoadmin -p mongoadmin --authenticationDatabase admin -d databaseName -c collectionName -o /data/mongodb_backup/collectionName.json
# 导入 一次只能导入一个集合
mongoimport -p 27017  -u mongoadmin -p mongoadmin --authenticationDatabase admin -d databaseName -c collectionName --file /data/mongodb_backup/mongodb_backup/collectionName.json

# 复制当前容器路径 到 宿主电脑
docker cp [CONTAINER ID]:/data/mongodb_backup  /docker-compose-project/data/mongodb_backup/

# 复制宿主电脑路径 到 容器路径里
docker cp  /docker-compose-project/data/mongodb_backup [CONTAINER ID]:/data/mongodb_backup

4.docker-compose总结

镜像更新注意

1.  可以使用重复的tag,客户端只需要每次主动执行 docker pull 192.168.0.13:5000/ylzs-nginx:7 ,运行的时候就会拿到最新的版本

2. logrotate 配置是在项目nginx文件夹的logrotate/nginx中,每次都是实时读取
3. docker-compose中的command: nginx -g 'daemon off;' 要去掉,因为镜像中已经使用命令启动

找回docker-compose.yml 启动文件路径

docker inspect 容器id

在Mounts 的 bind里面找到关键信息

/docker_workspace/sentry23

 "Mounts": [ 
            {
                "Type": "bind",
                "Source": "/docker_workspace/sentry23/sentry",
                "Destination": "/etc/sentry",
                "Mode": "rw",
                "RW": true,
                "Propagation": "rprivate"
            },

进入 /docker_workspace/sentry23 ,执行docker-compose down 关闭

docker registry 私有仓库配置 支持 https

1. 生成自己的正式与秘钥

mkdir mycert
cd mycert/
openssl genrsa -out "root-ca.key" 4096
openssl req -new -key "root-ca.key" -out "root-ca.csr" -sha256  -subj '/C=CN/ST=Shanxi/L=Datong/O=Your Company Name/CN=Your Company Name Docker Registry CA'

# 创建文件
vi root-ca.cnf
[root_ca]basicConstraints = critical,CA:TRUE,pathlen:1keyUsage = critical, nonRepudiation, cRLSign, keyCertSignsubjectKeyIdentifier=hash

openssl x509 -req  -days 3650  -in "root-ca.csr" -signkey "root-ca.key" -sha256 -out "root-ca.crt" -extfile "root-ca.cnf" -extensions  root_ca
openssl genrsa -out "docker.domain.com.key" 4096
openssl req -new -key "docker.domain.com.key" -out "site.csr" -sha256  -subj '/C=CN/ST=Shanxi/L=Datong/O=Your Company Name/CN=docker.domain.com'

# 创建文件
vi site.cnf
[server]authorityKeyIdentifier=keyid,issuerbasicConstraints = critical,CA:FALSEextendedKeyUsage=serverAuthkeyUsage = critical, digitalSignature, keyEnciphermentsubjectAltName = DNS:docker.domain.com, IP:127.0.0.1subjectKeyIdentifier=hash

openssl x509 -req -days 750 -in "site.csr" -sha256  -CA "root-ca.crt" -CAkey "root-ca.key"  -CAcreateserial  -out "docker.domain.com.cert" -extfile "site.cnf" -extensions server

# 最终生成 
root-ca.crt # 根证书
docker.domain.com.cert # 域名证书
docker.domain.com.key # 域名key

也可以使用 acme.sh生成,需要注册在线账号

docker-compose.yml

version: '2'
networks:
  front: {}
  backend: {}
# project-name: ylzs
services: 
##docker 仓库 端口 5000  ################################################
  registry:
    image: registry:2 
    container_name: registry
    restart: always
    volumes:
      - ./data/docker-registry/registry:/var/lib/registry
      - ./data/docker-registry/auth:/auth
      - ./data/docker-registry/certs:/certs
    ports:
      - "5000:5000"
    environment:
      REGISTRY_HTTP_TLS_CERTIFICATE: /certs/ts.ifashioncloud.cn.cert
      REGISTRY_HTTP_TLS_KEY: /certs/ts.ifashioncloud.cn.key
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
  registry-ui:
   image: konradkleine/docker-registry-frontend:v2
   restart: always
   environment:
     - ENV_DOCKER_REGISTRY_HOST=registry
     - ENV_DOCKER_REGISTRY_PORT=5000
     - ENV_DOCKER_REGISTRY_USE_SSL=1
     - ENV_MODE_BROWSE_ONLY=false
   ports:
     - "5001:80"
  # registry-web:
  #   image: hyper/docker-registry-web # 
  #   container_name: docker-registry-web
  #   restart: always
  #   ports:
  #     - "5001:8080"
  #   environment:
  #     REGISTRY_URL: http://registry:5000/v2
  #     REGISTRY_NAME: localhost:5000
  #     # REGISTRY_READONLY: false # 低版本不生效
  # REGISTRY_TRUST_ANY_SSL: true # 支持ssl信任
  #   links:
  #     - registry
  #   depends_on:
  #     - registry

2. 创建docker账户与测试

# 先进入工作目录
mkdir -p ./data/docker-registry/
cd  ./data/docker-registry && mkdir auth  certs  registry

# 创建秘钥 用户名docker 密码123456
echo "user:docker passwd:123456" >htpasswd
# 注意这里只能使用2.7.0 的版本生成秘钥  2.0不行
docker run --entrypoint htpasswd registry:2.7.0 -Bbn docker 123456 > ./data/docker-registry/auth/htpasswd

# 把证书  复制到 
 

# 上传ca到使用的服务上 
  /etc/docker/certs.d/
└── docker.domain.com:5000
   ├── docker.domain.com.cert # 域名证书
   ├── docker.domain.com.key # 域名key
   └── ca.crt # 根证书
 
# 修改host域名解析
vi /etc/hosts
# 加入
127.0.0.1 docker.domain.com # 其他客户端则要改成 实际的ip

# 启动
docker-compose up -d

# 测试登录 
docker login docker.domain.com:5000
# 输入用户名docker 密码123456


# 测试推送
docker tag nginx docker.domain.com:5000/nginx
docker push docker.domain.com:5000/nginx # 

# 测试拉取
docker pull docker.domain.com:5000/nginx # 


常见错误

下面的配置修改后都记得重启docker
 systemctl restart docker.service


1. 登录失败x509: certificate relies on legacy Common Name field
## 请检查是否添加私服信任,并重启docker。
vi /etc/docker/daemon.json
{
  "registry-mirrors": [ "https://docker.domain.com:5000"]
}


2. http: server gave HTTP response to HTTPS client
{
    "insecure-registries": ["https://docker.domain.com:5000"]
}


3. Error response from daemon: Missing client certificate
后缀命名问题 
    1. crt 改成 cert,crt用的是 ca根证书
    2. 注意文件夹是有端口号 docker.domain.com:5000

  /etc/docker/certs.d/
└── docker.domain.com:5000
   ├── docker.domain.com.cert # 域名证书
   ├── docker.domain.com.key # 域名key
   └── ca.crt # 根证书
 
4.  x509: certificate signed by unknown authority
    1. 有可能是 内网服务器无法访问外网,所以检查不到 根CA,需要想办法安装ca软件+上传ca
    2. 或者添加信任
    {
        "insecure-registries": ["https://docker.domain.com:5000"]
    }
    3. 当前docker用户未登陆,执行docker login www.xxx.cn:5000 # 这里不需要输入http或https

5. Error response from daemon: Get "www.xxx.cn:5000/v2/" net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x15\x03\x01\x00\x02\x02"
    1. 这是 docker执行pull 拉取镜像失败 ,主要是由于用户未登录或已经退出,重新登录即可。
    2. 在用户登录时,如果输入输入错误的账号或密码也会有这个提示,重新输入正确的账号即可,如果确实忘记,可以复制有成功登录过的电脑,把 /root/.docker/config.json 复制到有问题的相同路径下。 # 注意:没有该路径和文件则需要自己先创建