zoukankan      html  css  js  c++  java
  • Docker

    Docker 是什么?

    Docker 是一种虚拟化的容器,隔离了文件系统、网络互联和进程等等,但比之传统的虚拟化技术,精简了内核和硬件的虚拟,容器内的应用进程直接运行在宿主内核。

    安装

    macOS

    (1)Homebrew 安装

    > brew cask install docker
    

    (2)下载安装

    Docker.dmg 下载

    Ubuntu 16+

    (1)测试环境使用一键自动安装脚本

    > curl -fsSL get.docker.com -o get-docker.sh
    > sudo sh get-docker.sh --mirror Aliyun
    

    (2)按部就班安装

    # 添加使用 HTTPS 传输的软件包以及 CA 证书
    > sudo apt-get update
    > sudo apt-get install 
        apt-transport-https 
        ca-certificates 
        curl 
        software-properties-common
        
    # 添加软件源的 GPG 密钥
    > curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    
    # 向 source.list 中添加 Docker 软件源
    > sudo add-apt-repository 
        "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu 
        $(lsb_release -cs) 
        stable"
    # 安装 docker-ce
    > sudo apt-get update
    > sudo apt-get install docker-ce
    

    Amazon Linux

    参考:Amazon ECS 的 Docker 基本知识

    # 更新实例上已安装的程序包和程序包缓存
    sudo yum update -y
    # 安装最新的 Docker Community Edition 程序包
    sudo yum install -y docker
    # 启动 Docker 服务
    sudo service docker start
    # 将 ec2-user 添加到 docker 组,以便您能够执行 Docker 命令,而无需使用 sudo
    sudo usermod -a -G docker ec2-user
    # 重新登录
    # 验证 ec2-user 是否能在没有 sudo 的情况下运行 Docker 命令
    docker info
    

    检查安装情况

    > docker --version
    > docker-compose --version
    > docker-machine --version
    

    使用镜像加速器

    鉴于国内的网络情况,拉取镜像会很慢,这时候需要配置镜像加速器,使用国内的镜像服务器。

    国内的镜像服务器地址https://registry.docker-cn.com

    配置方式:对于使用 Docker 客户端的用户,依次点击 Docker 图标 --> Settings/ Perferences --> Daemon --> Registry mirrors,输入加速器地址,然后点击 Apply & Restart 即可。

    检查配置是否生效:执行 docker info 查看 Registry Mirrors 字段的值。

    启动和停止

    Mac

    跟启动普通软件的方式一样。

    Ubuntu 16+

    > sudo systemctl enable docker
    > sudo systemctl start docker
    

    快速开始:启动一个 Nginx 服务器

    (1)安装并启动一个 Nginx 服务器,将本地的 8080 端口映射到 Docker 的 80 端口。

    > docker run -d -p 8080:80 --name webserver nginx
    

    (2)通过 docker ps 查看运行中的 docker 容器列表。

    (3) curl http://localhost:8080

    (4)停止 Nginx 服务器

    > docker stop webserver
    

    (4)从 Docker 中删除 Nginx 服务器

    > docker rm webserver
    

    基本概念

    镜像(Image)

    虚拟概念,并非一个 ISO 的压缩文件,而是使用 Union FS 分层存储技术存储的多层文件系统联合组成,存放的是 root 文件系统,包括容器运行时所需的程序、库、资源、配置等文件,但不包含动态数据。

    容器(Container)

    容器是镜像运行时的实体,实质就是一个个的 Docker 进程,可以对 Docker 进程进行如下操作:

    • 创建
    • 启动
    • 停止
    • 删除
    • 暂停

    容器也采用分层存储(最多有127层),容器运行时,以镜像为基础层,在其上创建一个当前容器的存储层,称之为容器存储层。容器存储层的生命周期与容器同步,故不应向存储层写入任何数据,所有的文件写入操作,都应使用数据卷(Volume)或者绑定宿主目录

    Registry

    用来集中存储和分发 Docker 镜像的服务,一个 Registry 可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag),每个标签对应一个镜像。

    常用的 Public Registry 列表:

    1. Docker Hub
    2. Quay.io
    3. Google Container Registry
    4. 网易云镜像服务
    5. DaoCloud 镜像市场
    6. 阿里云镜像库
    7. 时速云镜像仓库

    国内针对 Docker Hub 的镜像服务(加速器)有:

    1. 阿里云加速器
    2. DaoCloud 加速器

    命令

    镜像相关

    命令 功能
    docker images 列出所有拉取的镜像
    docker inspect [name] 检视镜像的详细信息
    docker rmi [REPOSITORY]:[TAG] 删除镜像
    docker pull [name] 拉取镜像
    首先在 https://hub.docker.com/?namespace=lshare 上注册并创建仓库
    docker login --username=username
    docker tag local-image:tagname reponame:tagname
    docker push reponame:tagname
    docker pull registry.hub.docker.com/lshare/hello:v1
    发布镜像

    容器相关

    命令 功能
    docker ps -a 列出所有容器及其状态
    docker ps 列出所有运行中的容器
    docker rm [容器 ID] 删除容器
    docker crate -it [镜像标签或镜像 ID] 新建一个容器
    docker start [容器 ID] 运行处于终止状态的容器
    docker kill [容器 ID] 强制终止容器
    docker kill [容器 ID] 停止容器
    docker restart [容器 ID] 重启一个容器
    docker logs [容器ID] 查看容器日志

    更进一步

    命令 功能
    docker exec -ti [容器ID] /bin/bash 进入具体容器中运行交互命令
    docker exec [容器 ID 或容器 name] 具体命令 直接执行具体容器的命令

    Dockerfile

    Dockerfile 用来定制镜像,是一组指令,描述如何在基础镜像中一步步构建自定义的镜像。下面以修改 nginx 服务器首页为例:

    (1)新建名为 Dockerfile 的文件,内容如下:

    FROM nginx
    RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
    

    (2)使用 docker build 开始构建

    # 确保在 Dockerfile 所在的目录下执行该命令,
    # 否则需要使用 `-f [file_name]` 指定 Dockerfile
    # 使用 `-t [name:tag]` 指定镜像的名称和标签
    docker build -t nginx:v3 .
    

    命令解析

    (1)FROM

    指定基础镜像。

    (2)RUN

    执行命令行命令,支持 shell 格式和 exec 格式。

    注意:Dockerfile 每个指令都会建立一层,Union FS 有最大层数限制。多个命令行指令可以使用 && 串联。

    Docker Compose

    Docker Compose 是 Docker 官方的开源项目之一,用来快速地部署分布式应用。官方定位是「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」。衍生概念有:

    1. 服务(Service), 一个 Docker 容器称之为一个服务;
    2. 项目(Project),一个 Compose,或者说一组相关联的服务,称之为一个项目 。

    安装

    Docker Compose 在 Docker 客户端中已经包含,可以直接使用。

    # 检查是否可用
    docker-compose --version
    

    快速开始

    (1)使用 Dockerfile 定义应用的环境;

    (2)使用 docker-compose.yml 定义组成应用的各项服务;

    (2)执行 docker-compose up 进行部署。

    排错

    Error: Cannot Start Container: stat /bin/sh: no such file or directory”

    (1)使用 docker inspect 检视镜像的 Cmd 选项;

    (2)如果 Cmd 中不包含 /bin/sh 那意味着可能被你重写了。

    permission denied while trying to connect to the Docker daemon socket

    (1)默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

    > sudo usermod -aG docker $USER
    

    接着重启 docker,并新开一个会话连接。

    (2)如果还是不行,那么只好使用 sudo 运行 docker 命令了。

    参考

    1. Docker -- 从入门到实践(绝佳的入门文档)
    2. docker-library/docs - Github (docker 官方镜像的使用文档)
  • 相关阅读:
    深入浅出 Java Concurrency (4): 原子操作 part 3 指令重排序与happens-before法则
    深入浅出 Java Concurrency (3): 原子操作 part 2
    深入浅出 Java Concurrency (2): 原子操作 part 1
    深入浅出 Java Concurrency (1) : J.U.C的整体认识
    java中关键字volatile的作用
    教你如何迅速秒杀掉:99%的海量数据处理面试题(转)
    STL容器介绍(转)
    IoC框架
    LeetCode 548. Split Array with Equal Sum (分割数组使得子数组的和都相同)$
    LeetCode 533. Lonely Pixel II (孤独的像素之二) $
  • 原文地址:https://www.cnblogs.com/lshare/p/11334719.html
Copyright © 2011-2022 走看看