docker

作者: 木子李_af14 | 来源:发表于2018-06-06 10:00 被阅读33次

    以下内容总结自《第一本Docker书》,作者:[澳]James Turnbull

    mac 下载docker.app

    docker-for-mac https://docs.docker.com/docker-for-mac/#where-to-go-next
    有些书籍可能会推荐下载docker toolbox,较新版的mac系统可以下载docker-for-mac,两者底层的依赖不一样。docker toolbox还是依赖的Oracle VirtualBox,而docker-for-mac是基于HyperKit。
    官网教程:https://docs.docker.com/docker-for-mac/install/
    进去之后,一键下载。

    docker.app下载

    照着教程安装一下,就可以执行下面命令尝试一下。

    简单命令记录

    $ docker --version
    Docker version 18.03, build c97c6d6
    
    $ docker-compose --version
    docker-compose version 1.21.2, build 8dd22a9
    
    $ docker-machine --version
    docker-machine version 0.14.0, build 9ba6da9
    
    # 查看已启动的docker镜像
    $ docker container ls
    $ docker ps 
    
    # 查看已启动的 或 已关闭的 所有镜像
    $ docker ps -a
    $ docker container ls -a
    
    # 查看已安装的镜像
    $ docker image ls
    # 删除已安装的镜像
    $ docker image rm nginx
    
    # 从仓库拉取fedora镜像(在冒号后面指定标签,可拉取固定的景象,默认是拉最新的)
    $ docker pull fedora:20
    # 查找镜像
    $ docker search fedora
    
    # 删除容器
    $ docker container rm container_name
    $ docker rm container_name
    
    # 查看容器内的进程(container_name是容器名字)
    $ docker top container_name
    
    # 查看容器统计信息(下图)
    $ docker stats container_name
    
    # 查看容器更多的信息
    $ docker inspect container_name
    # 查看容器的IP地址(--format或-f 支持go语言模板的语法)
    $ docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name
    
    容器统计信息

    解决docker中Linux乱码的问题

    保存立即生效

    # 进入乱码的操作员的home目录
    cd ~
    
    # 编辑 .vimrc 文件,如果没有则新建
    vi .vimrc
    
    #设置tab分隔符为4个空格
    set tabstop=4
    
    #解决中文乱码的设置
    set termencoding=utf-8
    set encoding=prc
    

    镜像image和容器container的区别

    网上有很多比喻,这里摘几个来:

    • 一个镜像可以用于多个容器。一个镜像就像中间件,可以被多个容器同时使用。
    • A container is a stripped-to-basics version of a Linux operating system. An image is software you load into a container。
      容器就像是基础版的Linux操作系统,镜像就是你下载在操作系统中的软件。

    镜像的实例化就是一个容器。
    比如说你有以下镜像
    jdk8的镜像:jdk8-image
    jdk7的镜像:jdk7-image
    git的镜像:git-image
    svn的镜像:svn
    maven3的镜像:mvn3-image

    当你准备好了这些镜像,如果你要搭建一个jdk7+git+mvn3的环境,你只需要把你需要的镜像像搭积木一样搭建起来即可。
    而且还有一个好处是,减少了环境带来的问题。咱们开发很容易碰到这样的场景:这代码在我那边明明运行的好好地。这也是在书中最早就提到的,docker诞生的原因之一。

    docker container/image ps/ls 区别

    • 查看运行中的容器docker container lsdocker ps
      目前使用起来两者完全一样,docker container ls是后期加入到,加入了container显得更人性化一些,是在针对容器进行到操作。

    • 查看所有容器docker container ls -adocker ps -adocker container ps -a
      这行命令会展示正在运行中的以及已经关闭(exit)的容器。

    • 查看所有镜像docker imagesdocker image ls
      展示所有镜像

    启动一个webserver

    # 利用启动一个web服务(第一次启动,会去docker hub下载这个镜像,可能需要等一下)
    $ docker run -d -p 80:80 nginx
    
    # 指定名字启动nginx(否则docker会自动生成一个名字给你)
    $ docker run -d -p 80:80 --name webserver nginx
    
    # 根据镜像名字关闭镜像(也可通过镜像id)
    $ docker container stop webserver
    
    # 删除容器(镜像关闭之后,容器还是存在的,这个命令可以删除容器)
    $ docker container rm webserver
    

    启动成功后,地址栏访问localhost:80即可,展示如下:

    webserver

    删除所有容器

    docker rm `docker ps -a -q`
    
    删除所有容器

    提交一个自己的容器(@deprecate)

    目前docker团队,已经不建议使用commit创建镜像了,这里的记录只供学习,推荐使用Dockerfile
    比如说需要给团队提供一个统一的镜像文件,这里假设说提供一个装有统一版本Apache2的Ubuntu系统镜像。
    那我们就可以从docker仓库先拉一个下来,然后以交互的形式doker run -i -t ubuntu /bin/bash启动镜像,然后apt-get -y install apache2安装Apache2 。
    到这一步,我们需要的镜像就已经完成了,剩下的commit和push,和git的版本控制是大同小异。

    # 启动Ubuntu镜像
    # -i 开启容易中的STDIN,保证持久的标准输入。-t 表示为创建的容器分配一个伪tty终端
    # 这样新创建的容器才能提供一个交互式shell
    $ docker run -i -t ubuntu /bin/bash
    
    # 安装Apache2(安装完成后,退出即可)
    $ apt-get -y install apache2
    
    # 如果需要push到docker仓库的话,需要先登录
    # 登录docker(在docker官网注册,需要翻墙)
    $ docker login
    
    # 查找制定的容器的ID
    $ docker ps -l
    
    # 提交制定的容器(同时会创建一个新的镜像,名字为anthony/ubuntu)
    $ docker commit 89dde2ef6166 anthonyxu/ubuntu
    
    # push到远程docker仓库
    $ docker push anthonyxu/ubuntu
    
    登录成功 查看制定的容器ID 将镜像推送到docker仓库

    使用Dockerfile构建镜像

    1. 首先准备一个Dockerfile文件,该文件里面包含了一系列用于构建镜像的指令。
    2. 执行docker build -t="仓库名/镜像名" .构建镜像
    # 创建一个目录,并新建一个Dockerfile文件
    $ mkdir dockers
    $ cd dockers
    $ touch Dockerfile
    
    # 编辑Dockerfile文件
    $ vim Dockerfile
    
    # 构建新的镜像,也可以用-f,指定构建源文件路径 -f xxx/xxx/xxx
    docker build -t="anthonyxu/static_web" .
    

    Dokerfile文件内容:

    # Dockerfile笔记
    # Dockerfile是由一系列指令和参数组成,每条指令,都必须全都大写。
    # 每条指令,都会创建一个新的镜像层并对镜像进行提交
    # 第一条指令必须是FROM
    
    # 下面是版本注释
    # Version: 0.0.1
    
    # FROM指令:指定一个已经存在对镜像,后面指令都是基于该镜像进行对,这个镜像被称为基础镜像
    FROM ubuntu:latest
    
    # MAINTAINER 作者 邮箱
    MAINTAINER anthonyXu "xxx@xxx.com"
    
    # RUN指令,会在当前镜像中运行指定命令
    RUN apt-get update && apt-get install -y nginx
    RUN echo 'Hi, i am in your container ' > /usr/share/nginx/html/index.html
    
    # EXPOSE指令,告诉docker,该容器内对应用程序将会使用容器对指定端口。
    # 出于安全考虑,docker不会自动打开该端口。
    # 需要用户在run的时候,指定需要打开的端口,所以这里EXPOSE指令,可以指定多个端口。
    EXPOSE 80
    

    docker build日志:

    admin@anthony:~/dockers$  docker build -t="anthonyxu/static_web" .
    Sending build context to Docker daemon   2.56kB
    Step 1/5 : FROM ubuntu:latest
     ---> 452a96d81c30
    Step 2/5 : MAINTAINER anthonyXu "xxx@xxx.com"
     ---> Running in b1dfca10ec1d
    Removing intermediate container b1dfca10ec1d
     ---> 2990b0f6086d
    Step 3/5 : RUN apt-get update && apt-get install -y nginx
     ---> Running in b56d0fcd7876
    
    此处省略。。。。。。。。
    
     ---> b251410f1071
    Step 4/5 : RUN echo 'Hi, i am in your container ' > /usr/share/nginx/html/index.html
     ---> Running in 54ad9e8e6f06
    Removing intermediate container 54ad9e8e6f06
     ---> b8bfae7c5388
    Step 5/5 : EXPOSE 80
     ---> Running in 8c8981c63be7
    Removing intermediate container 8c8981c63be7
     ---> b95a17d5f7be
    Successfully built b95a17d5f7be
    Successfully tagged anthonyxu/static_web:latest
    

    如何跳过docker缓存:docker build的过程中,每一步的构建过程都会将结果提交为镜像。它会将之前的镜像层看作缓存。如果Dockerfile中的有1-5条指令,修改了第4条指令,需要再次构建时,docker会跳过1-3条指令,直接从第4条开始;但如果第1-3条指令有修改,当重新构建时,还是会从第1条开始执行。另外,如果不想使用docker的缓存,可以使用命令:docker build --no-cache -t="xxx/xx"

    1. 从新镜像启动该容器
      启动镜像还是以docker run命令,-d选项告诉docker以分离(detached)的方式在后台运行,这比较适合运行类似nginx守护进程这样的需要长时间运行的进程。 -p选项控制docker在运行时应该公开哪些端口给外部宿主机(会在宿主机上随机打开一个端口(32768~61000之间))这个端口会映射到容器的80端口。
      docker ps可以查看端口映射,如下所见0.0.0.0:32768->80/tcp,容器的80端口被映射到了宿主机的32768端口上。
    admin@anthony:~/conf/zdal$  docker run -d -p 80 --name static_web anthonyxu/static_web nginx -g "daemon off;"
    473b9f061142c510ed8974fe0cc0487bc9b969a996e4536c8a55b5acacdfe434
    
    admin@anthony:~/conf/zdal$  docker ps
    CONTAINER ID        IMAGE                  COMMAND                  CREATED              STATUS              PORTS                   NAMES
    473b9f061142        anthonyxu/static_web   "nginx -g 'daemon of…"   About a minute ago   Up About a minute   0.0.0.0:32768->80/tcp   static_web
    

    如何绑定到宿主机哪个端口:通过-p选项,如docker run -d -p 8080:80 后面省略,这条命令会将容器中到80端口绑定到宿主机到8080端口。重点!因为宿主机8080端口被占用,那在宿主机上运行到服务将无法绑定8080端口,另外的容器也无法绑定8080端口。
    如何绑定到特定网络接口:命令docker run -d -p 127:0:0:1:8080:80 省略后面
    如何绑定到随机端口:命令docker run -d -p 127:0:0:1::80 省略后面

    1. 访问nginx页面
      浏览器中直接访问http://localhost:80或者http://localhost:32768

    将构建完成到镜像推送到Docker hub

    当镜像构建完成后,可以将它上传到Docker hub,这样其他人就可以使用该镜像。
    推送命令:docker push static_web anthonyxu/static_web其中anthonyxu是用户名,static_web是仓库名,推送成功后,可以登录https://hub.docker.com/查看。

    admin@anthony:~/dockers$  docker push anthonyxu/static_web
    The push refers to repository [docker.io/anthonyxu/static_web]
    d33a335f1738: Pushed
    f945ea2bd62f: Pushed
    059ad60bcacf: Mounted from anthonyxu/ubuntu
    8db5f072feec: Mounted from anthonyxu/ubuntu
    67885e448177: Mounted from anthonyxu/ubuntu
    ec75999a0cb1: Mounted from anthonyxu/ubuntu
    65bdd50ee76a: Mounted from anthonyxu/ubuntu
    latest: digest: sha256:fab3b575457c17098f476fd9cbb44e753608ddeb9461c2820d2b5559c17fdb50 size: 1776
    
    docker仓库上的镜像

    相关文章

      网友评论

          本文标题:docker

          本文链接:https://www.haomeiwen.com/subject/ufnvsftx.html