zoukankan      html  css  js  c++  java
  • Docker备忘录

    centOS安装教程:https://docs.docker-cn.com/engine/installation/linux/docker-ce/centos/

    一、常用命令

    docker build -t friendlyname .# 使用此目录的 Dockerfile 创建镜像
    docker run -p 4000:80 friendlyname # 运行端口 4000 到 90 的“友好名称”映射
    docker run -d -p 4000:80 friendlyname # 内容相同,但在分离模式下
    docker ps # 查看所有正在运行的容器的列表
    docker stop <hash> # 平稳地停止指定的容器
    docker ps -a # 查看所有容器的列表,甚至包含未运行的容器
    docker kill <hash> # 强制关闭指定的容器
    docker rm <hash> # 从此机器中删除指定的容器
    docker rm $(docker ps -a -q) # 从此机器中删除所有容器
    docker images -a # 显示此机器上的所有镜像
    docker rmi <imagename> # 从此机器中删除指定的镜像
    docker rmi $(docker images -q) # 从此机器中删除所有镜像
    docker login # 使用您的 Docker 凭证登录此 CLI 会话
    docker tag <image> username/repository:tag # 标记 <image> 以上传到镜像库
    docker push username/repository:tag # 将已标记的镜像上传到镜像库
    docker run username/repository:tag # 运行镜像库中的镜像

     $ sudo systemctl start docker //启动docker

     $ docker run -d -p 27017:27017 --name some-mongo mongo   //启动容器

     $shell> docker exec -it mysql1 bash //进入mysql1容器

     $bash-4.2# mysql -uroot -p   //在mysql1容器执行。进入mysql

     $docker restart mysql01  //重启容器

     service docker start  //启动容器

    docker build --rm //build时删除中间镜像

    1,设置docker镜像地址

     vim /etc/docker/daemon.json


    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] 
    }

    二、mysql容器

    1,使用mysql的一些问题

    创建的mysql的root用户只能通过本地登录。这种问题可以直接把root的host改为0.0.0.0允许任何ip登录。root是超级用户,这样做不安全,一般建议另创建一个用户:

    mysql> CREATE USER 'test'@'localhost' IDENTIFIED BY 'pwd123456';
    mysql> GRANT ALL PRIVILEGES ON *.* TO 'test'@'localhost' WITH GRANT OPTION;
    mysql> CREATE USER 'test'@'%' IDENTIFIED BY 'pwd123456';
    mysql> GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' WITH GRANT OPTION;
    ALTER USER 'test'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd123456';
    ALTER USER 'test'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pwd123456';
    SELECT plugin FROM mysql.user WHERE User = 'test';
    client does not support authentication protocol by server;consider upgrading MYSQL client解决方法

    2,允许mysql容器时设置用户名和密码和字符集

    docker run -d -p 3307:3306 -e MYSQL_USER="hunter" -e MYSQL_PASSWORD="pwd123456" -e MYSQL_ROOT_PASSWORD="pwd213456" --name mysql2 mysql/mysql-server --character-set-server=utf8 --collation-server=utf8_general_ci

    show variables like "%char%";   //查看字符集

    三、资料卷挂载

    1,使用Volume进行mysql资料卷挂载

    ①在主机上新建 /docker/mysql/config/my.cnf 文件和 /docker/mysql/data 目录

    在my.conf文件中指定用户(必须指定,不然会报错)

    [mysqld]
    user=mysql
      [mysqld] 
      character-set-server=utf8
      [client]
      default-character-set=utf8
      [mysql]
      default-character-set=utf8
    设置编码格式

    ②启动mysql

     [root@localhost config]# docker run -d -p 3308:3306 --name mysql3 -v=/docker/mysql/config/my.cnf:/etc/my.cnf -v=/docker/mysql/data:/var/lib/mysql mysql/mysql-server 

    将容器中的 /etc/my.cnf 映射到主机的 /docker/mysql/config/my.cnf:/etc/my.cnf 文件。

    将容器的 /var/lib/mysql 目录映射到主机的 /docker/mysql/data 目录

    四、镜像打包

    FROM microsoft/dotnet:sdk AS build-env
    WORKDIR /app
    
    # Copy csproj and restore as distinct layers
    COPY *.csproj ./
    RUN dotnet restore
    
    # Copy everything else and build
    COPY . ./
    RUN dotnet publish -c Release -o out
    
    # Build runtime image
    FROM microsoft/dotnet:aspnetcore-runtime
    WORKDIR /app
    COPY --from=build-env /app/out .
    ENTRYPOINT ["dotnet", "demo.dll"]

    案例下载:https://pan.baidu.com/s/1DLod4xexm7-_UjJ6A8N-Ug

    五、容器互联

    docker inspect mysql1 //查看容器网络

    docker inspect network test1_default //查看网络

    docker network create -d bridge my-net  // 新建my-net网络

    docker network ls  //查看网路

    docker network connect my-net mysql1  //将运行的容器加入到my-net网络

    docker run -d -p 7001:80 --net my-net --name aspcore1 aspcore:1.1  //启动容器时加入网络

    yum install -y iputils  //yum安装ping 

    六、Docker-Compose

    1,基本命令

       ①安装

    $ sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    $ sudo chmod +x /usr/local/bin/docker-compose

      docker-compose up //该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作

      docker-compose up -d //后台启动

      docker-compose down //此命令将会停止 up 命令所启动的容器,并移除网络

    2,启动asp.net core+mysql

    version: "3"
    services:
      
      db:
        image: mysql/mysql-server
        container_name: db
        #执行mysql命令指定编码格式
        command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
        ports: 
          - "3306:3306"
        #指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped。
        restart: always
        environment: 
          MYSQL_USER: hunter
          MYSQL_PASSWORD: pwd123456
          MYSQL_ROOT_PASSWORD: pwd123456
        volumes:
          # 主机/docker/mysql/init目录映射到mysql容器/docker-entrypoint-initdb.d目录
          # 启动时会允许此目录下的sql脚本
          - /docker/mysql2/init:/docker-entrypoint-initdb.d
          - /docker/mysql2/config/my.cnf:/etc/my.cnf
          - /docker/mysql2/data:/var/lib/mysql
          
      web1:
        depends_on:
          - db
        build: .
        container_name: aspcore1
        ports: 
          - "8002:80"

    打包asp.net core镜像

    FROM microsoft/dotnet:sdk AS build-env
    WORKDIR /app
    
    # Copy csproj and restore as distinct layers
    COPY *.csproj ./
    RUN dotnet restore
    
    # Copy everything else and build
    COPY . ./
    RUN dotnet publish -c Release -o out
    
    # Build runtime image
    FROM microsoft/dotnet:aspnetcore-runtime
    WORKDIR /app
    COPY --from=build-env /app/out .
    ENTRYPOINT ["dotnet", "demo.dll"]
    Dockerfile

    mysql初始化执行的脚本,设置权限

    GRANT ALL PRIVILEGES ON *.* TO 'hunter'@'%' WITH GRANT OPTION;
    ALTER USER 'hunter'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd123456';
    init.sql

    使用重试方式,保证在db初始完成之后执行种子命令

    using System;
    using Microsoft.Extensions.DependencyInjection;
    using System.Linq;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.Extensions.Logging;
    using System.Threading;
    
    namespace demo.Data
    {
        public class MyDbContextSeed
        {
            
            private ILogger<MyDbContextSeed> _logger;
            public MyDbContextSeed(ILogger<MyDbContextSeed> logger)
            {
                _logger=logger;
            }
    
            public void Seed(IServiceProvider service,int retry)
            {
                _logger.LogDebug("InSeed");
                try{
                    using(var services=service.CreateScope()) 
                    {
                        var provider= services.ServiceProvider;
                        var logFactory= services.ServiceProvider.GetService<ILoggerFactory>();
                        var context= provider.GetRequiredService<MyDbContext>();
                        _logger.LogDebug("Migrate_Start");
                        context.Database.Migrate();
                        _logger.LogDebug("Migrate_End");
                        if(!context.Users.Any())
                        {
                            _logger.LogDebug("UserAdd_Start");
                            context.Users.Add(new User(){Password="123456",UserName="hunter"});
                            context.SaveChanges();
                            _logger.LogDebug("UserAdd_End");
                        }
                    } 
                }
                catch(Exception ex){
                    _logger.LogError("失败重试:"+retry);
                    Thread.Sleep(2000);
                    Seed(service,++retry);
                }
                   
            }
        }
    }
    MyDbContextSeed.cs

    连接字符串server使用的容器名称

    {
      "Logging": {
        "LogLevel": {
          "Default": "Warning"
        }
      },
      "AllowedHosts": "*",
      "ConnectionStrings": {
        "MysqlConnection": "server=db;port=3306;database=demo1;userid=hunter;password=pwd123456;"
      }
    }
    appsettings.json

    案例下载:https://pan.baidu.com/s/1lAy6pM9uipQnbvGG6A2TYQ

    七、Gitlab

    参考教程:https://docs.gitlab.com/omnibus/docker/#after-starting-a-container

    本例使用 GitLab CE  镜像,如果使用 GitLab EE 将镜像名称替换为 gitlab/gitlab-ee:latest 

    gitlab可以使用以下三种方式运行

    • 使用docker引擎运行
    • 将gitlab安装到集群中
    • 使用docker-compose安装

    运行镜像

    sudo docker run --detach 
        --hostname gitlab.example.com 
        --publish 443:443 --publish 80:80 --publish 22:22 
        --name gitlab 
        --restart always 
        --volume /srv/gitlab/config:/etc/gitlab 
        --volume /srv/gitlab/logs:/var/log/gitlab 
        --volume /srv/gitlab/data:/var/opt/gitlab 
        gitlab/gitlab-ce:latest

    这将下载并启动GitLab CE容器并发布访问SSH,HTTP和HTTPS所需的端口。

    所有GitLab数据都将存储为/srv/gitlab/的子目录。

    restart always:系统重启后,容器将自动重启。

    您现在可以按照启动容器后的说明登录Web界面。

    数据存储在哪里?

    GitLab容器使用主机安装的卷来存储持久数据:

    Local locationContainer locationUsage
    /srv/gitlab/data /var/opt/gitlab 用于存储应用数据
    /srv/gitlab/logs /var/log/gitlab 用于存储日志
    /srv/gitlab/config /etc/gitlab 用于存储GitLab配置文件

    配置GitLab

    此容器使用官方的Omnibus GitLab软件包,因此所有配置都在唯一的配置文件 /etc/gitlab/gitlab.rb 中完成。

    打开/etc/gitlab/gitlab.rb后,确保将 external_url 设置为指向有效的URL。

    要从GitLab接收电子邮件,您必须配置SMTP设置,因为GitLab Docker映像没有安装SMTP服务器。

    完成所需的所有更改后,需要重新启动容器才能重新配置GitLab: sudo docker restart gitlab 

    预配置Docker容器

    您可以通过将环境变量GITLAB_OMNIBUS_CONFIG添加到docker run命令来预配置GitLab Docker映像。注意:GITLAB_OMNIBUS_CONFIG中包含的设置不会写入gitlab.rb配置文件

    这是一个设置外部URL并在启动容器时启用LFS的示例:

    sudo docker run --detach 
        --hostname gitlab.example.com 
        --env GITLAB_OMNIBUS_CONFIG="external_url 'http://my.domain.com/'; gitlab_rails['lfs_enabled'] = true;" 
        --publish 443:443 --publish 80:80 --publish 22:22 
        --name gitlab 
        --restart always 
        --volume /srv/gitlab/config:/etc/gitlab 
        --volume /srv/gitlab/logs:/var/log/gitlab 
        --volume /srv/gitlab/data:/var/opt/gitlab 
        gitlab/gitlab-ce:latest

    请注意,每次执行docker run命令时,都需要提供GITLAB_OMNIBUS_CONFIG选项。 后续运行之间不保留GITLAB_OMNIBUS_CONFIG的内容。

    由于22端口被占用我使用的是23。网站端口改为8099

    启动容器后

    初始化过程可能需要很长时间。 您可以使用命令 sudo docker logs -f gitlab 跟踪此过程
    您第一次访问GitLab时,系统会要求您设置管理员密码。 更改后,您可以使用用户名root和您设置的密码登录

    将GitLab升级到更新版本

    要将GitLab升级到新版本,您必须:

    1、停止正在运行的容器: sudo docker stop gitlab 

    2、删除现有容器: sudo docker rm gitlab 

    3、拉新镜像: sudo docker pull gitlab/gitlab-ce:latest 

    4、使用先前指定的选项再次创建容器:

    sudo docker run --detach 
    --hostname gitlab.example.com 
    --publish 443:443 --publish 80:80 --publish 22:22 
    --name gitlab 
    --restart always 
    --volume /srv/gitlab/config:/etc/gitlab 
    --volume /srv/gitlab/logs:/var/log/gitlab 
    --volume /srv/gitlab/data:/var/opt/gitlab 
    gitlab/gitlab-ce:latest

    在第一次运行时,GitLab将重新配置和更新自己。

    在公共IP地址上运行GitLab CE

    您可以通过修改--publish标志使Docker使用您的IP地址并将所有流量转发到GitLab CE容器。
    在IP 1.1.1.1上公开GitLab CE:

    sudo docker run --detach 
        --hostname gitlab.example.com 
        --publish 1.1.1.1:443:443 
        --publish 1.1.1.1:80:80 
        --publish 1.1.1.1:22:22 
        --name gitlab 
        --restart always 
        --volume /srv/gitlab/config:/etc/gitlab 
        --volume /srv/gitlab/logs:/var/log/gitlab 
        --volume /srv/gitlab/data:/var/opt/gitlab 
        gitlab/gitlab-ce:latest

    然后,您可以访问http://1.1.1.1/和https://1.1.1.1/访问您的GitLab实例

    在不同的端口上公开GitLab

    GitLab默认会占用容器内的以下端口:

    • 80 (HTTP)
    • 443 (if you configure HTTPS)
    • 8080 (Unicorn使用的)
    • 22 (SSH守护程序使用的)

    如果要为容器使用与80(HTTP)或443(HTTPS)不同的端口,则需要在docker run命令中添加单独的--publish指令。

    例如,要在端口8929上公开Web界面,在端口2289上公开SSH服务,请使用以下docker run命令:

    sudo docker run --detach 
        --hostname gitlab.example.com 
        --publish 8929:80 --publish 2289:22 
        --name gitlab 
        --restart always 
        --volume /srv/gitlab/config:/etc/gitlab 
        --volume /srv/gitlab/logs:/var/log/gitlab 
        --volume /srv/gitlab/data:/var/opt/gitlab 
        gitlab/gitlab-ce:latest

    然后,您需要适当地配置gitlab.rb:

    1,配置  external_url :

    # For HTTP
    external_url "http://gitlab.example.com:8929"
    
    or
    
    # For HTTPS (notice the https)
    external_url "https://gitlab.example.com:8929"

    2,配置 gitlab_shell_ssh_port :

    gitlab_rails['gitlab_shell_ssh_port'] = 2289

    按照上面的示例,您将能够通过<hostIP>:8929下的Web浏览器访问GitLab,并使用端口2289下的SSH进行推送。

    可以在docker-compose部分中找到使用不同端口的docker-compose.yml示例

    诊断潜在问题

    读取容器日志: sudo docker logs gitlab 

    输入运行容器: sudo docker exec -it gitlab /bin/bash 

    在容器内,您可以像管理Omnibus安装一样管理GitLab容器

    使用docker-compose安装GitLab

    使用Docker撰写,您可以轻松配置,安装和升级基于Docker的GitLab安装。

    web:
      image: 'gitlab/gitlab-ce:latest'
      restart: always
      hostname: 'gitlab.example.com'
      environment:
        GITLAB_OMNIBUS_CONFIG: |
          external_url 'https://gitlab.example.com'
          # Add any other gitlab.rb configuration here, each on its own line
      ports:
        - '80:80'
        - '443:443'
        - '22:22'
      volumes:
        - '/srv/gitlab/config:/etc/gitlab'
        - '/srv/gitlab/logs:/var/log/gitlab'
        - '/srv/gitlab/data:/var/opt/gitlab'

    确保您与docker-compose.yml在同一目录中并运行docker-compose up -d以启动GitLab

    下面是另一个docker-compose.yml示例,其中GitLab在自定义HTTP和SSH端口上运行。 注意GITLAB_OMNIBUS_CONFIG变量如何与ports部分匹配:

    web:
      image: 'gitlab/gitlab-ce:latest'
      restart: always
      hostname: 'gitlab.example.com'
      environment:
        GITLAB_OMNIBUS_CONFIG: |
          external_url 'http://gitlab.example.com:9090'
          gitlab_rails['gitlab_shell_ssh_port'] = 2224
      ports:
        - '9090:9090'
        - '2224:22'
      volumes:
        - '/srv/gitlab/config:/etc/gitlab'
        - '/srv/gitlab/logs:/var/log/gitlab'
        - '/srv/gitlab/data:/var/opt/gitlab'

    这与使用--publish 9090:9090 --publish 2224:22相同

    使用Docker compose更新GitLab

    如果你使用docker-compose安装了GitLab,你所要做的就是运行docker-compose pull和docker-compose up -d来下载新版本并升级你的GitLab实例

    将GitLab安装到群集中

    GitLab Docker镜像也可以部署到各种容器调度平台。

    故障排除

    1,500内部错误

    更新Docker镜像时,您可能会遇到一个问题,其中所有路径都显示臭名昭着的500页。 如果发生这种情况,请尝试运行sudo docker restart gitlab重启容器并纠正问题

    2,许可问题

    从旧的GitLab Docker映像更新时,您可能会遇到权限问题。 这是因为先前镜像中的用户未正确保留。 有修复所有文件权限的脚本。
    要修复容器,只需执行update-permissions并在之后重新启动容器:

    sudo docker exec gitlab update-permissions
    sudo docker restart gitlab

    3,Windows/Mac: Error executing action run on resource ruby_block[directory resource: /data/GitLab]

    在Windows或Mac上使用Docker Toolbox和VirtualBox并使用Docker卷时会发生此错误。/c/Users卷作为VirtualBox共享文件夹安装,不支持所有POSIX文件系统功能。 如果没有重新挂载,则无法更改目录所有权和权限,并且GitLab失败。

    我们的建议是切换到您的平台使用本机Docker安装,而不是使用Docker Toolbox。

    如果您无法使用本机Docker安装(Windows 10 Home Edition或Windows <10),那么另一种解决方案是为Docker Toolbox的boot2docker设置NFS挂载而不是VirtualBox共享

    4,Linux ACL问题

    如果您在docker主机上使用文件ACL,则docker1组需要对卷进行完全访问才能使GitLab正常工作。

    $ getfacl /srv/gitlab
    # file: /srv/gitlab
    # owner: XXXX
    # group: XXXX
    user::rwx
    group::rwx
    group:docker:rwx
    mask::rwx
    default:user::rwx
    default:group::rwx
    default:group:docker:rwx
    default:mask::rwx
    default:other::r-x

    如果这些不正确,请将它们设置为:

    $ sudo setfacl -mR default:group:docker:rwx /srv/gitlab
  • 相关阅读:
    专职DBA-MySQL体系结构与基本管理
    JSON
    MIME类型
    文件上传下载
    response常用的方法
    2020.11.27小记
    HTTP请求状态码
    1561. Maximum Number of Coins You Can Get
    1558. Minimum Numbers of Function Calls to Make Target Array
    1557. Minimum Number of Vertices to Reach All Nodes
  • 原文地址:https://www.cnblogs.com/zd1994/p/9301698.html
Copyright © 2011-2022 走看看