zoukankan      html  css  js  c++  java
  • docker基础

    docker

    镜像管理

    docker image pull alpin:latest
    docker image ls / docker images
    --filter xx=xx
    danging = true/false 返回(非)悬虚镜像
    before 镜像名称或id
    since 镜像名称或id
    label 镜像标签
    --digests # 查看镜像摘要
    docker image build -t img:tag
    --nocache=true
    --squash # 将镜像合并不分层;但生成的镜像层过大,无法共享
    # 用 apt-get install no-install-recommends 减少下载量
    docker image inspect # 查看镜像层
    docker history # 显示镜像构建记录

    docker image tag now:tag new-name:new-tag # 创建新标签

    容器管理

    docker container ls
    docker container run -it ubuntu:latest /bin/bash
    -it 交互式执行命令 并将shell连接到当前终端
    Ctrl-PQ 退出容器还保持运行
    docker conrainer run
    -d
    --name 容器名称
    -p 80:80
    -e  # 定义环境变量
    --network docker0/network-name # 指定连接的网络
    -v /opt/data:/var/lib/mysql
    --restart always / unless-stopped / on-failed
    --flag # 将卷挂载到新建容器中
    img:tag
    docker exec -it 3234d5 /bin/bash # 进入到运行中的容器

    docker container stop docker-id
    docker container rm docker-id
    docker container rm -f $(docker container ls -aq) # 删除所有容器



    dockerfile

    FROM    image
    LABEL 信息="xxx"

    RUN 执行的命令 # 没执行一次创建一个新的层
    COPY 终端路径 镜像路径
    ADD 复制文件,同上
    WORKDIR 当前工作目录

    EXPOSE 记录应用使用的端口
    ENV 定义环境变量

    ENTRYPOINT ["镜像运行后执行的命令", "参数"] # 在shell环境下运行
    CMD 执行命令 # 无shell环境
    FROM alpine
    LABEL maintainer="nigelpoulton@hotmail.com"
    RUN apk add --update nodejs nodejs-npm
    COPY . /src
    WORKDIR /src
    RUN npm install
    EXPOSE 8080
    ENTRYPOINT ["node", "./app.js"]

    FROM python:3.4-alpine # 基础镜像
    ADD . /code # 将app复制到镜像中
    WORKDIR /code # 设置工作目录
    RUN pip install -r requirements.txt # 安装依赖
    CMD ["python", "app.py"] # 设置默认启动命令

    段阶段构建

    FROM node:latest AS storefront
    WORKDIR /usr/src/atsea/app/react-app
    COPY react-app .
    RUN npm install
    RUN npm run build

    FROM maven:latest AS appserver
    WORKDIR /usr/src/atsea
    COPY pom.xml .
    RUN mvn -B -f pom.xml -s /usr/share/maven/ref/settings-docker.xml dependency
    :resolve
    COPY . .
    RUN mvn -B -s /usr/share/maven/ref/settings-docker.xml package -DskipTests

    FROM java:8-jdk-alpine AS production
    RUN adduser -Dh /home/gordon gordon
    WORKDIR /static
    COPY --from=storefront /usr/src/atsea/app/react-app/build/ .
    WORKDIR /app # 从其他镜像复制应用
    COPY --from=appserver /usr/src/atsea/target/AtSea-0.0.1-SNAPSHOT.jar . # 从其他镜像复制
    ENTRYPOINT ["java", "-jar", "/app/AtSea-0.0.1-SNAPSHOT.jar"]
    CMD ["--spring.profiles.active=postgres"]

    docker-compose

    docker-compose  up -d
    down / top / stop / ps / restart
    version: "3.5"
    services:
    web-fe:
      build: . # 指定dockerfile的目录
      command: python app.py # 在docker容器中执行
      ports:
      - target: 5000 # 将内部端口映射到外部
      - published: 5000
      networks:
      - counter-net # 连接到制定网络
      volumes:
      - type: volume
      source: counter-vol
      target: /code # 数据持久化
     
      - .:/lib/dir # 两种持久化方式

    redis:
      image: "redis:alpine"
      networks:
      counter-net:

    networks:
    counter-net:

    volumes:
    counter-vol:

    # docker-compose [-f ./docker-compose.yml] -d

    Swarm

    使用端口

    • 2377/tcp:用于客户端与 Swarm 进行安全通信。

    • 7946/tcp 与 7946/udp:用于控制面 gossip 分发。

    • 4789/udp:用于基于 VXLAN 的覆盖网络。

    # 初始化节点
    docker swarm init 
    --advertise-addr 10.0.0.1:2377 
    --listen-addr 10.0.0.1:2377
    
    # 列出节点
    docker node ls
    # 在管理节点上获得token,以 工作/管理 节点身份加入
    docker swarm join-token worker/manager
    
    # 工作节点加入集群
    docker swarm join 
    --token SWMTKN-1-0uahebax...c87tu8dx2c 
    10.0.0.1:2377 
    --advertise-addr 10.0.0.4:2377 
    --listen-addr 10.0.0.4:2377
    
    --autolock	# 强制要求重启的管理节点在提供一个集群解锁码之后才有权从新接入集群
    docker swarm update --autolock=true # 开启并生成解锁码
    >>  SWMKEY-1-5+ICW2kRxPxZrVyBDWzBkzZdSd0Yc7Cl2o4Uuf9NPU4
    # 开启后再意外退出的节点加入需要解锁码
    docker swarm unlock	# 解锁

    集群中使用了raft技术。部署奇数个管理节点,防止脑裂;不部署太多管理节点(一般3-5个最多7个),越多达成共识的时间越长。

    服务

    docker service create --name web-fe 
    -p 8080:8080 
    --replicas 5 
    nigelpoulton/pluralsight-docker-ci	# 启动服务
    
    docker service ls
    docker service ps <service>
    docker service inspect --pretty	# 获取详细信息
    docker service scale demo=5	# 对副本个数进行增减
    docker service update		# 对属性进行变更
    docker service logs
    docker service rm

    网络管理

    网络

    1. none

    2. host

    3. bridge 单机桥接网络,只能本机上的容器相互通信

    4. overlay 分布式网络

    docker network ls
    docker network create -d bridge localnet # 创建本地桥接网络
    
    docker network create -d macvlan 
    --subnet=10.0.0.0/24 
    --ip-range=10.0.0.0/24 
    --gateway=10.0.0.1 
    -o parent=eth0.100 
    macvlan100
    
    docker network create -d overlay uber-net
    
    
    子命令说明
    docker network connect 将容器连接到网络。
    docker network create 创建新的 Docker 网络。默认情况下,在 Windows 上会采用 NAT 驱动,在 Linux 上会采用 Bridge 驱动。可以使用 -d 参数指定驱动(网络类型)。
    docker network disconnect 断开容器的网络。
    docker network inspect 提供 Docker 网络的详细配置信息。
    docker network ls 用于列出运行在本地 Docker 主机上的全部网络。
    docker network prune 删除 Docker 主机上全部未使用的网络。
    docker network rm 删除 Docker 主机上指定网络。

    卷管理

    docker volume create myvol
    docker volume inspect
    docker volume ls
    docker volume prune
    docker volume rm
    
    
    
    
    

    version: '2.0'
    services:
      web:
        build: .
        ports:
          - "5000:5000"
        volumes:
          - .:/code
          - logvolume01:/var/log
        links:
          - redis   network:     - mynetwork
      redis:
        image: redis   network:       - mynetwork
    volumes:
      logvolume01: {}network:  mynetwork:    driver: bridge
    # 可能等同于下方命令
    docker  build   .
    docker  run -d  -p 5000:5000  
                -v  .:/code  -v logvolume01  
                --link  redis   --name  web  
                
    docker  run -d  --name  redis  redisdocker  volume  create logvolume01docker  network create  mynetwork
    # wordpress-mysql
    version: '3'
    
    services:
    
      wordpress:
        image: wordpress
        ports:
          - 8080:80
        environment:
          WORDPRESS_DB_HOST: mysql
          WORDPRESS_DB_PASSWORD: root
        networks:
          - my-bridge
    
      mysql:
        image: mysql
        environment:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: wordpress
        volumes:
          - mysql-data:/var/lib/mysql
        networks:
          - my-bridge
    
    volumes:
      mysql-data:
    
    networks:
      my-bridge:
        driver: bridge
    #flask-redis
    # dockerfile
    
    FROM python:2.7
    LABEL maintaner="Peng Xiao xiaoquwl@gmail.com"
    COPY . /app
    WORKDIR /app
    RUN pip install flask redis
    EXPOSE 5000
    CMD [ "python", "app.py" ]
    
    # docker-compose.yml
    
    version: "3"
    
    services:
    
      redis:
        image: redis
    
      web:
        build:            # 通过当前目录下的 dockerfile 创建一个镜像
          context: .
          dockerfile: Dockerfile
        ports:
          - 8080:5000
        environment:
          REDIS_HOST: redis
    version: "3"
    
    services:
    
      redis:
        image: redis
    
      web:
        build:
          context: .
          dockerfile: Dockerfile
        environment:
          REDIS_HOST: redis
    
      lb:                # 负载均衡
        image: dockercloud/haproxy
        links:
          - web
        ports:
          - 8080:80
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
    version: "3"
    
    services:
    
      redis:
        image: redis
    
      web:
        build:
          context: .
          dockerfile: Dockerfile
        environment:
          REDIS_HOST: redis
    
      lb:                # 负载均衡
        image: dockercloud/haproxy
        links:
          - web
        ports:
          - 8080:80
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
    version: "3"
    
    services:
      voting-app:
        build: ./voting-app/.
        volumes:
         - ./voting-app:/app
        ports:
          - "5000:80"
        links:
          - redis
        networks:
          - front-tier
          - back-tier
    
      result-app:
        build: ./result-app/.
        volumes:
          - ./result-app:/app
        ports:
          - "5001:80"
        links:
          - db
        networks:
          - front-tier
          - back-tier
    
      worker:
        build: ./worker
        links:
          - db
          - redis
        networks:
          - back-tier
    
      redis:
        image: redis
        ports: ["6379"]
        networks:
          - back-tier
    
      db:
        image: postgres:9.4
        volumes:
          - "db-data:/var/lib/postgresql/data"
        networks:
          - back-tier
    
    volumes:
      db-data:
    
    networks:
      front-tier:
      back-tier:
    docker service create  --name wordpress
            -p 80:80
            -e WORDPRESS_ROOT_PASSWORD=000000
            -e WORDPRESS_DB_NAME=wordpress
            --network  my-overlay
            wordpress
    
    
    docker service create  --name mysql 
            -e MYSQL_ROOT_PASSWORD=000000
            -e MYSQL_DATABASE=wordpress
            --network my-overlay
            --mount type=volume,source=volume-demo,destination=/var/lib/mysql
            mysql



  • 相关阅读:
    普林斯顿宣布开源 25 核处理器
    瑞芯微RK3399宣布系统开源,进入百余种行业市场!
    Qt浅谈之二十App自动重启及关闭子窗口
    学在LINUX下编程(各种情况比较详细)
    ASP.NET开发规范:OWIN
    IDEA14中安装go语言插件
    sqlserver不能直接create table as select
    表复制语句select into from 与 insert into select 区别鉴赏
    实现Asp.net Mvc分布式Session Redis群集
    大小端模式
  • 原文地址:https://www.cnblogs.com/zhangzixian/p/13452130.html
Copyright © 2011-2022 走看看