0%

Docker 基本用法

什么是 Docker?

Docker 是以 Docker 容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员设计的,用于构建、发布和运行分布式应用的平台。它是一个跨平台、可移植并且简单易用的容器解决方案。

Docker 的源代码托管在 GitHub 上,基于 Go 语言开发并遵从 Apache 2.0 协议。

Docker 可在容器内部快速自动化地部署应用,并通过操作系统内核技术(namespaces、groups 等)为容器提供资源隔离与安全保障。

容器技术的优点

image

在 Ubuntu 系统中安装 Docker

更新系统,并安装必要的软件包 https 及 ca:

$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates

添加 GPG 密钥…

更新软件源,安装 docker:

$ sudo apt-get update
$ sudo apt-get -y upgrade

$ sudo apt-get install docker
$ sudo apt install docker.io
$ sudo apt install docker-compose

开启 Docker 服务:

$ sudo service docker start

重启 Docker 服务:

$ sudo service docker restart

关于 root 权限

docker 命令的执行一般都需要获取 root 权限,因为 Docker 的命令行工具 docker 与 docker daemon 是同一个二进制文件,而 Docker daemon 负责接收并执行来自 docker 的命令,它的运行需要 root 权限。同时,从 Docker 0.5.2 版本开始,Docker daemon 默认绑定一个 Unix Socket 来代替原有的 TCP 端口,该 Unix Socket 默认是属于 root 用户的。因此,在执行 docker 命令时,需要使用 sudo 来获取 root 权限。

Manage Docker as a non-root user

为了避免每次命令都输入 sudo,可以把用户加入 Docker 用户组:

  1. 创建 Docker 用户组:

    $ sudo groupadd docker
  2. 添加用户到 docker 组:

    $ sudo usermod -aG docker $USER

使用阿里云镜像加速器

阿里云 ➡️ 管理控制台 ➡️ 容器镜像服务 ➡️ 镜像加速器

l

Docker 子命令分类

子命令分类 子命令
Docker 环境信息 info、version
容器生命周期管理 create、exec、kill、start、restart、pause、unpause、rm、run、stop
镜像仓库管理 login、logout、pull、push、search
镜像管理 build、images、import、load、rmi、save、tag、commit
容器运维操作 attach、export、inspect、port、ps、rename、stats、top、wait、cp、diff、update
容器资源管理 volume、network
日系日志信息 events、history、logs

查看子命令详细用法:docker COMMAND –help

docker命令结构图

1. Docker 环境信息

## 检查 Docker 环境信息
$ sudo docker info

## 检查安装后的 Docker 版本
$ docker --version
$ docker -v
$ sudo docker version
Docker version 18.03.1-ce, build 9ee9f40

$ docker-compose --version
docker-compose version 1.21.1, build 5a3f1a3

$ docker-machine --version
docker-machine version 0.14.0, build 89b8332

2. 容器生命周期管理

  • docker run 命令

    docker run 命令用来基于特定的镜像创建一个容器,并依据选项来控制该容器。

    用法:docker run [OPTIONS] IMAGE [COMMAND][ARG...]

    <!–hexoPostRenderEscape:

    ## 从ubuntu镜像启动一个容器,并执行echo命令打印出“Hello World”。执行完echo命令后,容器将停止运行。
    $ docker run ubuntu echo "Hello World"

## 启动一个容器,并为它分配一个伪终端执行/bin/bash命令
## 进入伪终端后,exit/Ctrl+D即可退出,同时容器终止运行。
$ docker run -i -t –name mytest ubuntu:latest /bin/bash

# 以后台方式运行一个 Nginx 服务器
$ docker run -d -p 80:80 –rm –name mynginx nginx

## -d:以后台方式运行
## Ctrl+C:退出到宿主机并关闭容器;
## Ctrl+P/Ctrl+Q:退出到宿主机但保持容器运行
## Ctrl+P+Q:退出容器但不关闭容器

## –link name:alias:在两个容器之间建立联系
# 启动Redis容器,将从数据库连接到主数据库
$ docker run -it –name redis-master redis /bin/bash
$ docker run -it –name redis-slave1 –link redis-master:master redis /bin/bash
:hexoPostRenderEscape–>

  • -i

    使用交互模式,始终保持输入流开放。

  • -t

    分配一个伪终端,一般两个参数结合时使用 - it,即可在容器中利用打开的伪终端进行交互操作。

  • –name

    自定义容器名称,若无此选项,Docker 将为容器随机分配一个名字。

  • –rm

    容器停止运行后,自动删除容器文件。

  • -c

    给运行在容器中的所有进程分配 CPU 的 shares 值。

  • -m

    限制为容器中所有进程分配的内存总量,以 B、K、M、G 为单位。

  • -v

    挂载 volume。

  • -p

    映射端口 <host_port:contain_port>

  • –link

    通过–link 选项来建立容器间的连接,不但可以避免容器的 IP 和端口暴露到外网所导致的安全问题,还可以防止容器在重启后 IP 地址变化导致的访问失效,它的原理类似于 DNS 服务器的域名和地址映射。当容器的 IP 地址发生变化时,Docker 将自动维护映射关系中的 IP 地址。

  • docker start/stop/restart 命令

    <!–hexoPostRenderEscape:

    ## 尝试以后台方式运行一个 Nginx 服务器,并访问  http://localhost 验证
    $ docker run -d -p 80:80 --name webserver nginx

