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
原文地址:https://www.cnblogs.com/jhtfh/p/docker.html