Docker学习笔记

一、基础

  1. docker是使用Go语言在Linux上是基于Linux内核的cgroup,namespace,以及AUFS类的Union FS等技术实现的容器。
  2. 管理命令
#启动
systemctl enable docker
systemctl start docker

#查看信息
docker info

#查看帮助
docker --help

二、镜像

  1. 可以看做一个根文件系统
  2. 仓库:一般使用如userName/ubuntu:14.04标识仓库中的镜像
  3. 管理命令
#拉取镜像
docker pull [选项] [Docker Registry 地址[:端口号]/]镜像名称[:标签]

#列出镜像,IMAGE ID是唯一的
docker image ls
 REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
 hello-world         latest              2cb0d9787c4d        13 days ago         1.85kB
 
#删除本地镜像
docker image rm imageid

#查看镜像详情
docker image inspect nginx:1.12

#镜像导出导入
docker image save eb40dcf64078> /root/mydjango-save-1016.tar
docker image load < /root/mydjango-save-1016.tar  
  1. Dockerfile
FROM debian:jessie   #指定基础镜像
RUN apt-get install -y gcc libc6-dev make    #或RUN ["可执行文件", "参数1", "参数2"]
COPY package.json /usr/src/app/  #从上下文目录中复制到目标目录;或COPY ["<源路径1>",... "<目标路径>"]
WORKDIR <工作目录路径>  #指定工作目录
USER <用户名>    #指定当前用户
ENV NODE_VERSION 7.2.0   #定义环境变量
VOLUME ["<路径1>", "<路径2>"...]     #定义匿名数据卷,会自动关联到主机某个目录;或VOLUME <路径>
EXPOSE <端口1> [<端口2>...]  #开放端口


CMD <命令>   #容器启动后默认执行的命令(容器中无systemd概念),会被commad覆盖,只能出现一次;或CMD ["可执行文件", "参数1", "参数2"...]
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]   #如果定义了接入点,那么执行到CMD时,CMD含义变为提供参数,只能出现一次



#docker build -t nginx:v3 .:通常在空目录中放置Dockerfile,表示在上下文目录中构建镜像

三、容器

  1. 实质上即进程
  2. 管理命令
#运行镜像
 #-d:容器后台运行
 #-m:限制最大内存量
 #-cpus:限制最大cpu量
docker container run [options] image [commad] [arg...]

#启动停止状态的容器
docker container start myrunoob

#列出容器
docker container ls

#进入容器
 #退出容器:exit
docker container exec -it 69d1 bash

#删除容器
docker container rm myrunoob
docker container rm $(docker ps -aq)

#查看容器详情
docker container inspect web
  1. 数据管理
#创建数据卷
docker volume create my-vol

#查询所有数据卷
docker volume ls

#查看数据卷信息
docker volume inspect my-vol
[
 {
 "Driver": "local",
 "Labels": {},
 "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
 "Name": "my-vol",
 "Options": {},
 "Scope": "local"
 }
 ]
 
 #启动容器时挂载数据卷
 docker run -d -P \
     --name web \
     --mount source=my-vol,target=/webapp \
     training/webapp \
     python app.py
     
 #删除数据卷
 docker volume rm my-vol
 
 #直接绑定主机目录
 docker run -d -P \
     --name web \
     --mount type=bind,source=/src/webapp,target=/opt/webapp \
     training/webapp \
     python app.py
  1. 网络管理
    1. 支持的网络模式
      • bridge:默认的,限本主机,可以通过容器名发现容器
      • Overlay:跨主机,需满足以下任一条件
        • docker运行在Swarm模式中
        • docker引擎都连接到consul等上
    2. 管理命令
    #-P:Docker会随机映射一个49000~49900的端口到容器开放的端口
    docker run -d -P training/webapp python app.py
    
    #-p:指定映射端口到容器端口
    docker run -d -p 5000:5000 training/webapp python app.py
    
    #查看容器的端口映射配置
    docker port nostalgic_morse 5000
    
    #创建网络
    docker network create -d overlay multi_host
    
    #查看网络
    docker network ls
    
    #移除网络
    docker network rm multi_host
    