## 停止 Nginx 服务器
$ docker stop webserver
:hexoPostRenderEscape–>

3. Docker registry

官方镜像仓库:Docker Hub

  • docker pull 命令

    用法:docker pull [OPTIONS] NAME[:TAG]

    用法:docker pull username/repository<:tag_name>

    用法:docker pull registry.domain.com:5000/repos:<tag_name>

    # 从官方Hub拉取 nginx:latest 镜像
    $ docker pull nginx
  • docker push 命令

    $ docker push SEL/ubuntu
  • docker search 命令

    用法:docker search TEAM

    # 从官方镜像和所有个人公共镜像中搜索镜像
    $ docker search nginx

4. 镜像管理

  • docker images 命令

    <!–hexoPostRenderEscape:

    ## 默认列出最顶层的镜像
    $ docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    nginx latest 71c43202b8ac 13 days ago 109 MB
    hyperledger/fabric-ca 1.2.0 66cc132bd09c 2 months ago 252 MB

## 列出所有已下载镜像
$ docker images -a

## 显示完整的 IMAGE ID
$ docker images –no-trunc
:hexoPostRenderEscape–>

  • docker rmi 和 docker rm 命令

    <!–hexoPostRenderEscape:

    ## 删除所有镜像
    $ docker rmi $(docker images -a -q)

## 删除容器
$ docker rm webserver
webserver

## 容器操作
$ docker ps ## 列出所有运行中的容器
$ docker ps -a ## 列出所有容器
$ docker stop $(docker ps -a -q) ## 停止运行所有容器
$ docker rm $(docker ps -a -q) ## 删除所有容器
:hexoPostRenderEscape–>

5. 容器运维操作

  • docker attach 命令

    连接到正在运行的容器。

    用法:docker attach [OPTIONS] CONTAINER

    $ docker attach --sig-proxy=false CONTAINER

    💡

    attach 命令可以带上 --sig-proxy=false 来确保 CTRL-DCTRL-C 不会关闭容器。

  • docker inspect 命令

    查看镜像和容器的详细信息。

    用法:docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE...]

    <!–hexoPostRenderEscape:

    # 查看容器的内部IP
    $ docker inspect --format='{{.NetworkSettings.IPAddress}}' CONTAINER

# 通过 docker inspect 命令查看所挂载的volume情况
$ docker inspect –format=‘{{.Config.Volumes}}’ CONTAINER
$ docker inspect –format=‘{{.Mounts}}’ CONTAINER
$ docker inspect a9c9 | grep Mounts -A 10
:hexoPostRenderEscape–>

  • docker ps 命令

    查看容器的相关信息,默认只显示正在运行的容器的信息

    <!–hexoPostRenderEscape:

    $ docker ps     ## 列出所有运行中的容器
    $ docker ps -a ## 列出所有容器
    $ docker ps -l ## 查看最新创建的容器

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cc41e7a676a2 hyperledger/fabric-ca:1.2.0 “sh -c ‘fabric-ca-…” 12 days ago Up 12 days 0.0.0.0:7054->7054/tcp fabric-ca-server
:hexoPostRenderEscape–>

  • docker top 命令

    查看容器中正在进行的进程

    用法:docker top <container_id/container_name>

    # host上使用此命令可以看到类似的进程信息
    $ ps -ef | grep docker 
  • docker commit 命令

    将一个容器固化为一个新的镜像

    用法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

    💡

    官方建议通过 docker build 命令结合 Dockerfile 创建和管理镜像

  • events、history 和 logs 命令

    查看 Docker 的系统日志信息

    <!–hexoPostRenderEscape:

    ## 打印实时系统日志
    $ docker events [OPTIONS]

## 指定镜像的历史版本信息
$ docker history [OPTIONS] IMAGE

## 容器中进程的运行日志
$ docker logs [OPTIONS] CONTAINER
:hexoPostRenderEscape–>

参考

  • 极客学院 Wiki:Docker 入门基础教程
  • Gitbook:Docker —— 从入门到实践
  • DOCKER 从入门到实践
  • 官方文档:Docker docs
  • GitHub:moby
  • 拉开大变革序幕(上):在浪潮之巅观望 Docker
  • docker 化你的 java 应用(上)
  • docker 化你的 java 应用(下)
  • docker 专题 (2):docker 常用管理命令(上)
  • docker 专题 (2):docker 常用管理命令(下)
  • docker 常用命令详解
  • Docker 完全指南
  • Docker 容器可视化监控中心搭建
  • Spring Boot 应用监控实战

欢迎关注我的其它发布渠道