zoukankan      html  css  js  c++  java
  • Docker 入门

    Docker 学习

    https://www.docker.com/get-started

    可以通过Docker Desktop(Windows,MacOS)和命令行(Linux,Windows和MacOS)来学习Docker。

    通过在Centos7.9上安装Docker并进行实际操作。

    Centos 7.9 安装Docker

    1. 查看内核版本

      $ uname -a
      Linux msr-server 3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
      
    2. 更新yum包

      $ yum update
      
    3. 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

      $ yum -y install gcc
      $ yum -y install gcc-c++
      $ yum install -y yum-utils device-mapper-persistent-data lvm2
      
    4. 设置的yum源

      $ yum list docker-ce --showduplicates | sort -r
      # 或者阿里云yum
      $ yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
      
    5. 查看仓库中docker版本,可以指定安装,不指定安装最新版本

      $ yum list docker-ce --showduplicates | sort -r
      Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
      Loaded plugins: fastestmirror
      Installed Packages
      docker-ce.x86_64            3:19.03.5-3.el7                    docker-ce-stable 
      docker-ce.x86_64            3:19.03.5-3.el7                    @docker-ce-stable
      docker-ce.x86_64            3:19.03.4-3.el7                    docker-ce-stable 
      docker-ce.x86_64            3:19.03.3-3.el7                    docker-ce-stable 
      docker-ce.x86_64            3:19.03.2-3.el7                    docker-ce-stable 
      docker-ce.x86_64            3:19.03.1-3.el7                    docker-ce-stable 
      docker-ce.x86_64            3:19.03.0-3.el7                    docker-ce-stable 
      docker-ce.x86_64            3:18.09.9-3.el7                    docker-ce-stable 
      docker-ce.x86_64            3:18.09.8-3.el7                    docker-ce-stable 
      docker-ce.x86_64            3:18.09.7-3.el7                    docker-ce-stable 
      docker-ce.x86_64            3:18.09.6-3.el7                    docker-ce-stable 
      docker-ce.x86_64            3:18.09.5-3.el7                    docker-ce-stable 
      docker-ce.x86_64            3:18.09.4-3.el7                    docker-ce-stable 
      docker-ce.x86_64            3:18.09.3-3.el7                    docker-ce-stable 
      docker-ce.x86_64            3:18.09.2-3.el7                    docker-ce-stable 
      docker-ce.x86_64            3:18.09.1-3.el7                    docker-ce-stable 
      docker-ce.x86_64            3:18.09.0-3.el7                    docker-ce-stable 
      docker-ce.x86_64            18.06.3.ce-3.el7                   docker-ce-stable 
      docker-ce.x86_64            18.06.2.ce-3.el7                   docker-ce-stable 
      docker-ce.x86_64            18.06.1.ce-3.el7                   docker-ce-stable 
      docker-ce.x86_64            18.06.0.ce-3.el7                   docker-ce-stable 
      docker-ce.x86_64            18.03.1.ce-1.el7.centos            docker-ce-stable 
      docker-ce.x86_64            18.03.0.ce-1.el7.centos            docker-ce-stable 
      docker-ce.x86_64            17.12.1.ce-1.el7.centos            docker-ce-stable 
      docker-ce.x86_64            17.12.0.ce-1.el7.centos            docker-ce-stable 
      docker-ce.x86_64            17.09.1.ce-1.el7.centos            docker-ce-stable 
      docker-ce.x86_64            17.09.0.ce-1.el7.centos            docker-ce-stable 
      docker-ce.x86_64            17.06.2.ce-1.el7.centos            docker-ce-stable 
      docker-ce.x86_64            17.06.1.ce-1.el7.centos            docker-ce-stable 
      docker-ce.x86_64            17.06.0.ce-1.el7.centos            docker-ce-stable 
      docker-ce.x86_64            17.03.3.ce-1.el7                   docker-ce-stable 
      docker-ce.x86_64            17.03.2.ce-1.el7.centos            docker-ce-stable 
      docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable 
      docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable 
      Determining fastest mirrors
      Available Packages
      
    6. 安装docker

      $ yum makecache fast
      $ yum install docker-ce
      
    7. 启动Docker,加入开机启动,验证安装

      $ systemctl start docker
      $ systemctl enable  docker
      $ docker version
      
    8. 配置阿里云镜像加速

      https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

      $ sudo mkdir -p /etc/docker
      $ sudo tee /etc/docker/daemon.json <<-'EOF'
      {
       "registry-mirrors": ["https://6ui8r60i.mirror.aliyuncs.com"]
      }
      EOF
      $ sudo systemctl daemon-reload
      $ sudo systemctl restart docker
      

    容器使用

    查看Docker命令

    $ docker
    $ docker run --help
    

    搜索并拉取镜像

    $ docker search 镜像名
    $ docker pull 镜像名
    $ docker pull 镜像名:版本号
    

    删除镜像

    $ docker rmi 镜像名
    

    启动容器

    -it参数说明, -i表示交互的输入输出,-t表示模拟容器终端

    ubunut镜像名,如果没有被拉取,提示无法找到,之后自动拉取

    /bin/bash: 指定执行的脚本

    --name: 指定容器的名字

    --restart=always:表示容器停止后,自动启动容器

    $ docker run -it ubuntu /bin/bash --restart=always --name test-name
    

    常用操作

    查看所有容器

    $ docker ps -a
    

    查看运行中的容器

    $ docker ps
    

    启动容器

    # docker start 容器id|容器name
    $ docker start 2dfs3rrfwef
    $ docker start gds-test
    

    停止容器

    # docker stop 容器id|容器name
    $ docker stop 2dfs3rrfwef
    $ docker stop gds-test
    

    查看容器日志

    # docker logs 容器id|容器name
    $ docker logs 2dfs3rrfwef
    $ docker logs gds-test
    

    删除容器

    #docker rm 容器id
    $ docker rm 2dfs3rrfwef
    

    进入容器

    $ docker exec -it 243c32535da7 /bin/bash
    

    复制文件

    文件复制支持双向操作

    复制文件到容器
    $ docker cp /var/wwwroot/koa-test/ 容器id:/var/wwwroot/
    

    从容器复制文件到本地

    $ docker cp 容器id:/var/wwwroot/koa-test/ /var/wwwroot/
    

    升级容器

    生成镜像

    通过Dockerfile文件配置打包命令,并进行打包操作。

    打包前的准备

    在项目根目录,创建Dockerfile,内容如下:

    此代码打包后的体积接近1GB,建议使用下面的优化版本。

    FROM node
    ADD . /var/wwwroot/koa-test/
    WORKDIR /var/wwwroot/koa-test/
    RUN cd /var/wwwroot/koa-test/ && npm install
    EXPOSE 3010
    CMD ["npm", "start"]
    

    打包优化

    alpine 是最小的可运行linux容器,安装 nodenpm 后就构建完毕。构建的镜像体积不到100MB。

    FROM alpine  #最小的linux容器,大概只有5MB
    RUN apk add --update nodejs npm #安装nodejs 和 npm
    ENV NODE_ENV production	#设置运行环境为production
    WORKDIR /var/wwwroot/koa-test/	#设置当前的工作目录
    COPY . .    #复制文件
    RUN npm ci --only=production    #安装依赖
    EXPOSE 3000    #暴露端口
    CMD ["npm", "start"] #初始化执行脚本
    

    打包

    在项目目录,运行下面的脚本

    $ docker build -t node-gds-koa ./
    $ docker build -t gds-koa-nosync ./
    

    打包时使用代理

    $ docker build -t gds-koa-alpine ./ --build-arg https_proxy=http://172.17.0.1:1080
    

    运行生成的镜像

    #image:
    $ docker run --restart=always -d -p 3015:3000 -e NODE_ENV=production --name koa-015 node-gds-koa
    
    #image:
    $ docker run --restart=always -d -p 3015:3000 -e NODE_ENV=production --name koa-015 gds-koa-nosync
    

    导出镜像文件

    #将镜像gds-koa-nosync导出到当前目录的gds-koa-nosync.tar
    $ docker save gds-koa-nosync > gds-koa-nosync.tar
    

    导入镜像文件

    #将当前目录的gds-koa-nosync.tar镜像文件导入到Docker
    $ docker load < gds-koa-nosync.tar
    

    Docker Compose

    配置文件

    可以在配置文件里调用环境变量,语法${DB_PASS}

    Ubuntu

    Linux下可以创建/root/.env文件,批量设置环境变量参数。

    DB_NAME=gdscms
    DB_PASS=root
    DB_PASS=123456
    

    之后修改/root/.profile,并在最后添加:

    set -o allexport; source /root/.env; set +o allexport
    

    使用printenv查看所有环境变量

    CentOS

    ...todo....

    配置文件docker-compose.yml

    version: "3"
    services:
      nginx: 
        image: nginx:stable-alpine
        ports:
          - "3000:80"
        volumes: 
          - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
        
      koa-app:
        build: .
        environment: 
          - PORT=3000
        depends_on:
          - db
      db:
        image: postgres:10.18-alpine
        restart: always
        environment:
          POSTGRES_DB: gdscms
          POSTGRES_PASSWORD: ${DB_PASS}
          PGDATA: /var/lib/postgresql/data/pgdata
          
        volumes: 
          - postgres-db:/var/lib/postgresql/data
    volumes: 
      postgres-db:
    

    配置文件docker-compose.dev.yml

    version: "3"
    services: 
      koa-app:
        build: 
          context: .
          args:
            NODE_ENV: development
        volumes:
          - ./:/app/
          - /app/node_modules
        environment: 
          - NODE_ENV=development
          - GDS_DB_TYPE=postgres
          - GDS_DB_HOST=db
          - GDS_DB_USER=postgres
          - GDS_DB_PASS=****
        command: npm run dev
    
      jenkins:
        image: jenkins/jenkins:lts
        ports: 
          - "50001:50001"
          - "8080:8080"
        environment:
          - JENKINS_SLAVE_AGENT_PORT=50001
        volumes: 
          - jenkins-data:/var/jenkins_home
    
    volumes: 
      jenkins-data:
    

    运行

    简单运行

    docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d
    

    负载均衡运行

    创建./nginx/default.conf的nginx配置文件

    server {
        listen 80;
    
        location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            proxy_pass http://koa-app:3000;
            proxy_redirect off;
        }
    }
    

    运行

    添加--scale参数,并在后面加上容器名称=数量

    docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d --scale koa-app=2
    

    使用Aliyun管理镜像

    新建Aliyun仓库

    进入阿里云镜像服务控制台,新建镜像仓库。

    在新建之前,需要创建一个registry登录密码。

    设置完密码之后,进入到仓库管理界面

    设置代码源可以使用Github,Gitee等等,选择本地仓库。

    • 命名空间:相当于组织名
    • 仓库名称:Docker容器的名字

    登录仓库

    $ docker login --username=email@domain.com registry.cn-hangzhou.aliyuncs.com
    

    推送到Aliyun

    如果没登录,需要先登录,并输入在新建阿里云仓库之前设置的Registry密码

    $ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/bulog/gds-koa-nosync:[镜像版本号]
    $ docker push registry.cn-hangzhou.aliyuncs.com/bulog/gds-koa-nosync:[镜像版本号]
    

    示例

    首先使用docker images命令查询需要push的镜像ID为e3a1bb06d900

    $ docker tag e3a1bb06d900 registry.cn-hangzhou.aliyuncs.com/bulog/gds-koa-nosync:v1
    $ docker push registry.cn-hangzhou.aliyuncs.com/bulog/gds-koa-nosync:v1
    

    从Aliyun拉取

    $ docker pull registry.cn-hangzhou.aliyuncs.com/bulog/gds-koa-nosync:[镜像版本号]
    

    自动化 Docker watchtower

    https://github.com/containrrr/watchtower

    需要使用镜像名称启动容器。

    watchtower 会自动根据镜像名称最前面内容,获取镜像的实际请求URL地址。

    运行

    环境变量:

    • WATCHTOWER_TRACE=true
    • WATCHTOWER_DEBUG=true
    • WATCHTOWER_POLL_INTERVAL=50
    $ docker run -d 
        --name watchtower 
        -v /var/run/docker.sock:/var/run/docker.sock 
        containrrr/watchtower container_to_watch
    

    私有仓库

    docker run -d --name watchtower -e REPO_USER=email@domain.com -e REPO_PASS=*** -e WATCHTOWER_POLL_INTERVAL=50 --restart always -v /Users/joy/.docker/config.json:/config.json -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower gds-01 --debug
    

    私有库

    如果是私有库,需要传入用户名和密码

    $ docker run -d 
      --name watchtower 
      -e REPO_USER=username 
      -e REPO_PASS=password 
      -v /var/run/docker.sock:/var/run/docker.sock 
      containrrr/watchtower container_to_watch --debug
    

    Docker compose

    使用Docker compose方式

    version: "3"
    services:
      cavo:
        image: index.docker.io/<org>/<image>:<tag>
        ports:
          - "443:3443"
          - "80:3080"
      watchtower:
        image: containrrr/watchtower
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - /root/.docker/config.json:/config.json
        command: --interval 30
    

    自动删除旧镜像

    使用 --cleanup 参数在更新后自动删除旧的镜像。

    仅监控更新情况,不更新

    使用 --monitor-only 将仅监控新镜像并发送通知,不会更新容器。

    设置自动更新检查频率

    使用 --interval 设置设更新检测时间间隔,单位为秒。比如每隔 1 个小时检查一次更新则为 --interval 3600

    通知提醒

    当容器更新时,watchtower 可通过日志系统中的 hooks 发送通知。要发送的通知类型可通过 --notifications 参数(或环境变量 WATCHTOWER_NOTIFICATIONS)设置,可设置的值包括:

    email:通过 e-mail 发送通知•slack:通过 Slack webhook 发送通知•msteams:通过 MSTeams webhook 发送通知•gotify:通过 Gotify 发送通知•shoutrrr:通过 containrrr/shoutrrr 发送通知

    比如我们想通过电子邮件接收通知,就可以设置以下命令行选项或它们对应的环境变量:

    docker run -d   --name watchtower   -v /var/run/docker.sock:/var/run/docker.sock   -e WATCHTOWER_NOTIFICATIONS=email   -e WATCHTOWER_NOTIFICATION_EMAIL_FROM=fromaddress@gmail.com   -e WATCHTOWER_NOTIFICATION_EMAIL_TO=toaddress@gmail.com   -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.gmail.com   -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587   -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=fromaddress@gmail.com   -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=app_password   -e WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2   containrrr/watchtower
    
    • --notification-email-from(环境变量 WATCHTOWER_NOTIFICATION_EMAIL_FROM):邮件发送地址
    • --notification-email-to(环境变量 WATCHTOWER_NOTIFICATION_EMAIL_TO):邮件接收地址
    • --notification-email-server(环境变量 WATCHTOWER_NOTIFICATION_EMAIL_SERVER):设置 SMTP 服务器
    • --notification-email-server-tls-skip-verify(环境变量 WATCHTOWER_NOTIFICATION_EMAIL_SERVER_TLS_SKIP_VERIFY):不验证邮件服务器的 TLS 证书
    • --notification-email-server-port(环境变量 WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT):设置 SMTP 的短裤男,默认为 25
    • --notification-email-server-user(环境变量 WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER):SMTP 的用户名
    • --notification-email-server-password(环境变量 WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD):密码
    • --notification-email-delay(环境变量 WATCHTOWER_NOTIFICATION_EMAIL_DELAY):发送通知之前的延迟(秒)
    • --notification-email-subjecttag(环境变量 WATCHTOWER_NOTIFICATION_EMAIL_SUBJECTTAG):包含在主题标签中的前缀

    Docker Swarm

    查看Dockers Swarm状态

    此处会显示docker swarm状态,默认为inactive

    docker info
    

    启用

    此处会生成专用的加入密匙,可以将其他的docker加入进来

    支持参数:

    • --advertise-addr: 默认的IP和端口,如192.168.1.18:2377
    • --listen-addr: 默认的IP和端口,如192.168.1.18:2377
    docker swarm init
    

    加入

    如果需要加入其他的docker manager,使用下面的命令加入

    docker swarm join --token SWMTKN-1-1ad4l1v44lfu7quhuj4u5l5dju7j2p1942nr995umvycp5a1f9-6oc0y4w2i7yi0p5d8gtefzr4d 192.168.65.3:2377
    

    docker-compose.yml配置

    运行

    docker stack deploy -c docker-compose.yml -c docker-compose.prod.yml myapp
    

    查看所有节点

    docker node ls
    

    查看所有stack

    docker stack ls
    

    查看stack的所有services

    docker stack services myapp
    

    查看所有services

    docker service ls
    
  • 相关阅读:
    洛谷1525关押罪犯——二分
    洛谷P1525关押罪犯——二分做法
    poj2411铺砖——状压DP
    1 理解Linux系统的“平均负载”
    3.2-3 tac、more
    3.20 tr:替换或删除字符
    3.14-19 wc、iconv、dos2unix、diff、vimdiff、rev
    3.21-22 od、tee
    指针和引用的区别
    new与malloc区别
  • 原文地址:https://www.cnblogs.com/jhtfh/p/docker.html
Copyright © 2011-2022 走看看