Docker 教程

Docker 基本概念

  • 镜像(Image):Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

  • 仓库(Repository):仓库(Repository)类似Git的远程仓库,集中存放镜像文件。

Docker 服务命令

docker version 查看Docker版本信息
docker -v 查看docker简要信息
systemctl start docker 启动Docker
systemctl stop docker 关闭docker
systemctl enable docker 设置开机启动
service docker restart 重启docker服务
service docker stop 关闭docker服务

Docker 镜像命令

docker脑图

Docker Hub等镜像仓库上有大量的高质量的镜像可以用,可以从仓库获取镜像

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

docker search *** 查找镜像
docker pull *** 获取镜像
docker images / docker image ls 显示所有镜像
docker rmi <镜像ID> 删除镜像
docker commit -m=”*” -a=”aa” e218e aa/ubuntu:v2 提交e218e这个容器为 aa 作者的镜像

Docker 容器命令

docker run -dit ubuntu /bin/bash 以后台,交互,终端方式使用镜像启动容器。
docker ps -a 显示所有容器
docker container ls -a 显示所有容器, -a 显示所有容器
docker start ** 启动一个已停止的容器
docker stop/restart *** 停止/重启容器
docker rm -f ***/删除容器,-f 可以删除运行中的容器  
docker attach 243c 进入243c容器,退出关闭容器
docker exec -i 69d1 bash 交互式进入69d1容器,退出不关闭
docker export *** > ubunt.tar 导出容器***为ubuntu.tar
docker import - test/ubuntu:v1 将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1
docker port *** 查看容器的端口
docker logs -f *** 查看容器的内部标准输出
docker top *** 查看容器进程

Docker run 命令

-d 后台运行容器并返回容器ID
-i 以交互模式运行容器,通常与 -t 同时使用;
-P 随机端口映射,容器内部端口随机映射到主机的端口
-p 指定端口映射,格式为:主机(宿主)端口:容器端口
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name=”nginx-lb” 为容器指定一个名称;
--dns 8.8.8.8 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com 指定容器DNS搜索域名,默认和宿主一致;
-h “mars” 指定容器的hostname;
-e username=”ritchie” 设置环境变量;
--env-file=[] 从指定文件读入环境变量;
--cpuset=”0-2” or --cpuset=”0,1,2” 绑定容器到指定CPU运行;
-m 设置容器使用内存最大值;
--net=”bridge” 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[] 添加链接到另一个容器;
--expose=[] 开放一个端口或一组端口;
--volume , -v 绑定一个卷

Docker run 实例

  • 使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。

      docker run --name mynginx -d nginx:latest
    
  • 使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。

      docker run -P -d nginx:latest
    
  • 使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。

      docker run -p 80:80 -v /data:/data -d nginx:latest
    
  • 绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。

      docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
    
  • 使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。

      runoob@runoob:~$ docker run -it nginx:latest /bin/bash
      root@b8573233d675:/# 
    

使用 Dockerfile 定制镜像

  • FROM 指定基础镜像

    所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM 就是指定 基础镜像

  • RUN 执行命令

    • shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。

        RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
      
    • exec 格式:RUN [“可执行文件”, “参数1”, “参数2”]

        FROM debian:stretch
      
        RUN set -x; buildDeps='gcc libc6-dev make wget' \
        && apt-get update \
        && apt-get install -y $buildDeps \
        && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
        && mkdir -p /usr/src/redis \
        && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
        && make -C /usr/src/redis \
        && make -C /usr/src/redis install \
        && rm -rf /var/lib/apt/lists/* \
        && rm redis.tar.gz \
        && rm -r /usr/src/redis \
        && apt-get purge -y --auto-remove $buildDeps
      
    • 构建镜像

      在 Dockerfile 文件所在目录执行

        docker build -t nginx:v3 . 
      
    • 镜像构建上下文(Context)

      . 表示当前目录,而 Dockerfile 就在当前目录,当我们进行镜像构建的时候,并非所有定制都会通过 RUN 指令完成,经常会需要将一些本地文件复制进镜像,比如通过 COPY 指令、ADD 指令等。而 docker build 命令构建镜像,其实并非在本地构建,而是在服务端,也就是 Docker 引擎中构建的。那么在这种客户端/服务端的架构中,如何才能让服务端获得本地文件呢

      这就引入了上下文的概念。当构建的时候,用户会指定构建镜像上下文的路径,docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。