四、Docker Compose

  1. 定义和运行多个 Docker 容器的官方开源项目;用Python编写,调用Docker服务提供的API实现
  2. 管理的单元
    • 服务(service):一个应用容器
    • 项目(project):由一组关联的应用容器组成的一个完整业务单元
    # 管理的单元配置文件,默认docker-compose.yml
    version: "3"
    services:
      db:
        image: mysql:5.7
        # 或者通过build指定Dockerfile的方式
        #build:
        #  context: ./dir
        #  dockerfile: Dockerfile-alternate
        volumes:
          - db_data:/var/lib/mysql
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: somewordpress
          MYSQL_DATABASE: wordpress
          MYSQL_USER: wordpress
          MYSQL_PASSWORD: wordpress
      wordpress:
        depends_on:
          - db
        image: wordpress:latest
        ports:
          - "8000:80"
        restart: always
        environment:
          WORDPRESS_DB_HOST: db:3306
          WORDPRESS_DB_USER: wordpress
          WORDPRESS_DB_PASSWORD: wordpress
    volumes:
      db_data:
        data:
          #instead of attempting to create a volume called [projectname]_data, Compose looks for an existing volume simply called data and mount it into the db service’s containers
          external: true
    
  3. 管理命令
#一般命令格式
 #-f:指定模板文件,默认当前目录下docker-compose.yml
 #-p:指定项目名称,默认当前目录名为项目名
docker-compose [options] [COMMAND] [ARGS...]

#启动compose
docker-compose up

五、Docker Machine

  1. 负责在多种平台上快速安装Docker环境的官方开源项目
  2. 管理命令
#创建一台 Docker 主机
docker-machine create -d virtualbox test

#通过 SSH 登录到主机
docker-machine ssh test

六、Docker Swarm

  1. Swarm是Docker内置的Docker主机集群管理工具
    • 运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 ( node )
    • 节点分为管理 ( manager ) 节点和工作 ( worker ) 节点,管理节点默认也作为工作节点
  2. 管理命令
#本地初始化一个Swarm集群,默认是管理节点
#如果你的 Docker 主机有多个网卡,拥有多个 IP,必须使用 --advertise-addr 指定 IP
$docker swarm init --advertise-addr 192.168.99.100
 Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
 To add a worker to this swarm, run the following command:
 docker swarm join \
 --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
 192.168.99.100:2377
 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

#创建一个docker主机并加入Swarm集群
$docker-machine create -d virtualbox worker1
$docker-machine ssh worker1
 docker@worker1:~$ docker swarm join \
     --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
     192.168.99.100:2377
 This node joined a swarm as a worker.
 
 #查看集群
 docker node ls
 
 #向集群中部署服务
 #部署后我们使用浏览器,输入任意节点 IP ,即可看到 nginx 默认页
 docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine
 
 #查看服务
 docker service ls
 ID NAME MODE REPLICAS IMAGE PORTS
 kc57xffvhul5 nginx replicated 3/3 nginx:1.13.7-alpine *:80->80/tcp
 
 #查看服务详情
 docker service ps
 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
 pjfzd39buzlt nginx.1 nginx:1.13.7-alpine swarm2 Running Running about a minute ago
 hy9eeivdxlaa nginx.2 nginx:1.13.7-alpine swarm1 Running Running about a minute ago
 36wmpiv7gmfo nginx.3 nginx:1.13.7-alpine swarm3 Running Running about a minute ago
 
 #删除服务
 docker service rm
 
 
  1. 使用docker-compose.yml
#配置文件一般如下:
 version: "3"
 services:
   wordpress:
     image: wordpress
     ports:
       - 80:80
     networks:
       - overlay
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
     deploy:
       mode: replicated
       replicas: 3
   db:
     image: mysql
     networks:
       - overlay
     volumes:
       - db-data:/var/lib/mysql
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
     deploy:
       placement:
         constraints: [node.role == manager]
   visualizer:   #提供可视化界面服务
     image: dockersamples/visualizer:stable
     ports:
       - "8080:8080"
     stop_grace_period: 1m30s
     volumes:
       - "/var/run/docker.sock:/var/run/docker.sock"
     deploy:
       placement:
         constraints: [node.role == manager]
   volumes:
     db-data:
   networks:
     overlay:
     
 #部署服务
 docker stack deploy -c docker-compose.yml wordpress
 
 #查看服务
 docker stack ls
 
 #移除服务
 docker stack down

你可能感兴趣的:(Docker学习笔记)