• 实用的Docker入门


    1 Docker概述

    Docker和虚拟机一样,都拥有环境隔离的能力,但它比虚拟机更加轻量级,可以使资源更大化地得到应用。首先来看Docker的架构图:

    理解其中几个概念:

    • Client(Docker客户端):是Docker的用户界面,可以接受用户命令(docker build,docker pull...)和配置标识,并与Docker daemon通信
    • Images(Docker镜像):是一个只读模板,含创建Docker容器的说明,它与操作系统的安装光盘有点像
    • Containers(容器):镜像的运行实例,镜像与容器的关系类比面向对象中的类和对象
    • Registry:是一个集中存储与分发镜像的服务。最常用的Docker Registry是官方的Docker Hub

    2 Docker安装

    CentOS7系统下安装Docker为例。Docker 软件包和依赖包已经包含在默认的 CentOS-Extras 软件源里,安装命令如下:

    yum -y install docker

    启动docker后台服务:

    service docker start

    验证是否安装成功:

    [root@localhost hemi]# docker version
    Client:
     Version:         1.13.1
     API version:     1.26
     Package version: <unknown>
     Go version:      go1.8.3
     Git commit:      774336d/1.13.1
     Built:           Wed Mar  7 17:06:16 2018
     OS/Arch:         linux/amd64
    
    Server:
     Version:         1.13.1
     API version:     1.26 (minimum version 1.12)
     Package version: <unknown>
     Go version:      go1.8.3
     Git commit:      774336d/1.13.1
     Built:           Wed Mar  7 17:06:16 2018
     OS/Arch:         linux/amd64
     Experimental:    false

    更详细的针对各操作系统的安装见官方文档:https://docs.docker.com/install/

    镜像加速

    鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com。

    新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%dockerconfigdaemon.json(Windows) 来配置 Daemon。

    请在该配置文件中加入(没有该文件的话,请先建一个):

    {
      "registry-mirrors": ["http://hub-mirror.c.163.com"]
    }

    3 Docker常用命令

    3.1 镜像常用命令

    1)搜索镜像

    可以在Docker Hub主页上搜索镜像,可以通过docker search命令搜索,如:

    docker search [OPTIONS] TERM

    OPTIONS说明:

    • --automated : 只列出 automated build类型的镜像;
    • --no-trunc : 显示完整的镜像描述;
    • -s : 列出收藏数不小于指定值的镜像。
    [root@localhost hemi]# docker search -s 20 tomcat
    INDEX       NAME                                      DESCRIPTION           STARS     OFFICIAL   AUTOMATED
    docker.io   docker.io/tomcat                          Apache Tomcat is...   1757      [OK]       
    docker.io   docker.io/dordoka/tomcat                  Ubuntu 14.04, Or...   48                   [OK]
    docker.io   docker.io/tomee                           Apache TomEE is ...   47        [OK]       
    docker.io   docker.io/davidcaste/alpine-tomcat        Apache Tomcat 7/...   24                   [OK]

    其中,

    STARTS:镜像仓库收藏数

    AUTOMATED:表示是否是自动构建的镜像仓库

    2)下载镜像

    docker pull [OPTIONS] NAME[:TAG]

    OPTIONS说明:

    • -a :拉取所有 tagged 镜像 
    • --disable-content-trust :忽略镜像的校验,默认开启

    举个栗子

    docker pull java   #从Docker Hub中下载最新版本的Java镜像
    docker pull reg.itmuch.com/java:8    #从指定Registry中下载标签为8的Java镜像

    3)列出镜像

    docker images [OPTIONS] [REPOSITORY[:TAG]]

    OPTIONS说明:  

    • -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
    • --digests :显示镜像的摘要信息
    • -f :显示满足条件的镜像;
    • --format :指定返回值的模板文件;
    • --no-trunc :显示完整的镜像信息;
    • -q :只显示镜像ID。

    举个栗子:

    列出本地镜像中REPOSITORY为ubuntu的镜像列表

    [hemi@localhost ~]$ docker images ubuntu
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    docker.io/ubuntu    latest              0458a4468cbc        7 weeks ago         111.7 MB
    docker.io/ubuntu    15.10               9b9cb95443b5        20 months ago       137.2 MB

    4)删除本地镜像

    docker rmi [OPTIONS] IMAGE [IMAGE...]

    OPTIONS说明:  

    • -f :强制删除;
    • --no-prune :不移除该镜像的过程镜像,默认移除;

    3.2 容器常用命令

     1)新建并启动容器

    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

     OPTIONS说明(常用):

    • -d: 后台运行容器,并返回容器ID;
    • --name="nginx-lb": 为容器指定一个名称;
    • -i:以交互模式运行容器,通常与 -t 同时使用;
    • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    • -P: 随机端口映射;
    • -p: 指定端口映射,有以下四种格式
      • ip:hostPort:containerPort
      • ip::containerPort
      • hostPort:containerPort
      • containerPort
    • --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container:<name|id> 四种类型;

     如:

    docker run --name mynginx -d nginx:latest
    #使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
    
    docker run -p 91:80 -v /data:/data -d nginx:latest
    #使用镜像nginx:latest以后台模式启动一个容器,将容器的80端口映射到主机的91端口,主机的目录/data映射到容器的/data。
    
    
    [hemi@localhost ~]$ docker run -it nginx:latest /bin/bash 
    root@b8573233d675:
    /#
    #使用镜像nginx:latest以交互模式启动一个容器,在容器内执行
    /bin/bash命令。

    2)列出容器

    docker ps [OPTIONS]

     OPTIONS说明(常用):

    • -a :显示所有的容器,包括未运行的。
    • -f :根据条件过滤显示的内容。
    • --format :指定返回值的模板文件。
    • -l :显示最近创建的容器。
    • -n :列出最近创建的n个容器。
    • --no-trunc :不截断输出。
    • -q :静默模式,只显示容器编号。
    • -s :显示总的文件大小。

    3)停止容器

    docker stop CONTAINER_ID/CONTAIN_NAME

    4)强制停止容器

    docker kill CONTAINER_ID/CONTAIN_NAME

    5)启动已停止容器

    docker start CONTAINER_ID/CONTAIN_NAME

    6)重启容器

    docker restart CONTAINER_ID/CONTAIN_NAME

    7)进入容器

    docker exec -it CONTAINER_ID bash

    如:

    [hemi@localhost ~]$ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                    NAMES
    219371844a81        7f94db72116e        "tomcat.sh"         7 seconds ago       Up 7 seconds        8009/tcp, 8080/tcp, 0.0.0.0:91->80/tcp   zen_kalam
    [hemi@localhost ~]$ docker exec -it 219371844a81 bash
    bash-4.2$ 

    8)删除容器

    docker rm [OPTIONS] CONTAINER [CONTAINER...]

     OPTIONS说明(常用):

    • -f :通过SIGKILL信号强制删除一个运行中的容器
    • -l :移除容器间的网络连接,而非容器本身
    • -v :-v 删除与容器关联的卷

    更多命令见Docker的官方文档https://docs.docker.com/edge/engine/reference/commandline/

    也可以利用命令行查看,如:

    docker rm --help

    4 入门实战

    此时浏览器访问结果如下表示正常 

    再次访问浏览器如下结果,表示修改正常 

     

     但是此时如果重启容器,则之前的改动将失效。若要保存修改可以提交保存为新镜像↓

    此过程还可以用Dockerfile完成

    1、首先新建Dockerfile,内容如下:

    2、在Dockerfile所在路径执行以下命令构建镜像,并运行:

    浏览器访问


    Dockerfile官方文档https://docs.docker.com/engine/reference/builder/

    Dockerfile最佳实践https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

     5 Docker Compose

    Docker Compose用来定义和运行多应用容器。使用Docker Compose大致有3个步骤:

    • 使用Dockerfile定义应用程序环境,应标在任何地方重现该环境
    • 在docker-compose.yml文件中定义组成应用程序的服务,以便各个服务在一个隔离的环境中一起运行
    • 运行docker-compose up 命令,启动并运行整个应用程序

    5.1 安装Compose

    ①通过以下命令自动下载并安装适应系统版本的Compose:

    curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

    ②为安装脚本添加执行权限:

    chmod +x /usr/local/bin/docker-compose

    安装完成。可以使用以下命令测试安装结果:

    ocker-compose --version

    5.2 安装Compose命令补全工具

    curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

    输入docker-compose并按下Tab键,compose就可以自动补全命令了。

    5.3 入门实例

     个人博客实例,含三个层,分别为nginx、ghost app、mysql

    1、创建3个目录

    2、进入ghost目录,创建两个文件

    ① Dockerfile

    FROM ghost
    COPY ./config.production.json /var/lib/ghost/config.production.json
    EXPOSE 2368

    config.production.json  

    {
        "url": "http://localhost:2368/",
        "server": {
            "port": 2368,
            "host": "0.0.0.0"
        },
        "database": {
            "client": "mysql",
            "connection": {
                "host": "db",
                "user": "ghost",
                "password": "ghost",
                "database": "ghost",
                "port": 3306,
                "charset": "utf8"
            }
        },
        "mail": {
            "transport": "Direct"
        },
        "logging": {
            "transports": [
                "file",
                "stdout"
            ]
        },
        "process": "systemd",
        "paths": {
            "contentPath": "/var/lib/ghost/content"
        }
    }

     3、进入nginx目录,配置

    ①Dockerfile

    FROM docker.io/nginx
    COPY nginx.conf /etc/nginx/nginx.conf
    EXPOSE 80

    ②nginx.conf

    worker_processes 4;
    events {worker_connections 1024;}
    http {
        server {
            listen 80;
            location / {
                proxy_pass http://ghost-app:2368;
            }
        }
    }

    4、配置docker-compose.yml

     在blog目录下创建docker-compose.yml文件

    version: '2'
    networks:
      ghost:
    services:
      ghost-app:
        build: ghost
        networks:
          - ghost
        depends_on:
          - db
        ports:
          - "2368:2368"
      nginx:
        build: nginx
        networks: 
          - ghost
        depends_on:
          - ghost-app
        ports:
          - "80:80"
      db:
        image: "mysql:5.7.15"
        networks:
          - ghost
        environment:
          MYSQL_ROOT_PASSWORD: mysqlroot
          MYSQL_USER: ghost
          MYSQL_PASSWORD: ghost
        volumes:
          - $PWD/data:/var/lib/mysql
        ports:
          - "3306:3306"

    以上即可。随后在docker-compose.yml所在目录build镜像并运行

    docker-compost stop         #停止容器   
    docker-compose rm            #删除容器
    docker-compose build         #重新建立
    docker-compose up -d        #启动运行

    docker-compose命令-官方文档https://docs.docker.com/compose/reference/overview/

  • 相关阅读:
    几款开源的图形界面库(GUI Libraries)
    CMenu菜单
    开源免费的C/C++网络库(c/c++ sockets library) 七剑下天山
    基于MFC的ActiveX控件开发
    VC++中动态生成菜单技巧
    ActiveX控件打包成Cab置于网页中自动下载安装
    VC++API小查
    全面解析MFC应用程序中处理消息的顺序
    CMenu类的使用方法
    跨域单点登录实现(使用iframe)_勇敢的心_百度空间
  • 原文地址:https://www.cnblogs.com/hemiy/p/8576667.html
Copyright © 2020-2023  润新知