• 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
  • 相关阅读:
    TP3.2写上下篇
    TP3.2写分页
    TP3.2写提交的验证码验证
    thinkphp5.0学习笔记(四)数据库的操作
    thinkphp5.0学习笔记(三)获取信息,变量,绑定参数
    Windows下用Composer引入官方GitHub扩展包
    glog的安装使用
    实现strStr()函数
    何时将析构函数声明为私有?
    memcpy内存重叠
  • 原文地址:https://www.cnblogs.com/zd1994/p/9301698.html
Copyright © 2020-2023  润新知