• Docker 学习


    入门docker看阮一峰老师的两篇就入门了,这里做下笔记

    http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html

    http://www.ruanyifeng.com/blog/2018/02/docker-wordpress-tutorial.html

    虚拟机的缺点

    虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。

    虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点。

    (1)资源占用多

    虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。

    (2)冗余步骤多

    虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。

    (3)启动慢

    启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。

    容器优点

    Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

    由于容器是进程级别的,相比虚拟机有很多优势。

    (1)启动快

    容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。

    (2)资源占用少

    容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。

    (3)体积小

    容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。

    总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。

    Docker 用途

    Docker 的主要用途,目前有三大类。

    (1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

    (2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。

    (3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

    Ubuntu docker安装

    sudo apt-get install -y telnet gcc make vim net-tools tree rar aptitude manpages-posix-dev libltdl3-dev lrzsz bridge-utils ipvsadm openssh-server ipvsadm git 
    
    sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
    
    sudo curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    
    sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
    
    sudo apt-cache policy docker-ce
    
    sudo apt-get install -y docker-ce
    
    docker version
    
    sudo systemctl start docker
    
    sudo systemctl enable docker
    
    sudo vim /etc/docker/daemon.json

    {
    "registry-mirrors": ["https://o68hnxvo.mirror.aliyuncs.com"]
    }

    sudo systemctl daemon-reload
    
    sudo systemctl restart docker
    
    ps -ef| grep docker| grep -v grep
    
    docker-compose version
    
    # install go-land
    
    wget https://dl.google.com/go/go1.11.6.linux-amd64.tar.gz
    
    sudo tar -zxvf go1.11.6.linux-amd64.tar.gz -C /usr/local/
    
    mkdir $HOME/go
    
    go env

    vim /etc/profile

    export GOROOT="/usr/local/go"
    export GOPATH="$HOME/go"
    export GOBIN="$HOME/go/bin"
    export PATH="$PATH:$GOROOT/bin:$GOPATH/bin"
    export NODEJS_HOME="/usr/local/node-v8.11.4-linux-x64"
    export PATH="$PATH:$NODEJS_HOME/bin"

    # install hyperledger
    
    mkdir hyperledger && cd hyperledger
    
    git clone https://github.com/hyperledger/fabric-samples.git
    
    curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s 1.4.1 1.4.1 0.4.15

    Docker概念:

    0x00  微服务,服务模块化

    0x01  image相当于类, container 相当于对象,可自定义镜像

    0x02  类似github,可以登录push 和 pull

    0x03  可以映射端口和目录到本地,docker使用局域网IP

    0x04  超低开销,性能优,启动快

    Docker 常用命令

    docker ps -a  查看容器状态

    docker container 

          ls   查看容器
    
         run  新开一个容器
    
          start 打开已有容器
    
          stop  关闭容器
    
          rm   删除容器
    
          stats 运行状态
    
          port 查看端口映射
    
          commit 提交变化到镜像
    
          cp  在容器和本机之间拷贝文件
    
          kill 杀死容器
    
          logs 查看容器输出
    
         diff 检查容器文件变化
    
          exec 在容器上执行命令
    
         inspect 容器详情
    
          top 查看容器运行进程
    
          prune 移除所有暂停的容器
    
          export 导出容器文件系统为压缩包

    docker container run 常用参数-d 后台运行

    --rm  一次性容器
    --it  指定镜像
    -p  端口映射 8080:80
    -name 容器名
    --volume 文件映射
    --env USERNMAE=root 设置容器环境变量
    --link wordpress-mysql:mysql 连接其他容器
    --ite 交互式状态
    image:tag

    /etc/bash

     https://www.jb51.net/article/154031.htm

    docker image 

        build 构建一个镜像
        history 查看镜像历史
        import 导入创建镜像
        inspect 查看镜像详情
        load 从压缩包或者标准输入中加载镜像
        ls 查看所有镜像
        prune 移除未使用的镜像
        pull 拉取个人镜像
        push 推送个人镜像
        rm 删除镜像
        save 保存镜像到压缩包
        tag 为镜像打标签

    编写 Dockerfile 文件

    .dockerignore

    .git
    node_modules
    npm-debug.log

    不打包进入 image 的文件

    Dockerfile

    FROM node:8.4
    COPY . /app
    WORKDIR /app
    RUN npm install --registry=https://registry.npm.taobao.org
    EXPOSE 3000
    • ROM node:8.4:该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node。
    • COPY . /app:将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。
    • WORKDIR /app:指定接下来的工作路径为/app
    • RUN npm install:在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
    • EXPOSE 3000:将容器 3000 端口暴露出来, 允许外部连接这个端口。
    docker image build -t koa-demo .


    10.5 发布 image 文件

    容器运行成功后,就确认了 image 文件的有效性。这时,我们就可以考虑把 image 文件分享到网上,让其他人使用。

    首先,去 hub.docker.com 或 cloud.docker.com 注册一个账户。然后,用下面的命令登录。

    
    $ docker login
    

    接着,为本地的 image 标注用户名和版本。

    
    $ docker image tag [imageName] [username]/[repository]:[tag]
    # 实例
    $ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1
    

    也可以不标注用户名,重新构建一下 image 文件。

    
    $ docker image build -t [username]/[repository]:[tag] .
    

    最后,发布 image 文件。

    
    $ docker image push [username]/[repository]:[tag]
    

    发布成功以后,登录 hub.docker.com,就可以看到已经发布的 image 文件。

    (1)docker container start

    前面的docker container run命令是新建容器,每运行一次,就会新建一个容器。同样的命令运行两次,就会生成两个一模一样的容器文件。如果希望重复使用容器,就要使用docker container start命令,它用来启动已经生成、已经停止运行的容器文件。

    
    $ docker container start [containerID]
    

    (2)docker container stop

    前面的docker container kill命令终止容器运行,相当于向容器里面的主进程发出 SIGKILL 信号。而docker container stop命令也是用来终止容器运行,相当于向容器里面的主进程发出 SIGTERM 信号,然后过一段时间再发出 SIGKILL 信号。

    
    $ bash container stop [containerID]
    

    这两个信号的差别是,应用程序收到 SIGTERM 信号以后,可以自行进行收尾清理工作,但也可以不理会这个信号。如果收到 SIGKILL 信号,就会强行立即终止,那些正在进行中的操作会全部丢失。

    (3)docker container logs

    docker container logs命令用来查看 docker 容器的输出,即容器里面 Shell 的标准输出。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令查看输出。

    
    $ docker container logs [containerID]
    

    (4)docker container exec

    docker container exec命令用于进入一个正在运行的 docker 容器。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了。

    
    $ docker container exec -it [containerID] /bin/bash
    

    (5)docker container cp

    docker container cp命令用于从正在运行的 Docker 容器里面,将文件拷贝到本机。下面是拷贝到当前目录的写法。

    
    $ docker container cp [containID]:[/path/to/file] .


    4.2 Docker Compose 的安装

    Mac 和 Windows 在安装 docker 的时候,会一起安装 docker compose。Linux 系统下的安装参考官方文档

    安装完成后,运行下面的命令。

    
    $ docker-compose --version
    

    4.3 WordPress 示例

    docker-demo目录下,新建docker-compose.yml文件,写入下面的内容。

    
    mysql:
        image: mysql:5.7
        environment:
         - MYSQL_ROOT_PASSWORD=123456
         - MYSQL_DATABASE=wordpress
    web:
        image: wordpress
        links:
         - mysql
        environment:
         - WORDPRESS_DB_PASSWORD=123456
        ports:
         - "127.0.0.3:8080:80"
        working_dir: /var/www/html
        volumes:
         - wordpress:/var/www/html
    

    上面代码中,两个顶层标签表示有两个容器mysqlweb。每个容器的具体设置,前面都已经讲解过了,还是挺容易理解的。

    启动两个容器。

    
    $ docker-compose up
    

    浏览器访问 http://127.0.0.3:8080,应该就能看到 WordPress 的安装界面。

    现在关闭两个容器。

    
    $ docker-compose stop
    

    关闭以后,这两个容器文件还是存在的,写在里面的数据不会丢失。下次启动的时候,还可以复用。下面的命令可以把这两个容器文件删除(容器必须已经停止运行)。

    
    $ docker-compose rm
     
  • 相关阅读:
    第一章计算机基础
    补充:bytes类型以及字符编码转换
    python内存相关以及深浅拷贝讲解
    python之路day15--内置函数
    python之路day14--嵌套函数、匿名函数、高阶函数。函数的递归
    python之路day13--迭代器
    python之路day14--列表生成式、生成器generator、生成器并行
    spark MLlib DataType ML中的数据类型
    spark actions 算子
    spark Transformations算子
  • 原文地址:https://www.cnblogs.com/demonxian3/p/10975009.html
Copyright © 2020-2023  润新知