Docker

安装

#预备
apt-get update && apt-get install -y wget vim

海外服务器

#安装docker
wget -qO- get.docker.com | bash

#卸载docker
sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
#安装docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

大陆服务器

#安装docker
curl -sSL https://get.daocloud.io/docker | sh
#安装docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.1.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

#卸载docker
sudo apt-get remove docker docker-engine
rm -fr /var/lib/docker/

简介

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

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

​ Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

Docker 容器通过 Docker 镜像来创建。

容器与镜像的关系类似于面向对象编程中的对象与类。

Docker使用

Hello World

docker run ubuntu:15.10 /bin/echo "Hello world"
#or
docker run hello-world

Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo “Hello world”,然后输出结果

docker ps查看容器详情

CONTAINER ID: 容器 ID。

IMAGE: 使用的镜像。

COMMAND: 启动容器时运行的命令。

CREATED: 容器的创建时间。

STATUS: 容器状态。

​ 状态有7种:

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

PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。

NAMES: 自动分配的容器名称。

docker logs 命令,查看容器内的标准输出

docker logs 容器id
docker logs 容器name
docker stop 容器id
docker stop 容器name

容器使用

#查看所有命令选项
docker
#了解指定的 Docker 命令使用方法
docker command --help
#拉取镜像
docker pull ubuntu
#使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器
docker run -it ubuntu /bin/bash
#exit退出
exit
  • -i: 交互式操作。
  • -t: 终端。
  • -d 参数后台运行,默认不会进入容器,想要进入容器需要使用指令 docker exec
  • ubuntu: ubuntu 镜像。
  • /bin/bash:放在镜像名后的是命令,交互式 Shell,因此用的是 /bin/bash。
#后台运行
docker run -itd --name ubuntu-test ubuntu /bin/bash
#停止容器
docker stop <容器 ID>
#重启容器
docker restart <容器 ID>
#如果从这个容器退出,会导致容器的停止
docker attach 1e560fca3906
#如果从这个容器退出,容器不会停止
docker exec -it 243c32535da7 /bin/bash
#导出容器 1e560fca3906 快照到本地文件 ubuntu.tar
docker export 1e560fca3906 > ubuntu.tar

#使用 docker import 从容器快照文件中再导入为镜像,将快照文件 ubuntu.tar 导入到镜像test/ubuntu:v1:
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
#通过指定 URL 或者某个目录来导入
docker import http://example.com/exampleimage.tgz example/imagerepo

#删除容器
docker rm -f 1e560fca3906
#清理掉所有处于终止状态的容器
docker container prune
# 载入镜像
docker pull training/webapp  

docker run -d -P training/webapp python app.py
docker run -d -p 5000:5000 training/webapp python app.py

#查看WEB应用程序日志
docker logs -f bf08b7f2cd89
#查看容器内部运行的进程
docker top wizardly_chandrasekhar
#查看容器的配置和状态信息
docker inspect wizardly_chandrasekhar

**-P:**将容器内部使用的网络端口随机映射到我们使用的主机上,也可以指定端口

-p: 本地端口:容器端口

-f:docker logs 像使用 tail -f 一样来输出容器内部的标准输出。

docker ps 命令可以查看到容器的端口映射

docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号

镜像使用

docker images 来列出本地主机上的镜像

  • **REPOSITORY:**表示镜像的仓库源
  • **TAG:**镜像的标签
  • **IMAGE ID:**镜像ID
  • **CREATED:**镜像创建时间
  • **SIZE:**镜像大小
#拉取镜像
docker pull ubuntu:13.10
#查找镜像
docker search httpd
#运行镜像
docker run httpd
#删除镜像
docker rmi hello-world

NAME: 镜像仓库源的名称

DESCRIPTION: 镜像的描述

OFFICIAL: 是否 docker 官方发布

stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。

AUTOMATED: 自动构建。

创建镜像

修改镜像

#创建容器
docker run -t -i ubuntu:15.10 /bin/bash
#进入容器修改后
#提交容器
docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
  • -m: 提交的描述信息
  • -a: 指定镜像作者
  • **e218edb10161:**容器 ID
  • runoob/ubuntu:v2: 指定要创建的目标镜像名

docker images可以看到新的镜像

#使用新镜像 runoob/ubuntu 来启动一个容器
docker run -t -i runoob/ubuntu:v2 /bin/bash

构建镜像

使用命令 docker build , 从零开始来创建一个新的镜像。为此,需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建镜像。

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的

