背景

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

Docker的应用场景

  • Web 应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

docker 安装

Docker 的旧版本被称为 dockerdocker.iodocker-engine 。如果已安装,请卸载它们:

  1. sudo apt-get remove docker docker-engine docker.io containerd runc

首先安装依赖:

  1. sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common

添加信任 Docker 的 GPG 公钥:

  1. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

对于 amd64 架构的计算机,添加软件仓库:

  1. sudo add-apt-repository \
  2. "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
  3. $(lsb_release -cs) \
  4. stable"

最后安装

  1. sudo apt-get update
  2. sudo apt-get install docker-ce
  1. docker --version
  2. ## Docker version 19.03.11, build 42e35e61f3

Hello world

Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。

  1. docker run ubuntu:15.10 /bin/echo "Hello world"
  2. ## hello world

参数解析:

  • docker : Docker 的执行命令
  • run : 与docker命令组合运行一个特定的容器
  • ubuntu:15.10 : 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
  • /bin/echo “Hello world” : 在启动的容器里执行的命令

连起来就是:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。

交互运行

  1. ubuntu@VM-0-11-ubuntu:~$ sudo docker run -i -t ubuntu:15.10 /bin/bash
  2. root@2401df9ef044:/#
  • -t: 在新容器内指定一个伪终端或终端。
  • -i: 允许你对容器内的标准输入进行交互。

通过运行 exit 命令或者使用 CTRL+D 来退出容器。

后台运行

  1. ubuntu@VM-0-11-ubuntu:~$ sudo docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
  2. 9db349c972802d3a7627b27d3c9eb0c58888ad0c80a001b5d7e6f08813eed876

输出的长字符串叫做容器 ID,对每个容器来说都是唯一的,我们可以通过容器 ID 来查看对应的容器发生了什么

可以通过 docker ps 来查看容器的运行情况

  1. ubuntu@VM-0-11-ubuntu:~$ sudo docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 9db349c97280 ubuntu:15.10 "/bin/sh -c 'while t…" 11 seconds ago Up 10 seconds tender_black

输出详情介绍:

  • CONTAINER ID: 容器 ID。
  • IMAGE: 使用的镜像。
  • COMMAND: 启动容器时运行的命令。
  • CREATED: 容器的创建时间。
  • STATUS: 容器状态。
  • PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
  • NAMES: 自动分配的容器名称。

docker 运行有七种状态

  • created(已创建)
  • restarting(重启中)
  • running(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

使用docker logs查看输出结果

  1. ubuntu@VM-0-11-ubuntu:~$ sudo docker logs tender_black
  2. hello world

使用docker stop停止容器

  1. ubuntu@VM-0-11-ubuntu:~$ sudo docker stop tender_black
  2. tender_black

docker 用户

docker进程使用Unix Socket而不是TCP端口。而默认情况下,Unix socket属于root用户,需要root权限才能访问。

解决方案:

  1. 使用sudo获取管理员权限,运行docker命令
  2. docker守护进程启动的时候,会默认赋予名字为docker的用户组读写Unix socket的权限,因此只要创建docker用户组,并将当前用户加入到docker用户组中,那么当前用户就有权限访问Unix socket了,进而也就可以执行docker相关命令
    1. sudo groupadd docker #添加docker用户组
    2. sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
    3. newgrp docker #更新用户组
    4. docker ps #测试docker命令是否可以使用sudo正常使用