• Customizing docker


    Customizing docker

    The Docker systemd unit can be customized by overriding the unit that ships with the default CoreOS settings. Common use-cases for doing this are covered below.

    Enable the remote API on a new socket (Test on Centos .latest docker 1.12)

    新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%dockerconfigdaemon.json(Windows) 来配置 Daemon。

    请在该配置文件中加入(没有该文件的话,请先建一个):

    {
      "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:8400", "tcp://0.0.0.0:2375"],
    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] }

    Enable the remote API on a new socket

    Create a file called /etc/systemd/system/docker-tcp.socket to make Docker available on a TCP socket on port 2375.

    [Unit]
    Description=Docker Socket for the API
    
    [Socket]
    ListenStream=2375
    BindIPv6Only=both
    Service=docker.service
    
    [Install]
    WantedBy=sockets.target
    

    Then enable this new socket:

    systemctl enable docker-tcp.socket
    systemctl stop docker
    systemctl start docker-tcp.socket
    systemctl start docker
    

    Test that it’s working:

    docker -H tcp://127.0.0.1:2375 ps
    

    Cloud-config

    To enable the remote API on every CoreOS machine in a cluster, use cloud-config. We need to provide the new socket file and Docker’s socket activation support will automatically start using the socket:

    #cloud-config
    
    coreos:
      units:
        - name: docker-tcp.socket
          command: start
          enable: true
          content: |
            [Unit]
            Description=Docker Socket for the API
    
            [Socket]
            ListenStream=2375
            BindIPv6Only=both
            Service=docker.service
    
            [Install]
            WantedBy=sockets.target
    

    To keep access to the port local, replace the ListenStream configuration above with:

            [Socket]
            ListenStream=127.0.0.1:2375
    

    Enable the remote API with TLS authentication

    Docker TLS configuration consists of three parts: keys creation, configuring new systemd socket unit and systemd drop-in configuration.

    TLS keys creation

    Please follow the instruction to know how to create self-signed certificates and private keys. Then copy with following files into /etc/docker CoreOS’ directory and fix their permissions:

    scp ~/cfssl/{server.pem,server-key.pem,ca.pem} coreos.example.com:
    ssh core@coreos.example.com
    sudo mv {server.pem,server-key.pem,ca.pem} /etc/docker/
    sudo chown root:root /etc/docker/{server-key.pem,server.pem,ca.pem}
    sudo chmod 0600 /etc/docker/server-key.pem
    

    On your local host copy certificates into ~/.docker:

    mkdir ~/.docker
    chmod 700 ~/.docker
    cd ~/.docker
    cp -p ~/cfssl/ca.pem ca.pem
    cp -p ~/cfssl/client.pem cert.pem
    cp -p ~/cfssl/client-key.pem key.pem
    

    Enable the secure remote API on a new socket

    NOTE: For CoreOS releases older than 949.0.0 you must follow this guide.

    Create a file called /etc/systemd/system/docker-tls-tcp.socket to make Docker available on a secured TCP socket on port 2376.

    [Unit]
    Description=Docker Secured Socket for the API
    
    [Socket]
    ListenStream=2376
    BindIPv6Only=both
    Service=docker.service
    
    [Install]
    WantedBy=sockets.target
    

    Then enable this new socket:

    systemctl enable docker-tls-tcp.socket
    systemctl stop docker
    systemctl start docker-tls-tcp.socket
    

    Drop-in configuration

    Create /etc/systemd/system/docker.service.d/10-tls-verify.conf drop-in for systemd Docker service:

    [Service]
    Environment="DOCKER_OPTS=--tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server.pem --tlskey=/etc/docker/server-key.pem"
    

    Reload systemd config files and restart docker service:

    sudo systemctl daemon-reload
    sudo systemctl restart docker.service
    

    Now you can access your Docker’s API through TLS secured connection:

    docker --tlsverify -H tcp://server:2376 images
    # or
    docker --tlsverify -H tcp://server.example.com:2376 images
    

    If you’ve experienceed problems connection to remote Docker API using TLS connection, you can debug it with curl:

    curl -v --cacert ~/.docker/ca.pem --cert ~/.docker/cert.pem --key ~/.docker/key.pem https://server:2376
    

    Or on your CoreOS host:

    journalctl -f -u docker.service
    

    In addition you can export environment variables and use docker client without additional options:

    export DOCKER_HOST=tcp://server.example.com:2376 DOCKER_TLS_VERIFY=1
    docker images
    

    Cloud-config

    Cloud-config for Docker TLS authentication will look like:

    #cloud-config
    
    write_files:
        - path: /etc/docker/ca.pem
          permissions: 0644
          content: |
            -----BEGIN CERTIFICATE-----
            MIIFNDCCAx6gAwIBAgIBATALBgkqhkiG9w0BAQswLTEMMAoGA1UEBhMDVVNBMRAw
            DgYDVQQKEwdldGNkLWNhMQswCQYDVQQLEwJDQTAeFw0xNTA5MDIxMDExMDhaFw0y
            NTA5MDIxMDExMThaMC0xDDAKBgNVBAYTA1VTQTEQMA4GA1UEChMHZXRjZC1jYTEL
            ... ... ...
        - path: /etc/docker/server.pem
          permissions: 0644
          content: |
            -----BEGIN CERTIFICATE-----
            MIIFajCCA1SgAwIBAgIBBTALBgkqhkiG9w0BAQswLTEMMAoGA1UEBhMDVVNBMRAw
            DgYDVQQKEwdldGNkLWNhMQswCQYDVQQLEwJDQTAeFw0xNTA5MDIxMDM3MDFaFw0y
            NTA5MDIxMDM3MDNaMEQxDDAKBgNVBAYTA1VTQTEQMA4GA1UEChMHZXRjZC1jYTEQ
            ... ... ...
        - path: /etc/docker/server-key.pem
          permissions: 0600
          content: |
            -----BEGIN RSA PRIVATE KEY-----
            MIIJKAIBAAKCAgEA23Q4yELhNEywScrHl6+MUtbonCu59LIjpxDMAGxAHvWhWpEY
            P5vfas8KgxxNyR+U8VpIjEXvwnhwCx/CSCJc3/VtU9v011Ir0WtTrNDocb90fIr3
            YeRWq744UJpBeDHPV9opf8xFE7F74zWeTVMwtiMPKcQDzZ7XoNyJMxg1wmiMbdCj
            ... ... ...
    coreos:
      units:
        - name: docker-tls-tcp.socket
          command: start
          enable: true
          content: |
            [Unit]
            Description=Docker Secured Socket for the API
    
            [Socket]
            ListenStream=2376
            BindIPv6Only=both
            Service=docker.service
    
            [Install]
            WantedBy=sockets.target
        - name: docker.service
          drop-ins:
            - name: 10-tls-verify.conf
              content: |
                [Service]
                Environment="DOCKER_OPTS=--tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server.pem --tlskey=/etc/docker/server-key.pem"
    

    Use attached storage for Docker images

    Docker containers can be very large and debugging a build process makes it easy to accumulate hundreds of containers. It’s advantageous to use attached storage to expand your capacity for container images. Check out the guide to mounting storage to your CoreOS machine for an example of how to bind mount storage into /var/lib/docker.

    Enabling the Docker debug flag

    First, copy the existing unit from the read-only file system into the read/write file system, so we can edit it:

    cp /usr/lib/systemd/system/docker.service /etc/systemd/system/
    

    Edit the ExecStart line to add the -D flag:

    ExecStart=/usr/bin/docker -d -s=btrfs -r=false -H fd:// -D
    

    Now lets tell systemd about the new unit and restart Docker:

    systemctl daemon-reload
    systemctl restart docker
    

    To test our debugging stream, run a Docker command and then read the systemd journal, which should contain the output:

    docker ps
    journalctl -u docker
    

    Cloud-config

    If you need to modify a flag across many machines, you can provide the new unit with cloud-config:

    #cloud-config
    
    coreos:
      units:
        - name: docker.service
          command: restart
          content: |
            [Unit]
            Description=Docker Application Container Engine
            Documentation=http://docs.docker.io
            After=network.target
            [Service]
            ExecStartPre=/bin/mount --make-rprivate /
            # Run docker but don't have docker automatically restart
            # containers. This is a job for systemd and unit files.
            ExecStart=/usr/bin/docker -d -s=btrfs -r=false -H fd:// -D
    
            [Install]
            WantedBy=multi-user.target
    

    Use an HTTP proxy

    If you’re operating in a locked down networking environment, you can specify an HTTP proxy for Docker to use via an environment variable. First, create a directory for drop-in configuration for Docker:

    mkdir /etc/systemd/system/docker.service.d
    

    Now, create a file called /etc/systemd/system/docker.service.d/http-proxy.conf that adds the environment variable:

    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:8080"
    

    To apply the change, reload the unit and restart Docker:

    systemctl daemon-reload
    systemctl restart docker
    

    Cloud-config

    The easiest way to use this proxy on all of your machines is via cloud-config:

    #cloud-config
    
    coreos:
      units:
        - name: docker.service
          drop-ins:
            - name: 20-http-proxy.conf
              content: |
                [Service]
                Environment="HTTP_PROXY=http://proxy.example.com:8080"
          command: restart
    

    Increase ulimits

    If you need to increase certain ulimits that are too low for your application by default, like memlock, you will need to modify the Docker service to increase the limit. First, create a directory for drop-in configuration for Docker:

    mkdir /etc/systemd/system/docker.service.d
    

    Now, create a file called /etc/systemd/system/docker.service.d/increase-ulimit.conf that adds increased limit:

    [Service]
    LimitMEMLOCK=infinity
    

    To apply the change, reload the unit and restart Docker:

    systemctl daemon-reload
    systemctl restart docker
    

    Cloud-config

    The easiest way to use these new ulimits on all of your machines is via cloud-config:

    #cloud-config
    
    coreos:
      units:
        - name: docker.service
          drop-ins:
            - name: 30-increase-ulimit.conf
              content: |
                [Service]
                LimitMEMLOCK=infinity
          command: restart
    

    Using a dockercfg file for authentication

    A json file .dockercfg can be created in your home directory that holds authentication information for a public or private Docker registry.

    Read more about registry authentication.

    https://coreos.com/os/docs/latest/customizing-docker.html

  • 相关阅读:
    User Agent
    ASP.NET状态管理 APPlication,Session,Cookie和ViewStat用法
    HttpHandler
    转 此版本的 SQL Server 不支持用户实例登录标志。该连接将关闭“的解决
    跨服务器访问SQLSERVER
    sql字符串函数
    使用aspnet_regsql.exe 创建ASPState数据库,用来保存session会话
    SQL中CONVERT转化函数的用法
    Sql时间函数
    JS创建对象的几种方法
  • 原文地址:https://www.cnblogs.com/WayneZeng/p/5785179.html
Copyright © 2020-2023  润新知