FROM 构建镜像基于哪个镜像
MAINTAINER 镜像维护者姓名或邮箱地址
RUN 构建镜像时运行的指令
CMD 运行容器时执行的shell环境
VOLUME 指定容器挂载点到宿主机自动生成的目录或其他容器
USER 为RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户
WORKDIR 为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录
HEALTHCHECH 健康检查
ARG 构建时指定的一些参数
EXPOSE 声明容器的服务端口(仅仅是声明)
ENV 设置容器环境变量
ADD 拷贝文件或目录到容器中,如果是URL或压缩包便会自动下载或自动解压
COPY 拷贝文件或目录到容器中,跟ADD类似,但不具备自动下载或解压的功能
ENTRYPOINT 运行容器时执行的shell命令
  • CMD 在docker run 时运行。
  • RUN 是在 docker build。

菜鸟教程

FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D
#docker build 命令来构建一个镜像
docker build -t runoob/centos:6.7 .
  • -t :指定要创建的目标镜像名
  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

设置镜像标签

# 镜像ID 用户名称/镜像源名:标签名(tag)
docker tag 860c279d2fec runoob/centos:dev

容器连接

#默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp
docker run -d -p 5000:5000 training/webapp python app.py
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
#使用 --name 标识来命名容器
docker run -d -P --name runoob training/webapp python app.py

新建网络

#创建一个新的 Docker 网络
docker network create -d bridge test-net

-d:参数指定 Docker 网络类型,有 bridge、overlay

docker run -itd --name test1 --network test-net ubuntu /bin/bash
docker run -itd --name test2 --network test-net ubuntu /bin/bash

#可以相互ping到
apt-get update
apt install iputils-ping
#指定容器DNS
docker run -it --rm -h host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu

–rm:容器退出时自动清理容器内部的文件系统。

-h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。

–dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。

–dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com

如果在容器启动时没有指定 –dns–dns-search,Docker 会默认用宿主主机上的 /etc/resolv.conf 来配置容器的 DNS

主机dns配置: /etc/docker/daemon.json

{
  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]
}

仓库管理

#登录需要输入用户名和密码,可以从 docker hub 上拉取自己账号下的全部镜像
docker login
#退出
docker logout
#推送镜像
docker tag ubuntu:18.04 username/ubuntu:18.04
docker push username/ubuntu:18.04
docker search username/ubuntu

Docker Compose

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。

菜鸟教程

#后台运行容器
docker-compose up -d

Docker Machine

Docker Machine 是一种可以在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机

base=https://github.com/docker/machine/releases/download/v0.16.0 &&
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
  sudo mv /tmp/docker-machine /usr/local/bin/docker-machine &&
  chmod +x /usr/local/bin/docker-machine
#列出可用的机器
$ docker-machine ls
#创建一台名为 test 的机器 --driver:指定用来创建机器的驱动类型,这里是 virtualbox
$ docker-machine create --driver virtualbox test
#查看机器的 ip
$ docker-machine ip test
#停止机器
$ docker-machine stop test
#启动机器
$ docker-machine start test
#进入机器
$ docker-machine ssh test

命令

ps

$docker ps [OPTIONS]

OPTIONS说明:

  • **-a 😗*显示所有的容器,包括未运行的。
  • **-f 😗*根据条件过滤显示的内容。
  • **–format 😗*指定返回值的模板文件。
  • **-l 😗*显示最近创建的容器。
  • **-n 😗*列出最近创建的n个容器。
  • **–no-trunc 😗*不截断输出。
  • **-q 😗*静默模式,只显示容器编号。
  • **-s 😗*显示总的文件大小

inspect

$docker inspect [OPTIONS] NAME|ID [NAME|ID...]

OPTIONS说明:

  • **-f 😗*指定返回值的模板文件。
  • **-s 😗*显示总的文件大小。
  • **–type 😗*为指定类型返回JSON。

kill

docker kill :杀掉一个运行中的容器

$docker kill [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

  • **-s 😗*向容器发送一个信号

rm

$docker rm [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

  • **-f 😗*通过 SIGKILL 信号强制删除一个运行中的容器。
  • **-l 😗*移除容器间的网络连接,而非容器本身。
  • **-v 😗*删除与容器关联的卷。

pause/unpaus

docker pause :暂停容器中所有的进程。

docker unpause :恢复容器中所有的进程。

exec

$docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

OPTIONS说明:

  • **-d 😗*分离模式: 在后台运行
  • **-i 😗*即使没有附加也保持STDIN 打开
  • **-t 😗*分配一个伪终端

top

查看容器中运行的进程信息,支持 ps 命令参数

$docker top [OPTIONS] CONTAINER [ps OPTIONS]

info

显示 Docker 系统信息,包括镜像和容器数。。

$docker info [OPTIONS]