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



posted @ 2020-08-07 12:44  651635  阅读(206)  评论(0编辑  收藏  举报