美文网首页
Mac环境Docker入门实践

Mac环境Docker入门实践

作者: gregocean | 来源:发表于2019-04-21 23:36 被阅读0次

    这本gitbook,全面实用,很多步骤在这里头说明得比较详细
    https://github.com/yeasy/docker_practice

    Docker指令与状态转换.png

    基本概念理解

    http://dockone.io/article/101

    三个组件分别是:
    Docker Client是用户界面,它支持用户与Docker Daemon之间通信。
    Docker Daemon运行于主机上,处理服务请求。
    Docker Index是中央registry,支持拥有公有与私有访问权限的Docker容器镜像的备份。
    三个基本要素分别是:
    Docker Containers负责应用程序的运行,包括操作系统、用户添加的文件以及元数据。
    Docker Images是一个只读模板,用来运行Docker容器。
    DockerFile是文件指令集,用来说明如何自动创建Docker镜像。

    HowTheyInteract.png

    个人理解:

    Docker 虚拟机 OOP
    镜像 虚拟机镜像
    容器 VM 实例

    具体步骤记录

    安装与配置

    1. 安装Docker,即DockerClient
      https://download.docker.com/mac/stable/Docker.dmg
    2. 正常安装看到应用显示Docker is running后进入命令行验证
    ocean-mac:~ gregocean$ docker --version
    Docker version 18.09.2, build 6247962
    
    1. 配置镜像加速
      使用阿里云(公司给的账号,没有账号可以使用其他加速器,gitbook中有),找到镜像加速器,拷贝地址。
      进入应用preferences->daemon->Registry Mirror填入加速地址,Apply&Restart
      检查是否生效
    docker info | grep -A 1 "Registry Mirrors"
    
    1. 下载、操作镜像
      进入https://hub.docker.com
      搜索nginx
      在右上角拷贝指令docker pull nginx
      目前还没有参数指定下载的本地地址,真实本地地址与原理见该博客:
      https://www.cnblogs.com/cag2050/p/10100899.html
    docker image ls //查看已下载的镜像
    docker system df //列出镜像、容器等空间信息
    docker image rm <image_ID/image_Name> //删除镜像
    

    Container容器

    1. 操作container
    docker run -d -p 8000:80 --name webserver nginx // 启动镜像nginx的容器
    // webserver是容器NAME
    // -d 是daemon
    // -p 是本机端口映射到容器端口
    

    在浏览器localhost:8000就能看到nginx页面了。

    ocean-mac:~ gregocean$ docker ps //查看当前运行container
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
    a68825a364d9        nginx               "nginx -g 'daemon of…"   39 minutes ago      Up 39 minutes       0.0.0.0:80->80/tcp   webserver
    ocean-mac:~ gregocean$ docker stop webserver //停止容器运行
    webserver
    

    停止后想继续启动Container,报错

    ocean-mac:~ gregocean$ docker run -d -p 8000:80 --name webserver nginx
    docker: Error response from daemon: Conflict. The container name "/webserver" is already in use by container "00d9e4a4811c9ada86d638fe13165fcd03bf2b28f7274462def7668488d8ec9a". You have to remove (or rename) that container to be able to reuse that name.
    

    需要使用

    ocean-mac:~ gregocean$ docker ps -a // -a :显示所有的容器,包括未运行的。
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS               NAMES
    00d9e4a4811c        nginx               "nginx -g 'daemon of…"   4 hours ago         Exited (0) 4 hours ago                       webserver
    

    所以是命名冲突了,关于Docker的命名空间,可以看:https://www.cnblogs.com/ohgenlong/articles/8595878.html

    docker  rm webserver  //   删除此容器
    

    使用上述指令后可以重新启动Container,但问题是如何重启我stop后容器而不用删除呢,如图所示,不用rm,就能让stop状态的container变为running:docker start webserver

    1. 进入容器
    ocean-mac:~ gregocean$ docker exec -it webserver /bin/bash  # 以bash方式进入
    root@00d9e4a4811c:/# cat /etc/os-release
    PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
    NAME="Debian GNU/Linux"
    VERSION_ID="9"
    VERSION="9 (stretch)"
    ID=debian
    HOME_URL="https://www.debian.org/"
    SUPPORT_URL="https://www.debian.org/support"
    BUG_REPORT_URL="https://bugs.debian.org/"
    

    之后可以实验各种环境操作,模拟之后要在Dockerfile中进行的指令集,操作完exit退出。

    Dockerfile与镜像构建

    这里以一个Django项目为例(因为要部署的项目就是Django的)

    django-admin startproject docker_django_example // 新建Django项目
    cd docker_django_example
    vim Dockerfile // 编写Dockerfile
    

    基于各路资料编写Dockerfile,比如如何编写最佳Dockerfile

    FROM centos:6.8   
    LABEL maintainer "wangyang4@100tal.com"
    WORKDIR /usr/local/src
    COPY . /usr/local/src
    
    RUN yum -y update && \
        yum -y install centos-release-scl && yum clean all && \
        yum -y install python27 && yum clean all && \
        scl enable python27 bash && \
        yum -y install epel-release && yum clean all && \
        yum -y install python-pip && yum clean all && \
        pip install -r requirements.txt --index-url=http://pypi.douban.com/simple --trusted-host=pypi.douban.com
    
    CMD ["python", "/usr/local/src/manage.py", "runserver", "0.0.0.0:8080"]
    EXPOSE 8080
    

    这里主要是把代码拷贝进WORKDIR、安装python与pip、再用pip装依赖包、最后是启动指令。

    docker build -t docker_django_example . // 构建镜像
    // 启动,就能在localhost看到django页面了
    docker run -it -p 80:8080  --name django_example docker_django_example 
    

    Docker Registry操作

    1. 使用官方容器运行本地Registrydocker run -d -p 5000:5000 registry
    2. 使用tag标记该镜像docker tag docker_django_example 127.0.0.1:5000/myimage/docker_django_example:v1
    3. 推送本地镜像到本地仓库docker push 127.0.0.1:5000/myimage/docker_django_example
    4. 查看本地仓库的镜像列表
    > curl 127.0.0.1:5000/v2/_catalog
    {"repositories":["myimage/docker_django_example"]}
    

    5.删除本地镜像然后从Registry下载

    ocean-mac:docker_django_example gregocean$ docker rmi 8504b1971760
    Error response from daemon: conflict: unable to delete 8504b1971760 (must be forced) - image is referenced in multiple repositories
    

    仔细观察发现这俩的ImageID竟然一样

    ocean-mac:docker_django_example gregocean$ docker image ls
    REPOSITORY                                     TAG                 IMAGE ID            CREATED             SIZE
    127.0.0.1:5000/myimage/docker_django_example   v1                  8504b1971760        14 hours ago        588MB
    docker_django_example                          latest              8504b1971760        14 hours ago        588MB
    

    可以使用REPOSITORY:TAG进行删除,然后再下载

    ocean-mac:docker_django_example gregocean$ docker rmi 127.0.0.1:5000/myimage/docker_django_example:v1
    Untagged: 127.0.0.1:5000/myimage/docker_django_example:v1
    Untagged: 127.0.0.1:5000/myimage/docker_django_example@sha256:358f10c97bad61b6ed1b4b3f8999b7a1fa45c510a23f3722a79d3c37424b1b04
    // 从Repository下载镜像
    ocean-mac:docker_django_example gregocean$ docker pull 127.0.0.1:5000/myimage/docker_django_example:v1
    v1: Pulling from myimage/docker_django_example
    Digest: sha256:358f10c97bad61b6ed1b4b3f8999b7a1fa45c510a23f3722a79d3c37424b1b04
    Status: Downloaded newer image for 127.0.0.1:5000/myimage/docker_django_example:v1
    

    Docker Compose

    “Compose默认管理对象是项目”,定位是“定义和运行多个Docker容器的应用”。
    两个重要概念:

    1. 服务(Service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。(个人理解是n个同镜像的容器集合组成一个实际可用的服务)。
    2. 项目(project):由一组关联的应用容器组成的一个完整业务单元,使用docker-compose.yml文件定义。

    从技术角度讲,你可以在 Docker 容器中运行多个进程。你可以将数据库,前端,后端,ssh,supervisor 都运行在同一个 Docker 容器中。但是,这会让你非常痛苦:

    • 非常长的构建时间(修改前端之后,整个后端也需要重新构建)
    • 非常大的镜像大小
    • 多个应用的日志难以处理(不能直接使用 stdout,否则多个应用的日志会混合到一起)
    • 横向扩展时非常浪费资源(不同的应用需要运行的容器数并不相同)
    • 僵尸进程问题 - 你需要选择合适的 init 进程
      因此,我建议大家为每个应用构建单独的 Docker 镜像,然后使用 Docker Compose 运行多个 Docker 容器。

    mac下安装好docker可以直接使用Compose:docker-compose --version

    To Be Continued.

    相关文章

      网友评论

          本文标题:Mac环境Docker入门实践

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