七的博客

Docker基本用法

工具

Docker基本用法

今年因为工作的原因,接触到了 Docker 这个容器化平台。 它极大的方便了我平时各种开发环境的配置以及安装,大大的缩短了在一些软件配置上的时间 。

为什么要使用 Docker ,先看看下面几个比较常见的痛点:

  • 环境配置困难: 比如之前在本地安装 Redis ,需要编译软件进行安装。 我本地是 Ubuntu 系统还好,有现成的编译环境直接编译源码即可。 但是如果是本地没有编译环境那就要安装好编译环境,这个过程就很需要时间。而且有时候因为国内网络不知名的原因,下载还可能巨慢。

  • 软件多版本共存问题: 有的软件可能直接从仓库里面可以直接安装,但是如果你需要同时共存多个版本怎么处理。 直接从仓库安装的软件往往无法共存,因为安装的时候不会让你配置端口号之类的。 就算是支持端口号指定,后期也会碰到各种各样奇奇怪怪的问题,比如服务混乱等等。

  • 临时性软件安装需求 :有时候跑一个 Github 上的项目,需要安装很多中间件。 但是等这个项目研究完后,这些软件很可能不再需要。这个时候就需要一个个找出来删除,有些软件还会在很多个目录写文件,找起来特别复杂。

虽然这些问题可以通过虚拟机来解决,比如可以将软件安装在一个虚拟机中,等使用完直接将虚拟机删除掉就可以。 也可以将不同版本的软件安装在多个虚拟机中,就可以隔离版本冲突引发的问题。

但是虚拟机是非常耗资源的,比如我电脑 16G 的内存。但是虚拟机多开几个的话,电脑就会明显感觉到很卡,而且内存有点吃不消。每一个虚拟机都是要运行一个操作系统实例的,要占用内存、CPU,所以对性能影响比较大。

而 Docker 则是一个更为轻量级的选择,它不需要启动一个完整的操作系统实例。容器可以共享主机的操作系统内核,可以节省很多资源。

1. Docker 核心概念

Docker 涉及到的概念也不是特别多,主要是下面几个。

  • 镜像 ( Image ) : 镜像是创建一个 Docker 容器的模式,镜像里面包括了应用程序以及运行需要的依赖。 可以简单的理解为镜像就是操作系统镜像 *.ISO 文件,通过这个文件可以实例化多个虚拟机系统。
  • 容器 ( Container ) : 容器就是镜像的运行实例,它有自己的文件系统、网络、进程等。 可以简单的理解为就是一个虚拟机实例。
  • Dockerfile : 这是一个配置文件,配置文件里面包含了一系列的指令,这是用来构建 Docker 镜像的。
  • Docker Hub: Docker 官方的镜像仓库,可以从这上面下载别人共享的镜像,也可以将自己封装好的镜像上传到这上面。

2. 安装

这里以 Ubuntu 16.04 为例。

  • 添加 Docker存储库的 GPG 密钥
  curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  • 添加 Docker 的仓库源地
  sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  • 更新系统
  sudo apt-get update
  • 开始安装
  sudo apt-get install -y docker-ce
  • 安装完后会自动启动,检查下 Docker 的启动状态。
  sudo systemctl status docker
  • 默认运行 Docker 需要 root 权限,如果你没有添加 sudo 来执行 Docker 命令的就会看到下面的提示
  docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.See 'docker run --help'.
  • 直接将用户名添加到 docker 组即可解决这个问题
  sudo usermod -aG docker ${USER}
  • 重新注销登录下,就可以直接执行 docker 命令。验证下 Docker 的版本号
  docker --version

3. 快速体验

Docker 官方提供了一个很简单的 HelloWorld 例子,执行下面的命令体验。

$ docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/


看到上面这段提示就说明第一个 Docker 的 HelloWorld 已经跑通了。

这个例子还不能证明什么,再来看看一个快速部署 nginx 的例子:

# 拉取 nginx 最新版本的镜像
docker pull nginx

# 运行 nginx 容器
docker run --name my-test-nginx -d -p 8081:80 nginx

运行后,打开浏览器,直接访问 http://localhost:8081/ ,你就可以看到 Nginx 的提示页面了。

Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

通过这个 Nginx 的例子可以看到,部署一个这样的软件实例变得特别的简单,特别的快速,这就是 Docker 带来的全新体验。

4. 常用的语法

Docker 使用起来不是很复杂,只需要稍微掌握一些命令就可以满足大部分的使用场景。

4.1 拉取镜像

拉取镜像是最常用的一个命令之一了。通过这个命令可以拉取公网或者内网中的 Docker 镜像。

docker pull [镜像名称]:[标签]

比如我们要拉取一个 Nginx 的最新版本的话,这么写:

docker pull nginx:latest

4.2 查看本地的镜像列表

docker images

4.3 删除镜像

注意如果镜像被引用的话,不能直接删除。

docker rmi [镜像ID或名称]

4.4 创建并运行容器

这个命令也是常用的一个命令。

docker run [选项] [镜像名称] [命令]

常用的选项:

  • -d: 后台运行,不指定就会以前台模式运行。
  • -p: 端口映射,比如 -p 8080:80 会将主机的 8080 端口映射到容器的 80 端口。
  • –name: 指定容器名称,如果不指定名称的话,容器会有一个随机的名字。
  • -e:设置环境变量。 比如 -e PASSWORD=my-secret 设置了 PASSWORD 环境变量。
  • -v:设置挂载卷,可以让主机目录挂载到容器里面去,这样容器就可以操作这个目录,达到数据持久化目的。比如 -v /mydata:/data 将主机的 /mydata 目录挂载到容器的 /data 目录。
  • –rm:这个配置让容器在停止后自动删除,适合一次性的任务。
  • –restart :容器重启策略。 有这几个选项:
    • no: 容器停止后不会重启(默认)。
    • on-failure: 仅在容器异常退出时重启。
    • unless-stopped: 除非手动停止,否则总是重启容器。
    • always: 无论退出原因,始终重启容器。

比如之前跑的 nginx 容器就是比较常见的一条命令:

docker run --name my-test-nginx -d -p 8081:80 nginx

4.5 启动容器

docker start (容器ID或名称)

4.6 停止容器

docker stop (容器ID或名称)

4.7 重启容器

docker restart (容器ID或名称)

4.8 查看正在运行的容器

docker ps

4.9 删除容器

docker rm (容器ID或名称)

注意正在运行的容器不可以直接删除。

4.10 查看容器日志

docker logs (容器ID或名称)

跟 linux tail 命令一样,加 -f 可以实时刷新日志。

docker logs -f (容器ID或名称)

4.11 查看容器的详细信息

docker inspect (容器ID或名称)

4.12 进入容器的内部

docker exec -it (容器ID或名称) /bin/bash

基本上上面的命令掌握了,Docker 的基本使用就不会有太大的问题。